kang 的个人资料Health King照片日志列表 工具 帮助
第 1 张,共 2 张
更多相册 (1)

xinyong kang

尚未添加列表。
尚未添加列表。

Health King

搞IT只不过是我di表面工作,我真正di身份是一位研究~僧
8月19日

Quit Smoking. why not?

      戒烟8小时:血中一氧化碳降至正常,血中氧水平增至正常;

      戒烟24小时:心脏病发作的危险降低;

      戒烟48小时:神经末梢的尼古丁消失,嗅觉及味觉增加;

      戒烟72小时:支气管松弛使呼吸通畅,肺功能增加;戒烟2周到3个月:循环改善,肺功能增加了30%;

      戒烟3个月到9个月:咳嗽、鼻窦充血、疲乏、气短等减轻,肺内纤毛重新成长,痰液容易排出,肺部清洁,减少了感染的危险,身体活力增强;

      戒烟5年:心脏病的死亡率与不吸烟者相同;       戒烟10年:肺癌的死亡率降至几乎与不吸烟者相同,癌前期细胞恢复正常,其它恶性肿瘤(口腔、食道、膀胱等)的发生率降低。

7月12日

减肥之路漫漫,吾将上下而求索。

      最近又维持在一个体重水平了。我现在的食谱是酱紫。
      早饭:清水煮荞麦面条,放点虾皮,番茄酱。
      午饭:西芹段(超市买的净菜,直接吃),橙子一个(剥好,弄成一瓣一瓣),洋葱一个(切丝),偶尔弄点黄瓜或者胡萝卜。低脂酸奶二两。上海产的一种大豆干二两。这些东西拌一起。味道还不错。
      晚饭:微波炉烤红薯一个(最近盘子里面放水,烤出来的和煮的很像)。苹果一个。
      然后天黑了去慢跑40分钟。周日不跑步,去游泳。
 
     就这个样子,体重也只是维持,下降的及其缓慢。不过这个月压缩到70公斤以内的目标应该可以完成。哈哈。
     原来计划是65公斤,但是目前看。我觉得还是弄到我以前刚毕业的水平60公斤比较好。怕反弹啊。这个只是一个想法,先完成65公斤的目标再说了。
7月6日

设计模式-OOD的设计原则(5)-"合成聚合复用原则"

      合成(Composition)和聚合(Aggregation)都是关联(Association)的特殊种类。聚合表示整体和部分的关系,表示“拥有”;合成则是一种更强的“拥有”,部分和整体的生命周期一样。合成的新的对象完全支配其组成部分,包括它们的创建和湮灭等。一个合成关系的成分对象是不能与另一个合成关系共享的。
      换句话说,合成是值的聚合(Aggregation by Value),而一般说的聚合是引用的聚合(Aggregation by Reference)。
      简短的说,合成-聚合复用原则(CARP)是指,尽量使用合成/聚合,而不是使用继承。
      在OOD中,有两种基本的办法可以实现复用,一种是通过合成/聚合,另外一种就是通过继承。通过合成/聚合的好处是:
  • 新对象存取成分对象的唯一方法是通过成分对象的接口。
  • 这种复用是黑箱复用,因为成分对象的内部细节是新对象所看不见的。
  • 这种复用支持包装。
  • 这种复用所需的依赖较少。
  • 每一个新的类可以将焦点集中在一个任务上。
  • 这种复用可以在运行时间内动态进行,新对象可以动态的引用与成分对象类型相同的对象。
  • 作为复用手段可以应用到几乎任何环境中去。

      它的缺点就是系统中会有较多的对象需要管理。

      通过继承来进行复用的优点是:

  • 新的实现较为容易,因为超类的大部分功能可以通过继承的关系自动进入子类。
  • 修改和扩展继承而来的实现较为容易。

      缺点是:

  • 继承复用破坏包装,因为继承将超类的实现细节暴露给子类。由于超类的内部细节常常是对于子类透明的,所以这种复用是透明的复用,又称“白箱”复用。
  • 如果超类发生改变,那么子类的实现也不得不发生改变。
  • 从超类继承而来的实现是静态的,不可能在运行时间内发生改变,没有足够的灵活性。
  • 继承只能在有限的环境中使用。

      要正确的选择合成/复用和继承,必须透彻的理解里氏代换原则和Coad法则。里氏代换原则前面学习过,Coad法则由Peter Coad提出,总结了一些什么时候使用继承作为复用工具的条件。只有当以下的Coad条件全部被满足时,才应当使用继承关系:

  • 子类是超类的一个特殊种类,而不是超类的一个角色,也就是区分“Has-A”和“Is-A”。只有“Is-A”关系才符合继承关系,“Has-A”关系应当用聚合来描述。
  • 永远不会出现需要将子类换成另外一个类的子类的情况。如果不能肯定将来是否会变成另外一个子类的话,就不要使用继承。
  • 子类具有扩展超类的责任,而不是具有置换调(override)或注销掉(Nullify)超类的责任。如果一个子类需要大量的置换掉超类的行为,那么这个类就不应该是这个超类的子类。
  • 只有在分类学角度上有意义时,才可以使用继承。不要从工具类继承。

      错误的使用继承而不是合成/聚合的一个常见原因是错误的把“Has-A”当成了“Is-A”。“Is-A”代表一个类是另外一个类的一种;“Has-A”代表一个类是另外一个类的一个角色,而不是另外一个类的特殊种类。
      我们看一个例子。如果我们把“人”当成一个类,然后把“雇员”,“经理”,“学生”当成是“人”的子类。这个的错误在于把“角色”的等级结构和“人”的等级结构混淆了。“经理”,“雇员”,“学生”是一个人的角色,一个人可以同时拥有上述角色。如果按继承来设计,那么如果一个人是雇员的话,就不可能是经理,也不可能是学生,这显然不合理。正确的设计是有个抽象类“角色”,“人”可以拥有多个“角色”(聚合),“雇员”,“经理”,“学生”是“角色”的子类。
      另外一个就是只有两个类满足里氏代换原则的时候,才可能是“Is-A”关系。也就是说,如果两个类是“Has-A”关系,但是设计成了继承,那么肯定违反里氏代换原则。

7月5日

庆贺突破75公斤大关

      连续三天苹果后,今天早上过秤,72.5公斤。效果不错,一共减了2.5公斤,哈哈。然后坚持以前的兔子餐,保持住。这样离65公斤的目标就更近了。下一个近期目标是突破70公斤。预计一个月的时间。哈哈哈。
7月4日

设计模式-OOD的设计原则(4)-"接口隔离原则"

      接口隔离原则(ISP):使用多个专门的接口比使用单一的总接口要好.也就是说,一个类对另外一个类的依赖性应当是建立在最小的接口上的.
      这里的"接口"往往有两种不同的含义:一种是指一个类型所具有的方法特征的集合,仅仅是一种逻辑上的抽象;另外一种是指某种语言具体的"接口"定义,有严格的定义和结构.比如Java语言里面的Interface结构.对于这两种不同的含义,ISP的表达方式以及含义都有所不同.(上面说的一个类型,可以理解成一个类,我们定义了一个类,也就是定义了一种新的类型)
      当我们把"接口"理解成一个类所提供的所有方法的特征集合的时候,这就是一种逻辑上的概念.接口的划分就直接带来类型的划分.这里,我们可以把接口理解成角色,一个接口就只是代表一个角色,每个角色都有它特定的一个接口,这里的这个原则可以叫做"角色隔离原则".
      如果把"接口"理解成狭义的特定语言的接口,那么ISP表达的意思是说,对不同的客户端,同一个角色提供宽窄不同的接口,也就是定制服务,个性化服务.就是仅仅提供客户端需要的行为,客户端不需要的行为则隐藏起来.
      在我们进行OOD的时候,一个重要的工作就是恰当的划分角色和角色对应的接口.将没有关系的接口合并在一起,是对角色和接口的污染.如果将一些看上去差不多的接口合并,并认为这是一种代码优化,这是错误的.不同的角色应该交给不同的接口,而不能都交给一个接口.
      对于定制服务,这样做最大的好处就是系统的可维护性.向客户端提供接口是一种承诺,public接口后是不能改变的,因此不必要的承诺就不要做出,承诺越少越好.
7月1日

苹果,又见苹果

      已经连续8天75公斤了,受不了了,昨天同事回四川,去吃了羊肉火锅.从今天开始再次三日苹果大法.下周一争取突破75公斤.比方说73公斤,哈哈哈哈.
6月30日

设计模式-OOD的设计原则(3)-"依赖倒转原则"

      "开-闭"原则是我们OOD的目标,达到这一目标的主要机制就是"依赖倒转原则".这个原则的内容是:要依赖于抽象,不要依赖于具体.
      对于抽象层次来说,它是一个系统的本质的概括,是系统的商务逻辑和宏观的,战略性的决定,是必然性的体现;具体的层次则是与实现有关的算法和逻辑,一些战术性的决定,带有相当大的偶然性.传统的过程性系统设计办法倾向于使高层次的模块依赖于低层次的模块;抽象层次依赖于具体层次.这实际上就是微观决定宏观,战术决定战略,偶然决定必然.依赖倒转原则就是要把这种错误的依赖关系倒转过来.
      许多的建构设计模型,例如COM,CORBA,JavaBean,EJB等,它们背后的基本原则就是DIP.
      对于软件设计的两个目标,复用和可维护性来说,传统的设计侧重于具体层次模块的复用和可维护,比如算法,数据结构,函数库等等.但是,对系统的抽象是比较稳定的,它的复用是很重要的,同时,抽象层次的可维护性也应当是一个重点.就是说DIP也导致复用和可维护性的"倒转".
       我们现在来看看依赖有几种,依赖也就是耦合,分为下面三种
  • 零耦合(Nil Coupling)关系,两个类没有依赖关系,那就是零耦合.
  • 具体耦合(Concrete Coupling)关系,两个具体的类之间有依赖关系,那么就是具体耦合关系,如果一个具体类直接引用另外一个具体类,就会发生这种关系.
  • 抽象耦合(Abstract Coupling)关系.这种关系发生在一个具体类和一个抽象类之间,这样就使必须发生关系的类之间保持最大的灵活性.

      DIP要求客户端依赖于抽象耦合,抽象不应当依赖于细节,细节应当依赖于抽象(Abstractions should not depend upon details. Details should depend upon abstractions),这个原则的另外一个表述就是"四人团"强调的那个:要针对接口编程,不要对实现编程.(Program to an interface, not an implementation),程序在需要引用一个对象时,应当尽可能的使用抽象类型作为变量的静态类型,这就是针对接口编程的含义. DIP是达到"开-闭"原则的途径.

      要做到DIP,用抽象方式耦合是关键.由于一个抽象耦合总要涉及具体类从抽象类继承.并且需要保证在任何引用到某类的地方都可以改换成其子类,因此,LSP是DIP的基础.DIP是OOD的核心原则,设计模式的研究和应用都是用它作为指导原则的.DIP虽然强大,但是也很难实现.另外,DIP是假定所有的具体类都会变化,这也不是全对,有些具体类就相当稳定.使用这个类的客户端就完全可以依赖这个具体类而不用再弄一个抽象类.