??xml version="1.0" encoding="utf-8" standalone="yes"?>懂色av影视一区二区三区,欧美精品羞羞答答,亚洲免费二区http://www.aygfsteel.com/zhqh/category/33756.htmlmyjavazh-cnThu, 29 Oct 2009 19:26:42 GMTThu, 29 Oct 2009 19:26:42 GMT60面向对象之认?/title><link>http://www.aygfsteel.com/zhqh/articles/300126.html</link><dc:creator>zhqh</dc:creator><author>zhqh</author><pubDate>Thu, 29 Oct 2009 00:49:00 GMT</pubDate><guid>http://www.aygfsteel.com/zhqh/articles/300126.html</guid><wfw:comment>http://www.aygfsteel.com/zhqh/comments/300126.html</wfw:comment><comments>http://www.aygfsteel.com/zhqh/articles/300126.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/zhqh/comments/commentRss/300126.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/zhqh/services/trackbacks/300126.html</trackback:ping><description><![CDATA[        很多书上?x)写着Q对象是h数据以及(qing)对这些数据提供的操作的集合。这是一个极光误的认识。这里的对象可以单理解ؓ(f)cM于现实生zM的对象,生活中是以对象ؓ(f)个体Qƈ且不同对象间通过发送消息作Z沟通方式。例如,C会(x)的交换活动,M人都是通过发送消息到另一个对象去h其所提供的某U服务。整个面向对象系l就是以对象间的互相交互Q协作Ş成的一个运行系l?至于c,只是 同种性质的对象的抽象体,是一个抽象概念,它只是用来让~译器认识的?br />         每一个对象都提供某些服务Q当焉是以Ҏ(gu)的Ş式存在。而且Q这些服务可能同旉要一些数据信息,q两U即构成了对象对外提供服务的基础。也是最常见的。那U理解ؓ(f)先有数据信息Q再由服务是不对的,否则Q将难于q行对象抽象以及(qing)设计。而且Q这些方法不是专为数据服务或者说外界q不是ؓ(f)了访问数据,而时q些数据Ҏ(gu)服务的需要决定需要什么数据信息以?qing)如何暴露数据信息。与此相反的讉K方式Q抽象数据结构是个典型,q种方式以数据位中心Qƈ不是面向对象的核心所在?面向对象的核心是整个世界的写作过E,是以服务为基矻I它ƈ不是以数据位中心Q而是以服务ؓ(f)中心Q各对象通过接口暴露自己的服务,为外界提供服务。这也是面向接口~程的主旨。所以面向对象应该是先有对象行ؓ(f)Q而这些数据时反过来ؓ(f)q些行ؓ(f)提供数据基础信息Qؓ(f)之提供数据服务的。这与传l的ADTQ数?Ҏ(gu)据的操作Ҏ(gu)时截然不同的Q尽其l构?qing)其怼Q它是方法依赖于数据?br />         Zq些原因Q一个无数据的对象出现时很正常的Q而且是占据很大部分。这些对象称之ؓ(f)无状态对象。即两个同类对象Q其行ؓ(f)时完全一L(fng)Q因为已l少了特定数据信息的依赖关系。现实生zM也确实存在这cd提供服务的对象,该对象提供的服务本n互相依赖Q或同类Q或是以某种一致的方式向外提供服务。而在面向对象的系l中Q这U无状态服务对象是Z业务需求而定的。同L(fng)对象Q在一U业务系l中Q它是有状态对象,需要某些依赖信息,而在另一个系l中Q可能就以无状态对象出玎ͼ外界q不x其数据,而只是想获取其服务,q时q些数据信息q不存在意义Q尽它可以被保留住Q对象里的服务于数据Q存在服务依赖于数据Q以?qing)不依?U关pR然后,大部分是有依赖关pȝQ对于无状态对象,?U处理方式,其一Q既然无状态,则可分布臛_自不同的UtilcMQ如<br /> class A {<br />     sourt(..);<br />     run(..);<br />     study(..);<br /> }<br /> q里A的Q何对象都是无状态的对象Q则应放入不同UtilcMq以static修饰它。这U无状态类是不应该被设计的Q因Z充满了大杂烩的坏味道。职责不明确Q更不用提SRP了。ƈ且给q种cd名也是一个大问题。再看,<br /> class OrderService {<br />     add(...);<br />     remove(...);<br />     update(...);<br /> }<br /> q个OrderService的一个实例,同样时无状态对象,然而这是一个合理的设计。因为其很好的吻合了对象的语义所在。提供了一l一_(d)互相合作Q同cL务的服务方式?br /> 有时?x)有很多对象Q其提供服务时相同的Q但是其具体实现的内部细节不同,?<br /> Zclass RemoteOrderService, class LocalOrderService所生成的对象,而且是很常见的,且其依赖的数据信息时不同的,q在生活中很存在的合理性。如<br /> RunnerA {<br />     run(...){<br />         使用拖鞋?br />     }<br /> }<br /> RunnerB {<br />     run(...){<br />         使用自行车跑<br />     }<br /> }<br /> 然而,我们无论创徏RunnerAq是RunnerB的对象,我们都不兛_其实现细节,也就是我们根本不兛_内部数据的依赖细节,我们只关心其为我们提供的服务Q它能我从一个地方到辑֏一个地斏V因而,其数据对我们而言是透明的。我Ҏ(gu)不想知道Q你是用什么数据,怎么run的。因而这U基于服务提供的方式Q得我们用了一个只包含所提供服务的类型Runner。ƈ且在我们看来Q它隐藏了提供的服务的实现细节,q就是接口?br /> interface Runner{<br />     run(..);<br /> }<br /> 而多态的性质Q这时发挥了很好的作用。Ş成了一个种Ҏ(gu)的依赖关p,此时Qclient与Runner的依赖关p远q强于Runner与其实现cȝ依赖关系。这也就是面向对象几大原则之一的DIP了?br /> 因此Q面向对象系l本质是以接口ؓ(f)核心的系l,每个接口׃替一个ServiceProvider, 然后Q发送消息请求构成了一个协作系l网?br />         而另一U极端,是对象无行为。当?dng)其是有状态对象。这些对象都是不同的Q尽他们同属一cR这U对象的出现Q得面向对象的语义受到了很大的冲击。因U脱M对象是以服务为核心的语义。一个对象没了方法,那还谈什么服务。然后,现实生活中的是有些东西是无服务的,例如book, 而这U被UCؓ(f)实体对象。这里ƈ不是说该实体真的无服务,而是其所提供的服务其实是无用的,或无意义的。因此,宁愿其行ؓ(f)全部去除以保持其整洁Q又不至于冗余。因同样取决于业务系l的需求。这一U情形被UCؓ(f)贫血模型Q即不具行ؓ(f)之对象。不血与否Q其设计h于业务系l的需求。设计是多种多样的的Q面向对象本w要求从问题领域中提取对象是仉事,同时对象的职责分配更是一仉事。所以,出现了许多关于这斚w的方法论Q如CRCQ?信息专家{职责分配方法以?qing)大量面向对象设计原则,设计模式{等。因而,面向对象设计本n是一门高q学问。ƈ且取决于个h的经验以?qing)知识面Q处理业务,分析Q解军_U问题的思想Q特别是Z某特定领域的业务l验?br />         我们发现了再生活中的不基于服务的Q不Z消息发送请求服务的对象Q我们仅仅能说这些对象不直接参与对象协作|。因为没透过该网享受或请求到某种服务。但是,它是作ؓ(f)一U间接写作者出玎ͼ它作为其他对象间的请求服务的一U辅助,好比交换系l中的物品,它是在服务对象间的请求链中流通,而流通过E中Q没有一个h?x)把h发向该物品,他们可以持有它或通它。当?dng)有可能在通中Q稍微检查物品是否合法等。而这时该物品也仅仅提供了合法(g)查服务而已。跟Z对象服务的协作网是大巫了。呵c(din)?br />         Ҏ(gu)面向对象设计原则以及(qing)l验的权衡作出合理的设计时必需的。在q些不同的对象类型中Q最Ҏ(gu)被发现ƈ提取的就是,贫血模型的对象。因Z直接反应世界Q不是只有程序员能想刎ͼ而是生活中的所有h都懂。这是面向对象的好处。在业务领域中,业务专家起到了相当重要的作用。这是面向对象的好处。在业务领域中,业务专家起到了相当重要的作用。如Q图书管理系l,大家都会(x)惛_实体c,如book, student, library{等。这些就是不提供服务的对象。而且q些信息基本都会(x)被持久化qDB或其他地方,散发着某些DB的味道,因而这些对象一旦被冠以DB味道后,大多Ch的初衷发生了微妙的变化,他们把设计的焦点转向了DBQ而远q脱M他原本想做的Z面向对象的设计,久而久之,很多Z(fn)惯了ZDB的设计,一个系l一上来开始徏立表。把所以业务逻辑寄托在DBw上。所以,DB责Q之大可想而知。因为面向对象设计与之相比是何等之难。这时候,所有的业务逻辑都依赖于DBQ整个业务系l设计严重侧向DBQ一些以表ؓ(f)核心。从一个表能看出所有业务,因ؓ(f)Z太习(fn)惯于x信息了,而且DB是基于二l表的,从小学就学过Q极其容易,理层的家伙们很Ҏ(gu)明白Q这时管理层也参与了目讨论Q很好。对着那些表,指着点着。这是技术?br /> <img src ="http://www.aygfsteel.com/zhqh/aggbug/300126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/zhqh/" target="_blank">zhqh</a> 2009-10-29 08:49 <a href="http://www.aygfsteel.com/zhqh/articles/300126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>贫血的领域模?/title><link>http://www.aygfsteel.com/zhqh/articles/293205.html</link><dc:creator>zhqh</dc:creator><author>zhqh</author><pubDate>Sun, 30 Aug 2009 09:41:00 GMT</pubDate><guid>http://www.aygfsteel.com/zhqh/articles/293205.html</guid><wfw:comment>http://www.aygfsteel.com/zhqh/comments/293205.html</wfw:comment><comments>http://www.aygfsteel.com/zhqh/articles/293205.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/zhqh/comments/commentRss/293205.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/zhqh/services/trackbacks/293205.html</trackback:ping><description><![CDATA[<p>转蝲?a href="http://www.aygfsteel.com/wadise/archive/2005/12/16/24209.html">http://www.aygfsteel.com/wadise/archive/2005/12/16/24209.html</a><br /> 在Martin Fowler文章http://www.martinfowler.com/bliki/AnemicDomainModel.html中指出现在出现越来越多的贫血领域模型(anemia domain model)。那么血领域模型的概忉|什么呢Q老马指出Q?/p> <p>There are objects, many named after the nouns in the domain space, and these objects are connected with the rich relationships and structure that true domain models have. The catch comes when you look at the behavior, and you realize that there is very little behavior on these objects. Indeed often these models come with design rules that say that you are not to put any domain logic in the the domain objects. Instead there are a set of service objects which capture all the domain logic. These services live on top of the domain model and use the domain model for data.</p> <p>也就是说在领域模型中Q本w只处理很少的行为逻辑Q大多数都是处在模型上层的一pd的ServicecL负责捕获处理q些领域逻辑行ؓ(f)。这q背了OO思想QOO认ؓ(f)应该把数据和行ؓ(f)合在一P?/p> <p>Eric Evans在他的Domain Driven Design中说q:(x)</p> <p>Application Layer [his name for Service Layer]: Defines the jobs the software is supposed to do and directs the expressive domain objects to work out problems. The tasks this layer is responsible for are meaningful to the business or necessary for interaction with the application layers of other systems. This layer is kept thin. It does not contain business rules or knowledge, but only coordinates tasks and delegates work to collaborations of domain objects in the next layer down. It does not have state reflecting the business situation, but it can have state that reflects the progress of a task for the user or the program.<br /> Domain Layer (or Model Layer): Responsible for representing concepts of the business, information about the business situation, and business rules. State that reflects the business situation is controlled and used here, even though the technical details of storing it are delegated to the infrastructure. This layer is the heart of business software.</p> <p> </p> <p>据说在Thoughtwork公司里面采用的技术是Hibernate+Spring+webworkQ关于anemia domain model有不员工在公司内部邮g中发问老马应该什么正用。但是老马q没有给出确切答案,只放入TODOList厅R?br /> 我个的DomailcM不应该含有过多的与之无关的行为,不但q反了单一职责的原则,q得整个系l不够稳定。例如User中有RolesQ那么addRole,removeRole自然应在DomaincUser中写Q至于removeUser,loadUser{应该封装成Daod理?/p> <p>引用robbin在一ơ讨Z的回复:(x)</p> <p>我的理解是Martin大叔所谓的domain object?#8220;领域模型”Q它是一个针对业务逻辑抽象的模型,和Y件编E根本毫无关pR即使你不开发这个YӞ你仍焉要抽象你的业务逻辑得到你的领域模型。这个领域指的是你所从事的行业,而不是狭隘的持久化类?</p> <p>q且领域模型的徏模也是在需求分析阶D,或者在需求分析阶D之前完成的事情。具体到~程的过E中Q领域模型ƈ非对应某一个Javac,如果一定要对应的话Q(业务对象QDao接口QHibernate实体c)他们合v来统U领域模型在Java语言的实现。把 商业建模范畴?#8220;领域模型”拿来当做Hibernate~程中的实体c,Ҏ(gu)是牛头不对马嘴!</p> <p>其实你的d是把持久化实体cȝ持久化操作附着到实体类上面去,而不是分开。D例来_(d)也就是说Accountcȝ增删Ҏ(gu)不应该单独分dAccountDao接口去,而应该把增删Ҏ(gu)操作攑֜Accountc里面来完成Q对不? </p> <p>那么我在解释q个问题之前Q必L清一点,是q个问题的讨论,x久化操作是否应该单独抽象一个DAO层的问题是和Martin Fowler提到了血的领域模型毫无关pȝ。实际上传统的Entity Bean是q种把持久化操作附着到Entity Bean本nȝQ但是Martin Fowler一样在_(d)q种Entity Bean是贫血的?</p> <p>好了Q我们现在把其他无关因素排除了,focus到这个话题上Q就是我们是否需要DAO接口的问题了。因为按照你的观点,如果把对象的增删Ҏ(gu)都放在实体类上面Q其实我们就不需要DAO接口层了Q业务对象和W(xu)eb Action都可以直接调用实体类本n来完成持久化操作了?</p> <p>大概?003q以前,我一直就是采用这U模型的Q但是从2003q开始,我就Ҏ(gu)了分M个DAO层来专门处理持久化操作了。原因是多方面的Q从技术角度来考量的话Q分d有很多好处,Rod Johnson在《without EJB》第10章持久化里面pl阐qC需要DAO层的理由Q我你看一下,q里不复qC。只谈一下除了Rod Johson提到理由之外的理由:(x) </p> <p>作ؓ(f)保持状态的实体c,他的职责是保持状态,而不负责状态的持久化。如果把持久化操作也攑֜实体cMQ一斚w来说Q把两种不同的职责放在一个类中,q不W合OCP的单一职责的原则,然而更重要的原因是?x)带来实体类的不E_的问题?</p> <p>在我的理念中Q实体类以及(qing)实体cd联关pL一个Y件系l中最E_不变的部分,在整个Y件系l中Q各个层面都需要涉?qing)到实体cȝ操作Q如何划分实体类Q以?qing)确定实体类兌是最费考量的,定了这一点,整个软gpȝ底层依赖关pd被确定下来了Q实体类的属性可以变化,׃软gpȝ对实体的操作都是以实体类为单位的Q所以实体属性的变化不会(x)造成pȝ不稳定)Q上面的DAO层,业务层,W(xu)eb层都只对实体cM生单向依赖?</p> <p>如果你把DAO层合q到实体cMQ请注意本来Web层是不依赖于DAO层的QW(xu)eb层只依赖实体c(因ؓ(f)它要展现实体cȝ态)Q但是由于你合ƈ了,使得Web层也变得依赖那些DAO层的操作了。这L(fng)l果是让Y件系l的耦合性提高,可׾~性降低,可维护性降低?</p> <p>DAO层的变动是大于实体类变动的,实体cd本上E_不变Q而Y件系l的需求变更几乎一定会(x)带来DAO层的变动Q但是ƈ不会(x)带来实体cd的变动(?x)带来实体属性的变动Q但是很会(x)影响到实体类本nQ。所以DAO层的变动频率q远大于实体cR那么当你把DAO层操作合q到实体cM后,其结果就是让实体cȝ变动频率{于DAO层的变动频率。那么就?x)造成本来E_的实体类层变得变得频率高了很多,而实体类的变动会(x)波及(qing)到Y件系l的每个层面Q造成软g大面U的相关性和不稳定?</p> <p>误住很重要的一点:(x)实体cL有状态的c,DAOcL无状态的c,在整个Y件系l中Q只有两U类有状态,一个是实体c,一个是HTTP Session。有状态的cM(x)带来很高的代码相x,应该量减少有状态类的媄(jing)响范_(d)量减少有状态类的变动频率,应该量减少有状态类的职责?</p> <p>而你把DAO操作合ƈ到实体类以后Q结果就是扩大了有状态类的代码相x的范围和媄(jing)响范_(d)扩大了有状态类的变动频率,最后就造成软gpȝ的稳定性下降?br /> </p> <img src ="http://www.aygfsteel.com/zhqh/aggbug/293205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/zhqh/" target="_blank">zhqh</a> 2009-08-30 17:41 <a href="http://www.aygfsteel.com/zhqh/articles/293205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>titlthttp://www.aygfsteel.com/zhqh/articles/237137.htmlzhqhzhqhTue, 28 Oct 2008 08:01:00 GMThttp://www.aygfsteel.com/zhqh/articles/237137.htmlhttp://www.aygfsteel.com/zhqh/comments/237137.htmlhttp://www.aygfsteel.com/zhqh/articles/237137.html#Feedback0http://www.aygfsteel.com/zhqh/comments/commentRss/237137.htmlhttp://www.aygfsteel.com/zhqh/services/trackbacks/237137.html// Code #01

private string m_Location;
public string Location
{
    
get return m_Location; }
    
internal set { m_Location = value; }
}


public void Boil()
{
    Console.WriteLine(
"Boiling at Room {0}...", m_Location);
}


public final class ArrayUtil {
 
 private ArrayUtil(){
 }
 /**
  * Code shared by RegressionLine and WeightedAverage to discard prefix-zeros of array.
  * if all the elems of array are zero, return null.
  */
 public static double[] discardPrefixZero(double[] data){
  int firstNoZeroIndex = -1;
  for(int i=0;i<data.length;i++) {
   if(data[i] == 0d) {
    continue;
   }
   else{
    firstNoZeroIndex = i;
    break; 
   }

  }
  if(firstNoZeroIndex == -1)
   return null;
  double[] data2 = new double[data.length-firstNoZeroIndex];
  System.arraycopy(data, firstNoZeroIndex, data2, 0, data.length-firstNoZeroIndex);
  return data2;
 }

}


zhqh 2008-10-28 16:01 发表评论
]]>
վ֩ģ壺 ˳| | | ʡ| ǭ| Ҷ| | | | | | | | | | | | | ʯ| Ȫ| | | | | ͨ| | | İ| | ƽ| ԭ| ѧ| ƽȪ| | ʲ| Ͼ| ղ| | | | ߴ|