为了给汤加个比喻,设计模式是Microsoft Office帮助程序Clippy。“您似乎对很多东西都做同样的事情。我可以通过向您提供Iterator或Visitor来帮助您吗?”
正确记录这些模式将表明何时以与以前多次相同的方式进行操作很有用,第一次尝试时会犯哪些错误,以及找到了避免这些错误的常见方法。因此,您阅读了设计模式(或从内存中查看了它),然后继续进行工作。您无法做的是仅使用Clippy和向导。
经验不足的人可能会犯错误并编写不考虑现实的代码,这是当他们认为他们的设计模式列表是解决软件问题的所有可能方法的完整列表,并尝试通过将设计链接在一起来设计代码时直到完成。在野外观察到的另一种较差的策略是,在设计模式“是最佳实践”的基础上,将设计模式塞入并非真正适合的情况。不,对于实际解决的问题,这可能不是最佳实践,但对于无法解决的问题或仅在存在更简单的解决方案时仅引入不必要的复杂性来解决的问题,这当然不是最佳实践。
当然,也有可能某人基于YAGNI避免使用某种模式,然后意识到他们确实需要这种模式并摸索正常的解决方案。这通常(但不总是)比从一开始就实现需求更糟糕,这就是为什么即使在敏捷开发中,如果没有尽早发现可完全预测的需求也会令人沮丧。我不能成为唯一一个对Java最初拒绝通用容器过于复杂而感到惊讶的C ++程序员,后来又将它们重新绑定。
因此,原则上避免编写Iterator几乎是一个错误,因为您希望避免使用设计模式。
将新字段添加到UI /数据库/数据层需要2-3个小时,而在他的代码中则需要30分钟。
您真的不能对此提出异议:按照这个指标,他的设计要比其他设计好得多。不管是因为他避免了设计模式还是值得怀疑的,但我认为这更有可能是因为他在设计时考虑了正确的“现实世界”问题,并且由于经验的优势,他的工作比仅仅拥有一本教科书的人更好。崇高的理想。
因此,他认识到任何需要您在代码中触摸很多不同点以添加字段的模式都是对工作不利的模式,“使添加字段变得容易”,并且他没有使用这些模式。分层体系结构确实在这方面可能会遭受损失,并且使用设计模式而不意识到其缺点是错误的。
与此相反,在他的设计中编写新的UI需要花费多长时间,而在分层体系结构中则需要花费多长时间呢?如果该项目要求他在固定数据模型上不断构建和部署新的UI,而不是不断添加字段,那么希望他会为此设计。还是一样。但是,尽管有其所有好处,可悲的是说“我们在做敏捷”并不意味着您永远不必进行其他折衷!
从设计模式菜单中进行选择肯定会阻止您思考最重要的问题。但是,在识别出您正在编写“访客”并将其记录或命名为“访客”以帮助读者快速获得它的过程中,并没有多大碍事。由于高级开发人员给出的原因而写“这是一个访客” 而不是正确地记录它是一个可怕的错误-程序员不会理解。即使是知道访问者是什么的程序员也需要更多的信息,而不仅仅是“这是访问者”。