Oop 如何改进代码设计?

Oop 如何改进代码设计?,oop,design-patterns,language-agnostic,Oop,Design Patterns,Language Agnostic,最近,我使用了很多策略模式和工厂模式。我真的很有意思。我有很多基于参数检索算法的算法和工厂。 尽管代码看起来非常可扩展,而且确实如此,但拥有N个工厂似乎有点滥用 我知道这是相当主观的,我们在讨论时没有看到代码,但这在现实世界的代码中可以接受吗?你会改变什么吗?好的-问你自己一个问题。该算法实现是否会改变?如果否,则删除该策略。每当我以这种方式实现代码时,我会问以下问题: 我需要替换哪些组件进行测试? 我希望用户/管理员禁用或替换哪些组件,例如通过Spring配置或类似配置? 由于需求可能发生变化

最近,我使用了很多策略模式和工厂模式。我真的很有意思。我有很多基于参数检索算法的算法和工厂。 尽管代码看起来非常可扩展,而且确实如此,但拥有N个工厂似乎有点滥用


我知道这是相当主观的,我们在讨论时没有看到代码,但这在现实世界的代码中可以接受吗?你会改变什么吗?

好的-问你自己一个问题。该算法实现是否会改变?如果否,则删除该策略。

每当我以这种方式实现代码时,我会问以下问题:

我需要替换哪些组件进行测试? 我希望用户/管理员禁用或替换哪些组件,例如通过Spring配置或类似配置? 由于需求可能发生变化,我预计或怀疑将来不需要哪些组件?
这一切都驱动了我如何通过工厂构造对象或组件,以及如何实现算法。上述内容是模糊的,但当然,这些要求也同样难以确定。在没有看到您的实现和需求的情况下,我无法进一步评论,但上面的内容可以作为一些指导原则,帮助您确定您所做的是否过火。

如果您在所有地方都使用相同的设计模式,也许您应该切换到对您正在尝试的工作有更好支持的语言,或者重新思考您的代码,使其在您选择的语言中更具惯用性。毕竟,这就是为什么我们有不止一种编程语言。

你不能用不同的独立工厂来创建一个抽象工厂吗


AlgorithmFactory基于具体工厂创建所需的算法

将取决于我使用的软件类型

维护需要简单的代码,工厂不是简单的代码

但可扩展性有时要求工厂

所以你必须把两者都考虑进去

请记住,在大多数情况下,您必须每年多次维护源文件,而不必扩展它


在国际海事组织,模式应该只在绝对需要时使用。如果你认为它能在两年内派上用场,你最好使用它们。。。两年后。

工厂处理的工作有多复杂?对象创建真的需要抽象到不同的类吗?工厂方法的一个变体是有一个简单的类内工厂。如果已经注入了任何依赖项,那么这确实是最有效的

比如说,

public class Customer
{
  public Customer CreateNewCustomer()
  {
    // handle minimally complex create logic here
  }
}
至于策略过度使用。。。同样,正如@RichardOD所解释的,算法真的会改变吗

永远记住这个原则。你不需要它。

我在维修

我曾经被我的模式强迫老板写了一组16个缓冲区解释器TuxeDo服务,使用CuxActudio和C++中的双DAO模式,没有反射,没有代码GAND。它就像20000行最讨厌的代码,我甚至还没有看到,因为我开始时并没有真正知道C++,它花费了大约三个月。 自从我的老老板开始行动,我用好的OLE直上直下的程序风格C++改写了它们,有几个古怪的宏…每个服务就像60行代码,乘以16。。。所有这些都不到1000行真正简单的代码;简单到连我都能理解


干杯。Keith.

任何人怎么能在没有看到代码的情况下发表评论?好吧,我来试试:听起来你设计得太过了…@Mitch你的意思是回答,你在没有代码的情况下评论得很好=p j/k可能你需要一个工厂工厂-阅读依赖注入。一些算法很可能会改变。有些,不是那么多。战略模式真的是为了让自己远离未来的变化吗?在我看来,这似乎是愚蠢的过度工程。我认为这主要是一种封装已经存在的多种策略的方法。@mquander-这取决于您如何应用它。这两种情况我都见过,语言的选择不取决于我。这似乎是一种可扩展的方式。在这种情况下,我想如果不看大量代码,就没有什么可说的了。+1!我喜欢你的故事。不幸的是,这是非常普遍的-软件开发人员只是喜欢建造一堵中国墙,如果一个普通的木屏障就足够了。接吻是敏捷的,敏捷是最划算的。