COOOOOOOOL

从固有的原则出发,向着目标诚直前进.所以这样的行为便名为正当的行为,表示其为寻着正路而行的.

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  26 Posts :: 0 Stories :: 21 Comments :: 0 Trackbacks

公告

QQ:774262464 email:cooooooool.2010@gmail.com

常用链接

留言簿(3)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 71932
  • 排名 - 321

最新评论

阅读排行榜

评论排行榜

有时,重复来自设计中的错误。

让我们看一个来自配送行业的例子。假定我们的分析揭示,一辆卡车有车型、牌照号、司机及其他一些属性。与此类似,发运路线的属性包括路线、卡车和司机。基于这一理解,我们编写了一些类。

但如果Sally打电话请病假、我们必须改换司机,事情又会怎样呢?Truck和DeliverRoute都包含有司机。我们改变哪一个?显然这样 的重复很糟糕。根据底层的商业模型对其进行规范化(normalize)--卡车的底层属性集真的应包含司机?路线呢?又或许我们需要第三种对象,把司 机、卡车及路线结合在一起。不管最终的解决方案是什么,我们都应避免这种不规范的数据。

当我们拥有多个互相依赖的数据元素时,会出现一种不那么显而易见的不规范数据。让我们看一个表示线段的类:

  1. class Line {  
  2.  public:  
  3.   Point  start;  
  4.   Point  end;  
  5.   double length;  
  6. }; 

第一眼看上去,这个类似乎是合理的。线段显然有起点和终点,并总是有长度(即使长度为零)。但这里有重复。长度是由起点和终点决定的:改变其中一个,长度就会变化。最好是让长度成为计算字段:

  1. class Line {  
  2.   public:  
  3.    Point  start;  
  4.    Point  end;  
  5.    double length() { return start.distanceTo(end); }  
  6.  }; 

在以后的开发过程中,你可以因为性能原因而选择违反DRY原则。这经常会发生在你需要缓存数据,以避免重复昂贵的操作时。其诀窍是使影响局部化。对DRY原则的违反没有暴露给外界:只有类中的方法需要注意"保持行为良好"。

  1. class Line {  
  2.  private:  
  3.   bool  changed;  
  4.   double length;  
  5.   Point  start;  
  6.   Point  end;  
  7.  
  8.  public:  
  9.   void setStart(Point p) { start = p; changed = true; }  
  10.   void setEnd(Point p)   { end   = p; changed = true; }  
  11.  
  12.   Point getStart(void)   { return start; }  
  13.   Point getEnd(void)     { return end;   }  
  14.  
  15.   double getLength() {  
  16.     if (changed) {  
  17.       length  = start.distanceTo(end);  
  18.       changed = false;  
  19.     }  
  20.     return length;  
  21.   }  
  22. }; 

这个例子还说明了像Java和C++这样的面向对象语言的一个重要问题。在可能的情况下,应该总是用访问器(accessor)函数读写对象的属性 。这将使未来增加功能(比如缓存)变得更容易。

Uniform Access原则:模块提供的所有服务都应能通过统一的表示法使用,该表示法不能泄漏它们是通过存储、还是通过计算实现的。

posted on 2009-12-16 15:53 COOOOOOOOL 阅读(142) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理