函数ood怎么判断函数的奇偶性奇偶

如何向妻子解释OOD
  此文译自CodeProject上&&一文,该文章在Top Articles上排名第3,读了之后觉得非常好,就翻译出来,供不想读英文的同学参考学习。
  作者(Shubho)的妻子(Farhana)打算重新做一名软件工程师(她本来是,后来因为他们孩子出生放弃了),于是作者就试图根据自己在软件开发设计方面的经验帮助她学习面向对象设计(OOD)。
  自作者从事软件开发开始,作者常常注意到不管技术问题看起来多复杂,如果从现实生活的角度解释并以对答的方式讨论,那么它将变得更简单。现在他们把在OOD方面有些富有成效的对话分享出来,你可能会发现那是一种学习OOD很有意思的方式。
  下面就是他们的对话:
Shubho:亲爱的,让我们开始学习OOD吧。你了解面向对象原则吗?
Farhana:你是说封装,继承,多态对吗?我知道的。
Shubho:好,我希望你已了解如何使用类和对象。今天我们学习OOD。
Farhana:等一下。面向对象原则对面向对象编程(OOP)来说不够吗?我的意思是我会定义类,并封装属性和方法。我也能根据类的关系定义它们之间的层次。如果是,那么还有什么?
Shubho:问得好。面向对象原则和OOD实际上是两个不同的方面。让我给你举个实际生活中的例子帮你弄明白。
     再你小时候你首先学会字母表,对吗?
Farhana:嗯
Shubho:好。你也学了单词,并学会如何根据字母表造词。后来你学会了一些造句的语法。例如时态,介词,连词和其他一些让你能造出语法正确的句子。例如:
  "I" (代词) "want" (动词) "to" (介词) "learn" (动词) "OOD"(名词)。
看,你按照某些规则组合了单词,并且你选择了有某些意义的正确的单词结束了句子。
Farhana:OK,这意味着什么呢?
Shubho:面向对象原则与这类似。OOP指的是面向对象编程的基本原则和核心思路。在这里,OOP可以比作英语基础语法,这些语法教你如何用单词构造有意义且正确的句子,OOP教你在代 码中构造类,并在类里封装属性和方法,同时构造他们之间的层次关系。
Farhana:嗯..我有点感觉了,这里有OOD吗?
Shubho:马上就有答案。现在假定你需要就某些主题写几篇文章或随笔。你也希望就几个你擅长主体写几本书。对写好文章/随笔或书来说,知道如何造句是不够的,对吗?为了使读者能更轻
松的明白你讲的内容,你需要写更多的内容,学习以更好的方式解释它。
Farhana:看起来有点意思...继续。
Shubho:现在,如果你想就某个主题写一本书,如学习OOD,你知道如何把一个主题分为几个子主题。你需要为这些题目写几章内容,也需要在这些章节中写前言,简介,例子和其他段落。
你需要为写个整体框架,并学习一些很好的写作技巧以便读者能更容易明白你要说的内容。这就是整体规划。
  在软件开发中,OOD是整体思路。在某种程度上,设计软件时,你的类和代码需能达到模块化,可复用,且灵活,这些很不错的指导原则不用你重新发明创造。确实有些原则你已经在你的类和对象中已经用到了,对吗?
Farhana:嗯...有个大概的印象了,但需要继续深入。
Shubho:别担心,你马上就会学到。我们继续讨论下去。
为什么要OOD?
Shubho:这是一个非常重要的问题。当我们能很快地设计一些类,完成开发并发布时,为什么我们需要关心OOD?那样子还不够吗?
Farhana:嗯,我早先并不知道OOD,我一直就是开发并发布项目。那么关键是什么?
Shubho:好的,我先给你一句名言:
  走在结冰的河边不会湿鞋,开发需求不变的项目畅通无阻(Walking on water and developing software from a specification are easy if both are frozen)
  -Edward V. Berard
Farhana:你的意思是软件开发说明书会不断变化?
Shubho:非常正确!软件开发唯一的真理是“软件一定会变化”。为什么?
  因为你的软件解决的是现实生活中的业务问题,而现实生活中得业务流程总是在不停的变化。
  假设你的软件在今天工作的很好。但它能灵活的支持“变化”吗?如果不能,那么你就没有一个设计敏捷的软件。
Farhana:好,那么请解释一下“设计敏捷的软件”。
Shubho:"一个设计敏捷的软件能轻松应对变化,能被扩展,并且能被复用。"
并且应用好"面向对象设计"是做到敏捷设计的关键。那么,你什么时候能说你在代码中很好的应用了OOD?
Farhana:这正是我的问题。
Shubho:如果你代码能做到以下几点,那么你就正在OOD:
面向对象复用能以最小的代价满足变化不用改变现有代码满足扩展Farhana:还有?
Shubho:我们并不是孤立的。很多人在这个问题上思考了很多,也花费了很大努力,他们试图做好OOD,并为OOD指出几条基本的原则(那些灵感你能用之于你的OOD)。他们最终也确实总结出了一些通用的设计模式(基于基本的原则)。
Farhana:你能说几个吗?
Shubho:当然。这里有很多涉及原则,但最基本的是叫做SOLID的5原则(感谢Uncle Bob,伟大OOD导师)。
S = 单一职责原则 Single Responsibility Principle
O = 开放闭合原则 Opened Closed Principle
L = Liscov替换原则 Liscov Substitution Principle
I = 接口隔离原则 Interface Segregation Principle
D = 依赖倒置原则 Dependency Inversion Principle
接下去,我们会仔细探讨每一个原则。
单一职责原则
Shubho:我先给你展示一张海报。我们应当谢谢做这张海报的人,它非常有意思。
单一职责原则海报
它说:"并不是因为你能,你就应该做"。为什么?因为长远来看它会带来很多管理问题。
从面向对象角度解释为:"引起类变化的因素永远不要多于一个。"
或者说"一个类有且只有一个职责"。
Farhana:能解释一下吗?
Shubho:当然,这个原则是说,如果你的类有多于一个原因会导致它变化(或者多于一个职责),你需要一句它们的职责把这个类拆分为多个类。
Farhana:嗯...这是不是意味着在一个类里不能有多个方法?
Shubho:不。你当然可以在一个类中包含多个方法。问题是,他们都是为了一个目的。如今为什么拆分是重要的?
那是因为:
每个职责是轴向变化的;如果类包含多个职责,代码会变得耦合;Farhana:能给我一个例子吗?
Shubho:当然,看一下下面的类层次。当然这个例子是从Uncle Bob那里得来,再谢谢他。
违反单一职责原则的类结构图
这里,Rectangle类做了下面两件事:
计算矩形面积;在界面上绘制矩形;并且,有两个应用使用了Rectangle类:
计算几何应用程序用这个类计算面积;图形程序用这个类在界面上绘制矩形;这违反了SRP(单一职责原则);
Farhana:如何违反的?
Shubho:你看,Rectangle类做了两件事。在一个方法里它计算了面积,在另外一个方法了它返回一个表示矩形的GUI。这会带来一些有趣的问题:
在计算几何应用程序中我们必须包含GUI。也就是在开发几何应用时,我们必须引用GUI库;
图形应用中Rectangle类的变化可能导致计算几何应用变化,编译和测试,反之亦然;
Farhana:有点意思。那么我猜我们应该依据职责拆分这个类,对吗?
Shubho:非常对,你猜我们应该做些什么?
Farhana:当然,我试试。下面是我们可能要做的:
拆分职责到两个不同的类中,如:
Rectangle:这个类应该定义Area()方法;RectangleUI:这个类应继承Rectangle类,并定义Draw()方法。Shubho:非常好。在这里,Rectangle类被计算几何应用使用,而RectangleUI被图形应用使用。我们甚至可以分离这些类到两个独立的DLL中,那会允许我们在变化时不需要关心另一个就可以实现它。
Farhana:谢谢,我想我明白SRP了。SRP看起来是把事物分离成分子部分,以便于能被复用和集中管理。我们也不能把SRP用到方法级别吗?我的意思是,我们可以写一些方法,它们包含做很多事的代码。这些方法可能违反SRP,对吗?
Shubho:你理解了。你应当分解你的方法,让每个方法只做某一项工作。那样允许你复用方法,并且一旦出现变化,你能购以修改最少的代码满足变化。
开放闭合原则
Shubho:这里是开放闭合原则的海报
开放闭合原则海报
从面向对象设计角度看,它可以这么说:"软件实体(类,模块,函数等等)应当对扩展开放,对修改闭合。"
通俗来讲,它意味着你应当能在不修改类的前提下扩展一个类的行为。就好像我不需要改变我的身体而可以穿上衣服。
Farhana:有趣。你能够按照你意愿穿上不同的衣服来改变面貌,而从不用改造身体。你对扩展开放了,对不?
Shubho:是的。在OOD里,对扩展开发意味着类或模块的行为能够改变,在需求变化时我们能以新的,不同的方式让模块改变,或者在新的应用中满足需求。
Farhana:并且你的身体对修改是闭合的。我喜欢这个例子。当需要变化时,核心类或模块的源代码不应当改动。你能用些例子解释一下吗?
Shubho:当然,看下面这个例子。它不支持"开放闭合"原则。
违反开发闭合原则的类结构
你看,客户端和服务段都耦合在一起。那么,只要出现任何变化,服务端变化了,客户端一样需要改变。
Farhana:理解。如果一个浏览器以紧耦合的方式按照指定的服务器(比如IIS)实现,那么如果服务器因为某些原因被其他服务器(如Apache)替换了,那么浏览器也需要修改或替换。这确实很可怕!
Shubho:对的。下面是正确的设计。
遵循开放闭合原则的类结构
在这个例子中,添加了一个抽象的服务器类,客户端包含一个抽象类的引用,具体的服务类实现了抽象服务类。那么,因任何原因引起服务实现发生变化时,客户端都不需要任何改变。
这里抽象服务类对修改是闭合的,实体类的实现对扩展是开放的。
Farhana:我明白了,抽象是关键,对吗?
Shubho:是的,基本上,你抽象的东西是你系统的核心内容,如果你抽象的好,很可能在扩展功能时它不需要任何修改(就像服务是一个抽象概念)。如果在实现里定义了抽象的东西(比如IIS服务器实现的服务),代码要尽可能以抽象(服务)为依据。这会允许你扩展抽象事物,定义一个新的实现(如Apache服务器)而不需要修改任何客户端代码。
Liskov's 替换原则
Shubho:"Liskov's替换原则(LSP)"听起来很难,却是很有用的基本概念。看下这幅有趣的海报:
Liskov替换原则海报
这个原则意思是:"子类型必须能够替换它们基类型。"
或者换个说法:"使用基类引用的函数必须能使用继承类的对象而不必知道它。"
Farhana:不好意思,听起来有点困惑。我认为这个OOP的基本原则之一。也就是多态,对吗?为什么一个面向对象原则需要这么说呢?
Shubho:问的好。这就是你的答案:
在基本的面向对象原则里,"继承"通常是"is a"的关系。如果"Developer" 是一个"SoftwareProfessional",那么"Developer"类应当继承"SoftwareProfessional"类。在类设计中"Is
a"关系非常重要,但它容易冲昏头脑,结果使用错误的继承造成错误设计。
"Liskov替换原则"正是保证继承能够被正确使用的方法。
Farhana:我明白了。有意思。
Shubho:是的,亲爱的,确实。我们看个例子:
Liskov替换原则类结构图
这里,KingFisher类扩展了Bird基类,并继承了Fly()方法,这看起来没问题。
现在看下面的例子:
违反Liskov替换原则类结构图
Ostrich(鸵鸟)是一种鸟(显然是),并从Bird类继承。它能飞吗?不能,这个设计就违反了LSP。
所以,即使在现实中看起来没问题,在类设计中,Ostrich不应该从Bird类继承,这里应该从Bird中分离一个不会飞的类,Ostrich应该继承与它。
Farhana:好,明白了。那么让我来试着指出为什么LSP这么重要:
如果没有LSP,类继承就会混乱;如果子类作为一个参数传递给方法,将会出现未知行为;如果没有LSP,适用与基类的单元测试将不能成功用于测试子类;对吗?
Shubho:非常正确。你能设计对象,使用LSP做为一个检查工作来测试继承是否正确。
接口分离原则
Shubho:今天我们学习"接口分离原则",这是海报:
接口分离原则海报
Farhana:这是什么意思?
Shubho:它的意思是:"客户端不应该被迫依赖于它们不用的接口。"
Farhana:请解释一下。
Shubho:当然,这是解释:
假设你想买个电视机,你有两个选择。一个有很多开关和按钮,它们看起来很混乱,且好像对你来说没必要。另一个只有几个开关和按钮,它们很友好,且适合你使用。假定两个电视机提供同样的功能,你会选哪一个?
Farhana:当然是只有几个开关和按钮的第二个。
Shubho:对,但为什么?
Farhana:因为我不需要那些看起来混乱又对我没用的开关和按钮。
Shubho:以便外部能够知道这些类有哪些可用的功能,客户端代码也能根据接口来设计.现在,如果接口太大,包含很多暴露的方法,在外界看来会很混乱.接口包含太多的方法也使其可用性降低,像这种包含了无用方法的"胖接口"会增加类之间的耦合.你通过接口暴露类的功能,对.同样地,假设你有一些类,
这也引起了其他问题.如果一个类想实现该接口,那么它需要实现所有的方法,尽管有些对它来说可能完全没用.所以说这么做会在系统中引入不必要的复杂度,降低可维护性或鲁棒性.
接口隔离原则确保实现的接口有他们共同的职责,它们是明确的,易理解的,可复用的.
Farhana:你的意思是接口应该仅包含必要的方法,而不该包含其它的.我明白了.
Shubho:非常正确.一起看个例子.
下面是违反接口隔离原则的一个胖接口
注意到IBird接口包含很多鸟类的行为,包括Fly()行为.现在如果一个Bird类(如Ostrich)实现了这个接口,那么它需要实现不必要的Fly()行为(Ostrich不会飞).
Farhana:确实如此。那么这个接口必须拆分了?
Shubho:是的。这个"胖接口"应该拆分未两个不同的接口,IBird和IFlyingBird,IFlyingBird继承自IBird.
这里如果一种鸟不会飞(如Ostrich),那它实现IBird接口。如果一种鸟会飞(如KingFisher),那么它实现IFlyingBird.
Farhana:所以回头看包含了很多开关和按钮的电视机的例子,电视机制造商应该有一个电视机的图纸,开关和按钮都在这个方案里。不论任何时候,当他们向制造一种新款电视机时,如果他们想复用这个图纸,他们将需要在这个方案里添加更多的开关和按钮。那么他们将没法复用这个方案,对吗?
Shubho:对的。
Farhana:如果他们确实需要复用方案,它们应当把电视机的图纸份为更小部分,以便在任何需要造新款电视机的时候复用这点小部分。
Shubho:你理解了。
依赖倒置原则
Shubho:这是SOLID原则里最后一个原则。这是海报
它的意思是:高层模块不应该依赖底层模块,两者都应该依赖其抽象
Shubho:考虑一个现实中的例子。你的汽车是由很多如引擎,车轮,空调和其它等部件组成,对吗?
Farhana:是的
Shubho:好,它们没有一个是严格的构建在一个单一单元里;换句话说,它们都是可插拔的,因此当引擎或车轮出问题时,你可以修理它(而不需要修理其它部件),甚至可以换一个。
在替换时,你仅需要确保引擎或车轮符合汽车的设计(如汽车能使用任何1500CC的引擎或任何18寸的车轮)。
当然,汽车也可能允许你在1500CC引擎的地方安装一个2000CC的引擎,事实上对某些制造商(如丰田汽车)是一样的。
现在,如果你的汽车的零部件不具备可插拔性会有什么不同?
Farhana:那会很可怕!因为如果汽车的引擎出故障了,你可能修理整部车或者需要买一个新的。
Shubho:是的,那么该如何做到"可插拔性"呢?
Farhana:这里抽象是关键,对吗?
Shubho:是的,在现实中,汽车是高级模块或实体,它依赖于低级模块或实体,如引擎或车轮。
相比直接依赖于引擎或车轮,汽车应依赖于某些抽象的有规格的引擎或车轮,以便于如果任何引擎或车轮符合抽象,那么它们都能组合到汽车中,汽车也能跑动。
一起看下面的类图
Shubho:注意到上面Car类有两个属性,它们都是抽象类型(接口)。引擎和车轮是可插拔的,因为汽车能接受任何实现了声明接口的对象,并且Car类不需要做任何改动。
Farhana:所以,如果代码中不用依赖倒置,我们将面临如下风险:
使用低级类会破环高级代码;
当低级类变化时需要很多时间和代价来修改高级代码;
产生低复用的代码;
Shubho:你完全掌握了,亲爱的!
Shubho:除SOLID原则外还有很多其它的面向对象原则。如:
"组合替代继承":这是说相对于继承,要更倾向于使用组合;
"笛米特法则":这是说"你的类对其它类知道的越少越好";
"共同封闭原则":这是说"相关类应该打包在一起";
"稳定抽象原则":这是说"类越稳定,越应该由抽象类组成";
Farhana:我应该学习那些原则吗?
Shubho:当然可以。你可以从整个网上学习。仅仅需要Google一下那些原则,然后尝试理解它。当然如果有需要,尽管问我。
Farhana:在那些设计原则之上我听说过很多设计模式。
Shubho:对的。设计模式只是对一些经常出现的场景的一些通用设计建议。这些灵感主要来自于面向对象原则。你可以把设计模式看作"框架",把OOD原则看作"规范".
Farhana:那么接下去我将学习设计模式吗?
Shubho:是的,亲爱的。
Farhana:那会很有意思,对吗?
Shubho:是,那确实令人兴奋。
没有更多推荐了,
不良信息举报
举报内容:
如何向妻子解释OOD
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!赞助商链接
在Yahoo的一直持续着OO面向对象和SOA之间的讨论,涉及领域模型domain model, 消息格式message format 和服务设计考量等方面。随着MDD/DDD不断深入和扩散,特别是在.NET领域的深入人心,曾经以SOA发起为荣耀的Java阵营有些固步自封,反而对领域建模DDD有排除作用,问题倒不是出在Hibernate ORM这些技术实现层面,而是在战略层面,因为JavaEE已经有各个厂商联合推出的SOA战略。如今DDD火热,SOA阵营的人不得不正视与领域模型的融合,这其中发生了各种新旧观念的碰撞,InfoQ今天专门发表文章对这一大辩论进行总结,原文如下:鉴于InfoQ中国可能对该文章翻译(需要客观观点看原文或等中文翻译),下面结合我个人DDD和SOA两方面经验,从我角度看看两者的讨论。首先要搞清楚SOA和DDD是有区别的,SOA是以功能为划分边界,而DDD是以类为划分边界,将功能封装在类中作为方法。我个人更愿意把这两种都认为是最高意义上OO面向对象,就像现在面向函数语言Scala等也是以函数功能为划分。初学者总是把面向函数或以功能划分和面向过程混同起来,两者本质区别就是有无边界划分。面向过程是很多功能模块混同在一起,一锅浆糊,而面向函数是以功能功能方法进行细分,松耦合解耦。但正因为这个否定之否定,有点绕的概念,致使很多初学者使用SOA是以面向过程思维来使用,结合数据库SQL语言,我见过一个大型的SOA系统,其Web服务的定义实际就是数据表操作定义,SOA方法内部功能核心实际就是复杂一点的插入 删除 查询的SQL语句。回头看看他们的讨论:面向服务的建模技术(service oriented modeling ),比如具体到:面向领域的服务建模( DOSOM(Domain oriented service modeling) )是分解业务服务(SOA)的第一步,DDD是SOA的实现途径,通过基于业务功能结果基础上的领域划分,是迈向SOA的第一步。一旦业务合约能够定义下来(由需求专家),OOD是实现服务实现的好方式,在SOA中分析需求不同我们在Jdon提倡的用例 四色原型 然后DDD等先后方法,它是首先定义业务合同business contract,是一种合约设计(Design by Contract),比如世界电信联盟NGOSS BOSS等都是这样SOA思路。我曾经花不少时间研究NGOSS,实际上它和SOA一样,只不过是一个行业的SOA,同样存在SOA的缺点,只重视战略,战术指导不够,怎么实现都很含糊,结果很多电信BOSS系统都是基于关系数据库的SQL语句实现,出现我上面提到服务的方法实际就是数据库SQL语句的奇怪现象,导致系统难以维护和拓展,BUG不断,这时DDD正好可以弥补这样的缺憾。当我们SOA中的服务是由富领域模型分解实现以后,带来的问题就是网络间传输富模型很浪费,那么大的有方法的富领域对象被序列化传输是性能杀手,现在一般使用只有setter/getter的贫血模型,实际是数据表的翻拍品,使用领域模型后,需要最小化服务之间的信息交换,可以使用一种主数据管理技术(MDM Master Data managerment)通过最小化的核心模型来实现消息。MDM我个人认为就是富领域模型的另外一种称谓。具体谈到了Mortgage Industry Standards Maintenance Organization (MISMO)如何简化实体结构。MISMO适合作为相同行业中不同伙伴之间通讯的标准格式,对内部来说,核心领域模型使用是比较适合,因为通讯场景很少变化,也不必跨业务领域跨不同公司需要进行分享。在典型的企业内部需求中,灵活性和可维护性是必须的,而不是与其他企业通讯交换数据。对于领域模型和SOA如何结合,我过去在Jdon帖子中也提出,SOA的服务内部委托领域模型的方法实现,SOA的服务对外是一个协定接口,打开SOA服务具体实现再看,你找不到核心功能实现代码,因为被分解到领域模型的方法中实现了,这点可以从Jivejdon的案例中可见一斑,这也是该讨论中有人分享他们的经验:Domain data is the classes that encapsulate information needed to implement services.This uses the classic object/relational mapping.领域模型是用类来封装原本需要在服务中实现的信息数据,然后用经典的ORM映射。对于后面一句我也不敢沟通,如果说领域模型是SOA服务的分解实现,ORM则是领域模型的分解实现,有时我们不一定用ORM,用NoSQL也可以啊。这样说,会让很多初学者感觉绕了一圈还是落实到数据库,只不过中间加了多个环节,反而复杂,有脱裤子放屁嫌疑。其实虽然没多了环节,主角核心不一样了,现在主角核心是领域模型,不是数据表了。讨论中David Tildesley 提到使用color modelling也就是jdon经常谈的四色建模,有颜色的建模技术,四色原型,结合原型领域形态(ADS)archetype domain shape 等,可以导向以组件为核心的建模方向,它认为传统的OO是以类为划分边界,有违SOA初衷。他认为每个业务组件都有其核心实体(四色原型中绿色或粉红色),他们由黄色的角色解耦。
从SOA和DDD定位来看,SOA更注重联系,外在关系,而DDD更注重内视,这是两种根本文化,就像有的人很注重人际关系;而有的人注重内修,学这个学那个,提高自己能力。前者在人多大企业公务员有好处,后者在私企或外企可以见长,当然如果两者兼具就更好,可惜能做得都好的人不多见。我在下面另外帖子里给出:四色UML = SOA + DDD,当我们用彩色UML color UML分析需求以后,以后实现之路到底是以MI活动组件为核心架构,还是以PPT等静态组件为核心架构,是两种道路选择,当然,现在DCI好像正在模糊两者边界,静观其变:[该贴被banq于 17:28修改过]
其实个人觉得,Role是Entity的内部划分,Role的Mixin后是实体,转角色就是一个边界思维。
从这个案例我得出一个个人结论:高级程序员或架构师至少掌握两种类型语言才合格:一种以类为划分边界的语言,如java C#等;还有一种是以功能或函数为划分边界的语言,如SOA Scala javascript等,这样才能明白什么是真正面向对象。其他语言也基本可以划在这两个边界内。这两个划分依据,实际就是产生对象的类和其中的方法,一个类包括属性和方法,我们通常把方法嵌入在类中,通过类创建对象,通过使用对象才能访问其内部的方法,这是Java C#语言特点;而SOA和面向函数语言则是直接以方法创建对象,去除了外面的类的封装,这种方式可以说是以纯技术眼光来看待事物,适合在一些纯技术平台,比如Javascript与事件驱动,这些都是以技术论技术。而通常以类封装划定边界的基本是模仿现实世界建模用,现实世界存在各种实体数据,这些实体用类来代表比较自然。当然,现在Java C#之类面向类的语言中,也可以加入面向函数或事件驱动架构,这实际是Java + SOA或Java +EDA的一个本质。相关帖子:InfoQ中文译本:[该贴被banq于 15:11修改过]
日 17:17 "@"的内容从SOA和DDD定位来看,SOA更注重联系,外在关系,而DDD更注重内视,这是两种根本文化 ... 嗯,完全赞同。DDD注重神,而SOA注重行,两者不矛盾,在我看来是完全统一的。不过传统的SOA比较粗粒度,而我更喜欢细粒度的Rest。目前我正尝试用DDD+Rest的模式来搭建一些企业业务中的基础服务。
赞助商链接
赞助商链接
最佳分辨率
OpenSource
Code & 2002-20豆丁微信公众号
君,已阅读到文档的结尾了呢~~
面向对象复习材料)(可编辑),建筑材料复习资料,建筑材料复习题,土木工程材料复习题,工程材料复习资料,机械工程材料复习题,复习材料,cfa考试复习材料,材料科学基础复习题,道路建筑材料复习题
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
面向对象复习材料)(可编辑)
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口没有更多推荐了,
不良信息举报
举报内容:
OOD启思录 读书笔记
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!是Attribute,还是Property?有时是个麻烦。
Attribute和Property都可以翻译成&属性&,有的地方用Attribute表示&属性&,有的地方又在用Property,初学者常常在这两个单词间&迷失&,甚至认为二者没有区别,是一样的。可是Attribute不等于Property。二者之间到底有何区别?
我们从OOA/OOD(Object Oriented Analysis / Object Oriented Design,面向对象分析与设计)说起。在OOA/OOD中的使用Attribute表示属性,指对象(Object)的特征(Feature)。我们在一些编程语言(如C#、Delhpi等)中遇到的&属性&一词,为何是Property,而不是Attribute呢?
为了理解这一点,我们把C++拽进来看看。OOA/OOD中的Attribute在C++中称为Member Variable(成员变量),慢慢开始明白了吧。C++中的Member Variable在C#中可以继续延用,但有了一个新的称呼:Field(字段)。看一个简单的C#示例:
public class Student {&&&&&&&&// Student类
&&& &&&&&&&// C#中称为Field(字段),C++中称为Member Variable(成员变量),OOA/OOD中称为Attribute(属性)
我们整理出下表,可以看到同样的概念在OOA/OOD、C++和C#中的不同称呼:
OOA/OOD中的方法(Method)是指对象的操作(Operation)。在C++中称为Member Function(成员函数),而在C#中还是叫做Method。在表中加入对方法(Method)的称呼:
C++中将Attribute称为Member Variable,将Method称为Member Function,其实还是很贴切的。从本质上说,确实是在声明变量、定义函数。后来者(C#等)可能觉得这样的称呼不够OO(Object Oriented,面向对象),于是做了些改变。Method延用OOA/OOD的称呼不用说,但将Attribute称作Field,总觉得欠妥。因为DB(Database,数据库)中有Field的概念,也译作&字段&,实在是容易混淆。
现在我们可以把OOA/OOD中提到的属性(Attribute)同C#中提到的属性(Property)区分开来。继续上面的示例:
public class Student {&&&&&&&&// Student类
&&& &&&&&&&// C#中称为Field(字段),C++中称为Member Variable(成员变量),OOA/OOD中称为Attribute(属性)
&&& public string Name {&&&&&&// C#中称为Property(属性)
&&&&&&& get {
&&&&&&& set { name = }
我们顺便看看private和public:Property本质上是一对get/set方法,可以进行访问控制,因而可以设置为public;而按照OOA/OOD原则,Attribute不能设为public,而要设为private。
C#中确实也有Attribute,把它译作&特性&似乎更好些。如:
[WebMethod]
在不少的.NET/C#书籍中看到有把Attribute译成&属性&的,这样一来,老鸟倒是可以通过语境判断出来不是在说Property,初学者恐怕一下子就跌进云里雾里了。虽然不至于&一个馒头引发的血案&,但&两个属性引发的歧异&,终究不是什么好事情。
另外,在Web编程中也常见到Attribute和Property混用的情况。比如用VS创建一个ASP.NET应用程序,如果在代码视图添加控件:
&asp:TextBox id=&txtName& text=&Hello& runat=&server& /&
此时TextBox控件中的id、text和runat都称为Attribute,这是延用了HTML中对属性(Attribute)的称呼。
如果是在设计视图中拖放控件,然后在属性(Properties)窗口中设置ID或Text,此时又会将ID或Text称为Property。因为控件在服务器上是作为控件类(Control Class)实现,使得可以用编程的方式来访问控件。那么属性必然是Class中的Property。
当我们在学习新知识的时候,除了&知其然&,更要&知其所以然&,这样我们才能对概念有深层次的理解。同时,在我们平日里使用术语的时候,一定要准确,否则在交流时遇到不必要的障碍,白白增加交流成本。
阅读(...) 评论()}

我要回帖

更多关于 复合函数奇偶性判断 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信