分类:
2007-12-30 13:13:50
在代码中我发现,有许多helper形式的类。在多个人开发的项目中,许多程序员不喜欢直接使用别人提供的接口。而是按照自己的调用习惯进行封装。甚至常常创建一套新的逻辑来封装旧的逻辑,甚至创造更复杂的逻辑来隐藏一个简单的逻辑。结果这个厚厚的胶水层,增加了整个系统的复杂度,特别是增加了debuging的难度。程序员很可能是担心别人的东西发生变化,而使用这个胶水层把自己保护起来,希望:万一别人发生变化,自己只修改这个胶水层就可以了。往往实际的效果是:因为这个胶水层要调和双方的逻辑,当发生变化时,不太容易修改它。在传统的面向过程的语言中,这种情况就相对较少,传统的语言更鼓励对别人的函数进行简单和直接地调用。
“接口与实现分离”,程序员一但掌握便开始坚信的哲学。“要为未来变化准备好”,将来我可以在不改变接口的情况下,添加一个子类实现,而对其他模块不产生影响。其实,基类还是是实现子类公共行为的地方。把子类的公共逻辑放到基类里面,子类就不需要重复实现这些逻辑。这样对未来准备得更好,当添加一个新的子类实现时,你不需要重复实现已经有的功能。
举个例子:
如果把ConfigInfo定义成接口,ConfigDbImp和ConfigFileImp会重复实现存储配置信息的数据结构,重复实现内存中配置信息的访问接口,两个子类会有许多相似的代码。如果这些行为都交给父类实现,每个子类就可以只重写一个load()操作:把配置信息从外部的存储介质加载到内存。另外,如果这个东东用在多线程环境,线程同步的所有逻辑也可以交给基类ConfigInfo实现。如果将来出现了一个新的配置文件格式,只需要定义一个新子类并重写load操作。
(未完待续)
GFree_Wind2011-12-31 10:28:19
虽然我工作中一直用C,但是也不妨碍应用面向对象的思想。我个人还是挺喜欢C++和面向对象的。
不过正如博主在文中所言,滥用面向对象,设计出来的东西比面向过程要难以维护的多。
不过罪恶在于使用菜刀的人,而非菜刀
cuichaox2008-01-04 17:46:10
你说的很对: (1)这篇文章并非在批评“面向对象”(2)我日常就是使用面向对象的设计方法。(3)如文章开头所说,“面向对象”可以产生很棒的设计。(4)我整理的这些:人在面向使用对象时,容易犯的错误。因为我认为,了解这些错误对更好的使用面向对象很有意义。(5)要用好一个东西,必须了解它的缺点的一面。面向对象的方法难以掌握,正因为这个缺点,所以更容易犯错误。为了掌握它,必须了解这些。 好的设计会来自“懒惰”,也会来自过于”勤奋“,不晓得简化和重用的勤快人很多。---应该这样概况:好的设计人员脑勤手懒,差的程序员手勤脑懒。 对应用领域的理解肯定是必要的,这是必要条件,这很对。这让我想起来另外一个情况:人都寄希望与在应用领域直接抽象出概念,构造对象模型,面向对象的设计方法,也是这样讲的。可是:并非所有的领域都能直接抽象出对象。面向对象的方法在三个领域最为成功(计算机图形,GUI和模拟现实)。因为这三个领域能容易抽象出模型,而其他其他领域,并没有像人们开始想象地那样能直接地寻找到对象(这个说法来自《UNIX编程的艺术》)。 这样的领域中,更多的概念来自设计人员的“发明”而不是