【设计模式和面向对象设计】拾零(持续更新,个人零散笔记)

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

以后有什么关于设计模式的心得和零散的学习都放在这归纳总结,以备自己温习助记所用,不成体系,没有深度,自娱自乐,严重欢迎拍砖,不欢迎说风凉话的童鞋。

1.关于设计模式分类

DesignPattern-1

这是Gof的分类方式,从面对的具体事物上将模式分为两个大类:

  • Class模式:在具体化时需要使用继承(extends)
  • Object模式:在实现时除了接口继承(implements)外不需要其他关键字。这个情况比上一种的模式多得多,也说明了在面向对象编程中提倡面向接口编程而不是基于继承。

从动作上,模式被分为三类:

  • 创建型模式:关注对象的创建。
  • 结构型模式:关注程序的结构化组织方式,属于静态模型模式。
  • 行为型模式:关注各个对象在运行时如何交互,属于动态模型模式。

2.关于设计模式和面向对象设计

  • 不要关注设计模式之间的关系,知道确实都相互有关联就可以了。
  • 公有继承是is-a的关系,但是不要解释为“是一个”,最好在思维时想着“其行为像一个”,注意是“行为”,或者思考时用“可以用作一个”来形容,不要通过公有继承重用基类中已有的代码,公有继承是为了被重用(已经多态的使用了基对象的已有代码)。也就是说已有的多态代码通过调用Base的虚函数来使用Base&或者Base*,可以无缝的使用新的派生类对象。
  • 关注模式描述的意图、应用场景。
  • OOP和OOD不可混为一谈,敏捷开发是设计和编码并行的,设计模式是面向对象程序员将最初设计转化为代码时所采用的典型的实现细节。
  • 基于过程的编程,中心是数据,关注的是数据流。共享数据在子程序之间建立了耦合关系(不该有的依赖)。
  • 基于对象的编程,中心是事物,关注的是相互协作的代理。对象不会把数据给其他对象,对象是一组能力。
  • 面向对象设计的要旨就是在于将那些可能会发生变化的东西封装,以便程序中一个部分发生变化不会根本影响其他的部分。
  • 派生类之间的区别在于属性,则使用数据成员表示;若在于行为则用虚函数(C++)表示。
  • 若是对实现的继承,则使用私有基类更好的方法是采用组合的方法

3.具体设计

1)C++动态内存的回收要注意自赋值和自操作两种特殊情况,可以使用=进行判断也可以使用延迟delete的方式实现。

2)C++中,通常情况下,公有基类的析构函数应该被声明为虚函数。

3)C++重载运算符和提供相同功能的成员函数之间的选择该运算是不是大量进行,若是则采用重载运算符,若不是则使用成员函数。因为前者会带来很多困惑,这样的困惑需要增加代码复杂度来保证不会产生什么不可预料的问题。

 

4.关于实际开发

  • 软件部署的成本是IT部门预算最大的组成部分之一。

5.技巧

  • 如果你发现一个类中除了setter和getter以外就没有别的方法了,你可以考虑把这个类换成一个struct进行表述了,因为这样的类意味着private信息封装是无意义的,其数据成员本身就应该是读写接口。
  • 尽量不使用setter和getter:进行粗粒度的封装。(如果你必须在对象之间传递信息的话,可以将信息封装在其他对象中,方法返回的对象用该对象所实现的接口最好。)

Money a,b,c;

a.SetValue(a.SetValue() + b.SetValue());

转换为:

a.increaseBy(b);

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

原文地址:https://www.cnblogs.com/gnuhpc/p/2827684.html