`
bma
  • 浏览: 57986 次
  • 性别: 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,应该能悟出点儿什么,但是好像运气还未到。
分享到:
评论

相关推荐

    小学英语英语故事童话故事AStringofPearls一串珍珠

    通过这些故事,孩子们会明白,每个地方都有其存在的意义,就像珍珠一样,每个故事都值得被发现,被讲述,被铭记。 综上所述,《一串珍珠》不仅仅是一篇简单的英语故事,它更是一扇窗,打开了孩子们认识世界的大门。...

    美丽的人工湖作文.doc

    假山之上,“迎客松”如同守护神一样伫立在那里,它的枝条像是热情地向每一位游客招手。假山周围的水波轻拍着石岸,似乎在低语,邀请着人们踏上这道七曲桥。 七曲桥是通往湖心小岛的必经之路,桥身随着湖面的曲线...

    【小学生作文】小学生美丽的草原作文300字.doc

    在广袤无垠的内蒙古大草原上,清晨的露珠还挂在青翠的草尖上,阳光透过薄雾,洒在大地上,一片宁静而又生机勃勃的...让我们像这些小学生一样,用实际行动去爱护我们赖以生存的环境,让这样的美丽能够永远地传承下去。

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

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

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

    如果每一个人都能够像百泉村的居民那样,自觉地保护环境,那么我们的公园也会像百泉村一样,永远保持其原生态的美丽。 教室,作为我们学习生活的小环境,同样需要我们的呵护。破旧不堪的课桌、乱涂的桌面、随手丢弃...

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

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

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

    这堂课不仅仅是对孩子们语文知识的丰富,更是对他们心灵的熏陶和塑造,帮助他们在未来的生活中,无论面对什么挑战,都能够坚守内心的信念,坚持自己的道路,像那只贝一样,创造出属于自己的美丽珍珠。

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

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

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

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

    新人教统编版四年级上册语文 范文2:水乡诸暨 教学课件.pptx

    课件对此进行了详细的介绍,它不仅向学生们展示了珍珠的美丽,更重要的是,让他们了解了自然界中的这一奇妙现象。同时,课件还提到了诸暨珍珠产业的现代化转型,如何在保留自然之美和传统的同时,实现经济效益的提升...

    珍惜时间,做时间的主人主题班会主持稿.doc

    我们不能让宝贵的时间像沙子一样从指尖滑落,而应该像珍珠一样,一颗颗精心挑选,串成美丽的项链。 活动的一开始,让我们一起闭上眼睛,静立一分钟。在这短暂的一分钟里,我们用心去感受时间的流逝。你会发现,一...

    苏教版三年级上《小露珠》.ppt

    课文中的“闪亮透明小圆球,不大不小像豆豆”生动地刻画了露珠的外观,同时也让孩子们想象它们如同小巧的珍珠一样,在花草和树叶上轻轻摇摆,形成了一幅生机盎然的清晨画卷。当太阳出现,“太阳出来去无踪”,露珠也...

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

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

    我爱读书.doc

    秋天,这个四季中最为斑斓的季节,总是以其独特的韵味,吸引着无数文人墨客的笔墨。在这个收获的季节,大地换上...通过阅读,我们可以像作者一样,享受到秋天的宁静与美好,也可以让自己的心灵在知识的海洋中自由飞翔。

    小学英语英语故事童话故事TheLittleSeaMaid海的女儿

    在这个海洋王国里,海水清澈得就像矢车菊花瓣一样,碧蓝如洗,透明得能让人看见最深处的奥秘。海洋之广阔,远超过人类科技所能探测的边界。在这样深邃的海洋中,居住着各种神秘的海之居民,他们与陆地上的人类大不...

    三年级上比喻句练习.doc

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

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

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

    16台湾蝴蝶甲天下.ppt

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

    童年的乐章作文.doc

    我们像海燕一样,在风浪中勇敢飞翔,无畏的笑声与海浪的拍击声交织成一段段美妙的旋律。然而,成长的道路上总会有挑战与困难,摔倒和挫败是成长的必经之路。我们会因为一时的失败而感到悲伤,甚至在泪水中找不到重新...

Global site tag (gtag.js) - Google Analytics