模式应仅在可能是最佳解决方案或有助于创建好的解决方案的地方使用(您同意吗?)。
我严格地将设计模式视为实现细节。如果将公共API和程序记录到该文档中,那么通常在哪里拥有设计模式都不会影响(或影响很大)。也就是说,您不要去“我这里有一个桥接模式,我将在它上面实现一个访问者”。相反,它是“此类将在各种操作系统上具有不同的实现,因此将使用桥接模式来实现”。然后,当您使用它时,您对于将其实现为桥接毫不关心-因为您查看的是公共API,而不是桥接模式。
一个人应该实际投入多少精力来创建松耦合,灵活的设计?
遵循简单的规则集即可实现松散耦合。如果您遵守这些原则,那么在编写代码时,您的代码将(或更多)松散地耦合在一起(即,任何工作都已经成为开发过程的一部分)。
规则中(并非详尽的列表):
- 通过思考(或编写)客户端代码(如何使用该类)来定义接口,而不是通过类来做什么(即为接口设计,而不是实现)
- “告诉,不要问”
- 从已经创建的零件构造对象
- 将要使用的实际对象传递给构造函数(不是成员的工厂,参数的工厂的参数或类似的东西)。
- DRY(如果有两行在两个地方以相同的顺序出现,请将其提取到单独的函数中,依此类推)。
- 如果对象的创建是一个更复杂的操作,则将中间部分的创建作为工厂方法/类来实现(即不在构造函数主体中)。
- YAGNI(根据需要创建事物,而不是之前创建)。
遵循这些规则的方式有所不同,具体取决于语言,团队遵循的开发方法(例如TDD),时间预算约束等。
例如,在Java中,优良作法是将您的接口定义为,interface
并在该接口上编写客户端代码(然后用实现类实例化该接口)。
另一方面,在C ++中,您没有接口,因此只能将接口编写为抽象基类。由于在C ++中,只有在对继承有很强的要求时才使用继承(因此避免了不必要的虚函数的开销),因此您可能不会单独定义接口,而仅定义类头。
那些反对设计模式的人说,使用这些模式的成本通常会超过收益。
我认为他们做错了。如果您编写的是松散耦合(和DRY)代码,则将设计模式集成到其中将花费最少的精力。否则,您将不得不修改代码以实现设计模式。
如果您必须进行大量更改才能实现设计模式,那么问题就不在于设计模式-它是您的代码库整体且紧密耦合。这是一个不良/次优的设计问题,而不是设计模式问题。
我想知道的是,我实际上应该在创建附加级别的抽象和设计上付出多少努力,才允许我的应用程序遵循OO原则,例如松散耦合,接口编程等,这真的值得吗?它?我应该为此付出多少努力?
您的问题做出了(未声明的)假设,即松耦合的唯一好处是能够轻松实现设计模式。它不是。
松耦合的优点包括:
- 重构和重新设计的灵活性
- 减少浪费的精力
- 可测性
- 重用代码的可能性增加
- 设计简洁
- 花费在调试器上的时间更少
...还有其他一些我现在不介意的东西。