《敏捷软件开发:原则、模式与实践》重读笔记(一):寻找属于你的依赖

64 views
Skip to first unread message

pongba

unread,
Sep 21, 2007, 8:09:49 AM9/21/07
to pon...@googlegroups.com
上次总结了一下耦合的三重境界。但在方法学上还是有缺陷的,那就是,在实际编码的过程中,怎样找到属于你的那个最佳依赖,最近在重读《敏捷软件开发:原则、模式与实践》,随手翻到ISP(接口隔离原则),映入眼帘的就是一个C++的例子,这个例子最大的问题就在于,他用的是老式的C++范式(不是风格,风格比这个要浅显得多),即Interface+Inheritance的做法,在实际只应该引入签名依赖的时候引入了更强的依赖:接口依赖。

里头有一个Timer:

class Timer
{
public:
  void register(int timeOut, TimerClient* timerClient) = 0;
};

class TimerClient
{
public:
  virtual void timeOut() = 0;
};

这是典型的Java做法!进而,这是典型的误导C++程序员。屁大一点儿事情也弄出个接口来,这么大动静干嘛呢?而且还引入了timeOut这个名字依赖(不过后面他也提议用adapter层(已经有了一个接口来,居然还再来一个adapter层)来缓解这个依赖)。

其实现代C++利用generic callback设施(tr1::function/tr2::signal)可以最直观的解决这个问题。

class Timer
{
public:
  void register(int timeOut, tr1::function<void()> callback);
private:
  tr2::signal<void()> callbacks;
};

// 客户代码
class TimerDoor
{
public:
  void open() { timer->register(tr1::bind(onTimer, this)); }
private:
  void onTimer() { ... }
  Timer* timer;
};

后面还讲了一个接口隔离的例子。ATM取款机的。正好说明了高阶特性和低阶语言的尴尬,二进制兼容导致接口隔离的重要性加剧,如果是duck-typing的话或许连接口都不一定需要,反正是字符串解耦和。在duck-typing里面,客户代码天生就是仅仅依赖它们用到的那些方法的。

难怪C#要加入delegate。

--
刘未鹏(pongba)|C++的罗浮宫
http://blog.csdn.net/pongba
TopLanguage
http://groups.google.com/group/pongba

Huafeng Mo

unread,
Sep 21, 2007, 8:26:17 AM9/21/07
to pon...@googlegroups.com
折磨说来"敏捷软件开发",也不怎么敏捷咯。
这个世界....

Huafeng Mo

unread,
Sep 21, 2007, 6:38:35 PM9/21/07
to pon...@googlegroups.com
就是说delegate把原本的名字依赖,变成了签名依赖,耦合度降低了两级。而使用接口,仅降低一级。
这就是说,经历了早年简陋的sp后,人们一股脑地倒向oop,然后不顾一切地滥用。但在很多方面,OOP却并非最适合的。
pongba总结的三种依赖可以用来指导技术的选择。那么,当引入gp后,会对这种选择产生多大的影响呢?

On 9/21/07, pongba <pon...@gmail.com> wrote:

yq chen

unread,
Sep 21, 2007, 8:11:48 PM9/21/07
to pon...@googlegroups.com
Huafeng Mo <longsh...@gmail.com> :
你起得好早阿,周末也不休息休息?

在07-9-22, Huafeng Mo <longsh...@gmail.com> 写道:

Huafeng Mo

unread,
Sep 21, 2007, 11:38:09 PM9/21/07
to pon...@googlegroups.com
嗨,我这人睡得早,起得早,六点以后醒了就睡不着了。平时上班早,路远,养成习惯了。
Reply all
Reply to author
Forward
0 new messages