关于设计模式的糟糕设计(Bad Design)

从GoF总结出24个经典的设计模式以来,设计模式已经成为了软件开发的一项基础技能。要是讨论软件设计不谈设计模式,那就OUT了。但是遵循设计模式的设计就是好的吗?依然不见得。先考虑下什么样的设计是好的设计?

好的设计具有适用性。不同的设计目的,肯定有不同的目标。以商业为目的的设计,能将客户的商业利益和品牌价值最大化的设计,即是好设计;以公益为目的的设计, 能将社会价值最大化的设计,即是好设计。没有一个设计能够满足所有人的要求,也没有一个设计是所有问题的解。

好的设计具有必须解决问题。只有解决了大众的需求问题,解决了客户的问题,软件才有价值。

好的设计满足普适的审美要求。在设计上,很难去量化什么是好什么不好。如果满足了大众的审美需求,那肯定会给人积极的印象。对软件开发人员也是一样,如果你的代码给大家看了,都觉得写的很漂亮,很优雅,那你的工作就是得到大家认同的。

好的设计传承而来。没有一开始就完美的设计。好的设计,是经过时间的磨砺地,经过努力的尝试地,历经艰辛地发展而来。看看历代的iPhone就会发现这一趋势。

关于设计模式的糟糕设计(Bad Design)_第1张图片

回头来看设计模式相关的Bad Design。这些糟糕的设计往往就是需要我们我们重构的地方。

反模式(Anti-pattern)。设计中用到的不良设计模式。可以这样理解,如果我们常常说的24种模式是好的模式,那么与它们相违背的一些模式,就是反模式。列举一些,我们可能会碰到的反模式:

  • 抽象倒置(Abstraction inversion):不把用户需要的功能直接提供出来,导致他们要用更上层的函数来重复实现

  • 大泥球(Big ball of mud):没有清晰结构的系统

  • 接口膨胀(Interface bloat):把一个接口做得过于强大以至于极其难以实现

  • 循环依赖(Circular dependency):在对象或软件模块中,直接或间接引入循环依赖

  • 魔幻数字(Magic numbers):在算法里直接使用数字,而不解释含义

  • 自我复制(Repeating yourself):通过不断复制已有代码的模式或代码段进行编码;而非采用once and only once(抽取原则)

  • 重新发明方的轮子(Reinventing the square wheel):已经有一个很好的方案了,又再搞一个烂方案来替代它

  • 银弹(Silver bullet):认为自己最喜欢的技术方案能解决一个更大的问题

误用设计模式。出现这种情况,可能是是因为相关的设计模式没有正确地被实现,缺失关键部分,也可能是对设计模式缺乏正确的理解,导致结构部完整。

破坏模式(Malignant Patterns)。有一个重构方向就是向设计模式重构。但在我们正确应用了设计模式的情况下,在不断的代码发展中,朝向了错误的发展发现,将正确应用和实现的模式破坏掉了,使得该模式不能再满足原来的设计目的。

并发症模式(Iatrogenic patterns)。我们解决的问题领域可能是不断变化的,而且对于当前设计的应用场景可能有些遗漏。新应用的模式,可能会比起初的解决方案更加糟糕。应对这一症状,我们在做重构前需要对问题领域有深入全面的了解,并且有对未来变化的完整应对策略。

知道了有这样糟糕的设计,最重要的是规避这些糟糕设计。如果已经固化到代码中了,寻找机会来做合适的重构,改良设计。

你可能感兴趣的:(关于设计模式的糟糕设计(Bad Design))