`
bma
  • 浏览: 57697 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

让类像珍珠一样美丽

阅读更多
很显然,类不是现实实体的一一映射,而是包含着大量抽象(abstraction)的结构,这个结构应当比现实中的实体来得更纯粹,更稳定,更灵活。现实中实体的职责(responsibility)可能是混杂的,甚至不清晰的,现实实体之间的dependency可能是cycle的,现实实体是不稳定的,是多变的,因而常常展现出令人吃惊的连锁反应,比如南美丛林中的那只小蝴蝶。但是软件不能是这样,更狭义的说,类,和类结构不能是这样,因为一旦这样就会在软件系统中埋下巨大的波澜。面对现实/自然的变化我们只能适应,充其量预防,而更多的是花费巨大的代价去恢复和修补。我没没办法控制现实/自然,但我们可以控制软件系统,设计出满足我们需要的世界。
 
每一个类,都应当像珍珠一样纯粹,尽量不包含瑕疵,纯白就是纯白,墨绿就是墨绿,绝不是斑点狗或者斑马。
 
只有一个职责,只为一个目的而生,只保存这个目的必须的field,只实现这个职责必须的行为。Employee只是一个职员,不要让paying行为“污染”它,交给一个helper类,它只负责paying,例如叫PaydayTransaction,但是这其中又涉及各种不同的pay schedule(有的按周,有的按月,有的按年),分出去,叫PaymentSchedule;又涉及不同的薪酬计算方法(有的就是工资,有的还有回扣,有的按小时计费),分出去,PaymentClassification;paying的方式有多种(银行转帐,邮寄,来会计这儿取现金),分出去,PaymentMethod……每个类都是一粒珍珠,纯粹又完整,不多也不少。
 
这时候暂时忘记Pattern,忘记现实实体,心中只有两个简单的原则:Single-Responsibility Principle (SRP) 和Interface-Segregation Principle (ISP),让他俩引导你,得到也许依赖关系不是很理想的,但是却个个都很纯粹的类结构,然后让Open-Close Principle (OCP)和Dependency-Inversion Principle (DIP)引导你重构,(当然,这时候也要注意Liskov Substitution Principle,LSP)
 
Why OCP later? 因为OCP意味着:吃下第一颗子弹先,再extracting abstraction to close against 此颗子弹,子弹就是变化,只有当变化发生了的时候你才知道需要设计什么抽象来保护自己,所以OCP 不是 BDUP (Big Design Up Front),是事(变化)后的措施,而且是不断调整的:变化源变了,索要close的对象自然变了,原先的abstraction就要改了。
 
Then, why DIP later? 答案涉及包(package)结构的设计。首先要认识到:包结构不是系统功能划分,包结构系统build图,因而对包结构,没有Top-Down Deisng(详见Agile Sw Dev, chapter20)。要是硬Top-Down Design就只能fail rather badly。调整包结构的核心是Acyclic-Dependencies Principle (ADP),实现ADP的两个重要手段之一就是应用DIP,所以,先有珍珠般的、但关系不理想的类,再有大珍珠般的包。另一个手段是“Extract Package”(我这么叫它):应该A只依赖B,但现在B也反过来依赖A了,把导致循环依赖的类单独做成一个包C,让B改为依赖C,A改为依赖B和C。
 
类设计有5个Principle(上面说了),包的设计有6个Principle:
  1. The Reuse-Release Equivalence Principle (REP)
  2. The Common-Reuse Principle (CRP)
  3. The Common-Closure Principle (CCP)
  4. The Acyclic-Dependencies Principle (ADP)
  5. The Stable-Dependencies Principle (SDP)
  6. The Stable-Abstraction Principle (SAP)

看着很多,其实和类的设计本质大同小异,详见Agile Sw Dev,chapter 20。值得一提的是REP谈到Reuse,我就自然联系到Component了:这一条应用于Component设计也很贴切。后来Bob大叔直接说:package应当是reuse的granularity,并且将是否适合reuse(CRP)作为package设计质量的判据之一。如此下去,package打成jar,用metadata明确说明provides-interface, requires-interface,如果需要再加点儿资源参数化(parameterize)一下,就是一个无懈可击的构件。

说到构件粒度,最让我醍醐灌顶的认识来自Oscar的文章"Software Evolution as the Key to Productivity",他说构件之所以能提高生产率,就是因为构件提高了抽象层次,而比较之下,OO强制我们关注的概念粒度太小了。软件生产率提高的发展史就是不断提高抽象层次的历史。而"Component Software"第八章都在讨论构件粒度,第一条就是Units of abstraction。这个地方能说得太多了。

另外一个方面比较OO和Component就是:Component也许会比OO更容易学习和掌握。上面谈到OOD关于类的5条,关于包的6条principle,哪些适用于构件,哪些不适合,又要补充哪些呢?我想构件设计研究逐渐成熟后这些就会有答案,paper机会啊。因为Component不在乎impl language,(其实还是有一些要求的)所以Forrester Research调查显示为了避免OO的重新培训和较陡峭的学习曲线,许多公司正在考虑越过/抛弃OO,直奔构件,"there is a push from 'elitist objects' to 'populist components'"。但是真的会简单门吗?有个Component-Oriented Programming (COP)的东东啊,Clemens写过文章,U. of California, Irvine有个哥们拿它做了Ph.D Thesis,这下就知道不是那么简单了。管窥一下COP,Clemens给了个公式:COP = Polymorphism + (Really) Late Binding + (Real) Information Hiding + Safety (作为对照,OOP = Polymorphism + (Some) Late Binding + (Some) Information Hiding + Inheritance)

  1. 第一删除的就是Implementation Inheritance
  2. 构件是组合起来发挥作用的,所以第一要支持late binding和Polymorphism,真的late binding要求late linking——是它是真正的code integration成为现实
  3. Safety不用说了,第三方开发、组合、部署的前提;老话:因为构件没有final integration test。并且构件潜在客户不可预知,所以构件系统中(不断有构件增删)无法人工判定是否可以删除构件中实例化的对象,所以真正的extensible system只能依赖垃圾收集。
COP是我一直想好好看看的东西,应该会有心得写下来。OO是实现构件的好技术,而以往的OO知识和经验在Component上绝对依然有效,但是COP设计的重点自然是向Connection侧重了,又有新的需要研究和学习。
看看OOD再结合COP,应该能悟出点儿什么,但是好像运气还未到。
分享到:
评论

相关推荐

    泪珠与珍珠原文_《泪珠与珍珠》读后感

    琦君提醒我们,不必强迫自己避免痛苦,也不必抑制内心的情感波动,因为这些“精神上的粒粒珍珠”正是我们生活的真实写照,它们让我们的生命更加丰富多彩。 读罢《泪珠与珍珠》,我们应当学会欣赏并珍惜泪水中的美好...

    三年级语文下册 美丽的南沙群岛1教案 苏教版 教案.doc

    3. **词汇理解**:“星罗棋布”是指像星星一样散落在广阔区域的事物,这里用来描绘南沙群岛众多的岛屿;“浩瀚”和“浩淼”都形容水面广大无边,强调南沙群岛海域的辽阔;“用之不竭”表示资源丰富,可以不断利用。 ...

    《一只贝》课件(1).ppt

    文章通过这个故事告诉人们,生命中的挫折和困难有时可以转化为宝贵的财富,就像那只贝壳一样,虽然外表平凡甚至丑陋,但内心却蕴含着巨大的价值。同时,它也提醒我们,不要轻易忽视那些看似不起眼的事物,因为它们...

    三年级比喻句练习.doc

    7. 荷叶上的露珠晶莹透亮,好像一颗颗珍珠一样。 - 露珠与珍珠的相似之处在于光泽和圆润,增强了露珠的美感。 8. 这条公路很长很长,就像一条长长的飘带一直伸向天边。 - 公路被比喻为飘带,体现了其绵延不断的视觉...

    小学语文成语大全沧海遗珠的成语解释

    在故事中,狄仁杰对某人的评价用了“沧海遗珠”这一词,意味着这个人像被遗忘的珍珠一样,虽然被埋没,但其实具有非凡的才能。狄仁杰用孔子的话“观过知仁”来赞扬此人,暗示他通过观察此人的行为,发现其内在的仁德...

    三年级语文小露珠苏教PPT学习教案.pptx

    如文中所述,小青蛙将小露珠比喻为“钻石”,小蟋蟀形容它“像水晶一样透明”,小蝴蝶则认为小露珠“像珍珠一样圆润”。这些比喻生动形象,有助于学生理解和体会各种物体的特点,并锻炼他们的比喻能力。 接着,教案...

    五年级语文阅读理解精选及答案.doc

    - 当夜幕笼罩的时候,它像慈母用乳汁(哺育)儿女一样地滋润着禾苗。 - 它不像暴雨那样挟带风雷闪电以(炫耀)它的威力。 - 更不像冰雹那样对一切(残酷)无情。 2. 文章第三自然段的标点符号应为: 当夜幕笼罩...

    五年级语文下册 4.1一只贝教案4 长春版-长春版小学五年级下册语文教案.doc

    最后,教师进行德育渗透,鼓励学生在学习和生活中培养坚强品质,面对困难不屈不挠,相信自己也能像那只贝一样,通过努力创造出属于自己的“珍珠”。 总的来说,《一只贝》这篇课文的教学旨在启发学生正视生活中的...

    初中语文文学讨论美文荐读托物寄意借贝言志__一只贝赏析

    文章讲述了一只贝经历了痛苦和磨难,最终并未像其他贝一样成为美丽的贝壳,反而孕育出了一颗珍贵的珍珠。这个故事以对比为手法,突出了经历的对比、色彩的对比、外形的对比和价值的对比。普通的贝虽然拥有华丽的外表...

    五年级语文上册 第三单元 一只贝课件1 西师大版 课件.ppt

    首先,面对困难和挫折,我们应当有坚韧不拔的精神,像贝一样即使在痛苦中也要坚持下去。其次,真正的价值往往隐藏在不起眼的事物之中,如同贝的外表虽丑,内心却孕育了宝贵的珍珠。最后,无私奉献的精神也是值得我们...

    三年级语文下册全册课文知识点整理.doc

    通过“蹬开苇杆,像箭一样飞过去”的比喻,刻画了翠鸟的速度和灵动。 6. **《燕子专列》**:这篇课文以拟人手法讲述了人们救助冻僵燕子的故事,体现了人类对动物的关爱。文中“纷纷、冒着、顶着、踏着、四处”等词...

    读《百泉村》有感作文.doc

    金波爷爷将百泉村比喻为大山衣襟上的珍珠,生动形象地传达了这个小山村的珍贵和美丽。 然而,美丽并非仅仅在于自然风光,更在于人们对它的珍视与呵护。百泉村的人们对环境的尊重和保护,为我们提供了一个理想的范例...

    统编版小学期中考试题精品试题六年级语文上册(带答案).docx

    2. 诗词知识:描述中提到了"白雨跳珠乱入船",这是宋代苏轼《六月二十七日望湖楼醉书》中的诗句,描述了雨点像珍珠一样跳跃进船的情景,体现了比喻的修辞手法。 3. 汉字排序:题目中指出"心惊肉跳"按字母表顺序排列...

    人教版小学语文小学三年级下册快乐阅读练习题.doc

    描写翠鸟动作快的语句是"翠鸟蹬开苇秆,像箭一样飞过去",其中的动词如"蹬"、"飞"、"叼"、"贴"、"飞走",让学生理解并学习如何生动描绘动作。 第四部分是一个寓言故事,讲述了一个人南辕北辙的故事,强调了行动方向...

    三年级上比喻句练习.doc

    本体是星星,喻体是珍珠,通过比喻展现出星空的美丽与珍贵。 5、一年过去了,菜园里长出了绿油油的蔬菜,宛如一块碧绿的翡翠,嵌在山坡上。我们看到的是茂盛的蔬菜,想到的是珍贵的翡翠。本体是蔬菜,喻体是翡翠,...

    (人)版小学六年级语文阅读理解与答案解析.doc

    作者通过对比杂花蜜和荆条蜜,赞美了荆条蜜的纯正与醇厚,并由此联想到养蜂人的辛勤工作,认为他们就像蜜蜂一样默默无闻,全心全意为社会酿造美好的生活。 1. 短文赞美的是山区的养蜂人,赞美他们的辛勤付出和无私...

    16台湾蝴蝶甲天下.ppt

    而“兰屿黄裙蝶”则是凤蝶中最为美丽的种类之一,其后翅的金色花纹在逆光下闪烁出珍珠般的光芒,这种色彩特征在蝴蝶界中独一无二。 这些蝴蝶在台湾各地广泛分布,特别是南投县的埔里、雾社以及阿里山的山林地带,...

    观赏热带鱼种类大全(图)(史上最全254种哦)热带鱼图鉴.doc

    热带鱼是非常受欢迎的观赏鱼类,它们多样化的颜色和体型让很多鱼友们都非常着迷。在这篇文章中,我们将为您介绍热带鱼的种类大全,包含了254种不同的热带鱼,涵盖了红绿灯、宝莲灯、荷兰凤凰、白鼠、金翅珍珠鼠、...

    新版(人)版五年级上册语文全册试题(卷).doc

    9. **课文知识**:《落花生》的作者是许地山,笔名“落华生”,文章采用了借物喻人的写作手法,教育人们做人应像花生一样,默默无闻,朴实有用,不做外表华丽而无实际内涵的人。 10. **《珍珠鸟》**:通过人与珍珠...

Global site tag (gtag.js) - Google Analytics