我先来抛砖引玉:
A: 耦合度较高一组类的处理
如果一组类, 原本就是密切配合工作, 互相知道对方的存在, 无法独立使用, 那么它们之间使用 interface 做接口并没有什么不合适
的, 具体可以依据源程序分割, 性能要求等因素, 决定采用interface 还是其他class, 或者 GP,
B: 耦合度不高的类的处理
设计中, 原本来两个类之间关系不密切的, 采用 interface, 我的看法是很不合适. 白白加大耦合度和增加程序里面概念的数量
---- 多了很多香炉和鬼 ;)
不密切的种类:
1. 松耦合的 provide/consumer, 简单如 ponda 在此帖中的例子. 这应该使用 简单的 delegate 或者复杂
一点的 singal/slot 都可以.
2. 两个业务领域模块的接口, 我近来是使用 delegate (C++ 里面是 boost::bind,
boost::function 之类的) /free function,
甚至一个 struct 里面一堆的delegate, free function (好像有些朋友很烦这个)
3. ????
4. ????
其他情形呢 ?
C. 什么时候应该将算法单独用 gp 实现呢 ? (例如上次讨论的 collect)
请大家的玉砸过来, 我好收起卖钱 :)
我这样理解你的话: 如果目前或者可见的将来, 多于一个类可能要用到同样的算
法, 我们不要去将他们弄成同一个基类, 然后将代码抽过去; 或者将他们弄出同一
个 interface 来, 而是写一个 GP 算法.
我想想, 有以下进一步的问题:
如果两个类很确切地能够并且应该抽出一个基类来, 那么似乎不必讨论, 我们就抽
出一个基类来好了.
除此外, 什么情形下, 我们弄出同一个 interface 来比 GP 算法会更好呢 ?
yq chen 写道:
> 有一种情况,对象是根据外部的相关信息创建的,如果你的代码需要使用该对
> 象,那你很可能需要一个interface。不同的外部信息可能创建不同的对象,但
> 所有这些对象都需要实现你定义的interface。在你的代码中通过该interface将
> 你的业务逻辑分派下去,通过虚函数机制你就可以调用到当前具体对象相应的方法。
-------------------------------
P231 :
C++ 中
通过继承实现的多态是绑定和动态的.
通过模板实现的多态是非绑定和静态的.
其他语言中, 可能会有其他组合, 例如 Smalltalk 提供了非绑定的动态多态. 但是 C++ 的上下文中, 动多态和静多态是两个非常准
确的概念, 并不会产生混淆.
P236
事实上, 泛型程序设计是相当实用的, 因为它所依赖的是静多态, 而静多态会要求在编译期对接口进行解析. 另一方面, 这种要求还会带来一些与面向
对象设计原则截然不同的新设计原则.
-------------------------------
C++ 在OO其实不是太好用, 由于没有 gc; 构造函数不能调用虚函数; 构造函数出现异常, 资源释放比较麻烦; rtti 较弱 等等.
C++ 近年的发展, 包括 C++ 0x 基本上集中在泛型编程上了, 这里面有很多有价值的地方, 但大多数人用得还很少.
boost 里面倒是用得很充分, 但是那种用法, 能够将潜在的用户统统吓走.
On 9月22日, 下午7时35分, "Huafeng Mo" <longshank...@gmail.com> wrote:
> 我的感觉是,一般在不涉及动多态的情况下,gp差不多可以替代oop的接口,因为gp的concept也是一种接口,但却是非绑定的(没有同一种具体的类型绑定 )。灵活性更大。我做个一些尝试,基本上还行,就是编译时间...。还好,我用vc8比较多,这个问题不算太大,只要不倒腾元编程,还是可以忍受的。d就不存在 这种障碍了。
> 说起绑定,我觉得《C++
> Templates》里的说法值得考虑:多态有两各方面的特性:动/静性和绑定性。两者组合,有四种形式:动态绑定多态,也就是基于oop虚函数的多态;静态未 绑定的多态,也就是模板;动态的非绑定多态,好像就是ruby的火星人类型系统;静态的绑定多态,忘了,书不在手边,查不到,哪位知道言语一声。:)
>
2. 将逻辑上相关的参数组织成一个结构, 同时给这个结构提供 n 多种构造方法,
各个构造方法可以根据调用的情况, 选择对应不同成员变量的形参, 还可以选择形
参的不同类型. 这样, 参数管理就独立于函数体了.
对于参数过多的问题,winapi是一个典型的例子。在结构化的语言中一般将多个逻辑相关的参数抽象成一个结构;而在有对象概念的语言里,一般都把跟类核心概念相关的一组函数,抽象成类的方法,而把这一组函数中共同概念的参数变成类的状态。但是就算把这些东西都抽象出来,还是有一些闲散的参数无法划分,比如CreateProcess、CreateWindow(Ex)等等。作为API来说,它为了实现普适性,必须提供这些参数,由于C语言中没有缺省参数这样的东西,用户要么不初始化,要么就得一个个的写。这个时候有缺省参数的语言(如C++、python等)就提供了很多方便性。通过对API参数中最不常用的参数排序,把不需要钉子的参数放到最后,给出常用的缺省参数。这个时候就能使API在极大多数情况下能够很容易的被使用同时能够满足少数特殊需要定制的应用。在这个方面,java社区和C#社区曾有不同的看法,他们认为提供缺省参数同时又提供函数重载容易引发错误。但是我认为就算有函数重载,仍然不能象缺省参数那样优雅地解决API简单化的问题。