模式、最佳实践和优秀代码

7
我经常阅读介绍模式、最佳实践和如何编写“清晰代码”的书籍和文章。然而,有些概念似乎过于工程化,有时淹没了基本问题的实质,使得代码更难与所建模的问题域相关联。
你多久会重构一段已经运作良好的代码以追求“模式”?你遇到过“模式”实际上会让代码变得更加复杂或者模糊其含义的情况吗?我曾经也有这种感受,看到一个用简单的类解决的问题被重新编写成使用lambda表达式和闭包的解决方案。
我在这方面挣扎,并且好奇别人是如何找到正确平衡点的。

2
你可能想要阅读以下内容:https://dev59.com/onRB5IYBdhLWcg3w7reVhttps://dev59.com/tXNA5IYBdhLWcg3wZ85Shttps://dev59.com/EXVD5IYBdhLWcg3wWKLc - Liran Orevi
8个回答

17

不要只为了让你的代码符合某本书中的模式而进行重构。

模式确实有助于锻炼您的大脑,思考良好的软件设计。我实际上认为,我通过阅读模式书籍并反思它们以及学习如何理解它们以及它们的优点来获得了我的很多编程技能和知识。这实际上就是关键所在。它们的目的是使事情变得更加容易,更易于维护、测试等等...... 而不是让你的生活变得更加困难 :)

我认为这也是“困难”的原因。当您遇到问题时,模式给您一个框架、一个起点。例如:您真的想对您的代码进行单元测试,但由于它依赖于UI逻辑或耦合度太高而无法进行。那就是您的问题,因此您可能会通过了解MVC模式和依赖注入和控制反转的概念来找到解决方案。它们可以给您一个起点,因为MVC模式在高层次上解释了Observer、Observable、Controller view等概念以及它们之间的关系。然后,作为一名优秀的程序员,您的任务是选择正确的方法,并在合理的范围内应用该模式。不要只是因为模式告诉你这样做。记住,它只是一个框架,您可以修改和适应它以适应您特定的环境。


5
我的建议是,在尽可能长的时间内保持您的设计简单明了,但不要牺牲可维护性。
一个好的基于模式的面向对象设计有很多小的、非常专业化的类。最简单的功能可以触及许多类。这使得学习/理解设计变得耗时。这种“良好因素”的优点在于代码是可维护的——一个小的需求变更通常只需要一个小的局部代码变更。
您的系统越简单,就越容易采用简单明了的设计。但随着系统变得越来越复杂,为了可维护性而进行更复杂的设计的权衡将发生改变。

2
使用这些文章和书籍作为指南。你知道的越多,就能在选择何时使用什么时更好地做出正确的决定。设计模式并不是应该尽可能使用的,重构也不是因为某种原因就必须进行的操作。
当需要时,你应该重构代码。例如,在添加功能或修复错误时,你会注意到可以让它变得更好。
同样,你应该以相同的方式使用模式。如果使用不当,模式可能会使你的代码变得更糟,并且当一个更简单的非模式方法可以满足解决方案时,模式可能会使代码变得更加难懂。在代码中没有必要过度使用模式,这样做只会使代码变得更糟。
坚持YAGNI(你不需要它)的方法。这并不意味着你不需要考虑你的设计。相反,这是一种想法,我们经常会过度设计我们的解决方案,而不是让它随着时间的推移逐渐发展,以满足需求。
“理论是好的。理论提醒我们,人们在处理这些问题之前已经有过经验。但它是否成为法律呢?我们应该为自己思考和理解。” - Rob Conery。

2
我认为问题的一部分在于书中的示例
当你写一本书或文章时,需要一些示例来展示你的想法。通常,这些示例旨在简单明了。然而,对于一个简单的示例,“模式”可能没有太多意义。
然后有些人开始将复杂的机制应用于各种简单问题,只是为了贴上某个模式。我认为这是您所描述的模式使用不当。
然而,对于更复杂的设计(需要非常好的判断力),模式可能是有用的。您也可以阅读何时设计模式成为问题而不是解决方案?

1
如果你不挥动球棒,就无法打中球。为了找到正确的平衡,你需要进行实验,这意味着有时可能会过度。你不应该害怕尝试新事物,并在认为另一种设计可以更好地工作时重新构建代码。唯一让你害怕的事情应该是没有学习和变得更好。

0
大多数情况下,我发现良好运行的代码已经遵循了适当的模式。 有两种模式我看到过会使事情变得复杂——单例和装饰器。 在我看来,单例只是一个更冗长的静态方法类版本。装饰器模式也不太好,因为它强制每个装饰器重新实现一堆样板代码,违反了DRY原则,并且需要知道装饰违反了SRP原则。 总的来说,模式大多是好工具,但仅仅因为一个概念拥有“模式”的称号并不意味着它就是好的。

0

IIABDFI。如果它不坏,就不要修复它。

换句话说,“一个良好运行的代码片段”作为您所说的唯一重写原因是,如果您需要概括它所做的内容,而不会使同一代码可重用。

在这种情况下,使用模式可以在确定如何有效实现可重用性方面具有好处,但该模式需要成为“工具”,而不是最终目标。

请注意,使用模式还是不使用模式是一个完全不同的问题,我发现最好通过this SO question的第一个(被接受的)答案回答。简而言之,如果您是一位优秀的开发人员,则会使用模式,无论您知道与否,因为模式只是特定设计问题的好的且经常见到的解决方案。(我曾经处于这种情况-多年来,我创建或学习并反复使用了许多有用的设计,直到有一天有人告诉我这些东西叫做模式,并给他们取了可爱的名字)。


0

最近我在Twitter上和一些程序员产生了争执。我邀请他们参加“设计模式Barcamp”,但有一个人开始说这样的Barcamp没有意义,因为你是否知道模式都无所谓。他说这就像达到涅磐一样。但我不同意。我们都是工程师,而学习如何编写好的软件部分地来自抽象思维。但是,仅仅那还不够。学习其他编程语言、编程范例,扩展你对正在使用的工具的知识,阅读用你喜欢的语言编写的开源软件代码,这些都会让你成为更好的程序员(如果你足够幸运的话)。

回答你的问题。是的,有些人认为他们可以应用模式。但有时他们可能选择不适合他们问题的模式。我喜欢说所有工具都是最适合用于它们预定的场景。因此,模式也是一样的。如果你不确定,最好与你的架构师交流。查找最佳实践,了解为什么会使用模式,它会给你什么样的机会/困难?它会增加额外负担吗?代码是否仍然可读性强且易于维护呢?如果答案为“是”,那就继续吧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接