Oop 面向对象设计问题

Oop 面向对象设计问题,oop,refactoring,object,Oop,Refactoring,Object,寻求对此的意见: 我把各种责任分解成不同的对象。但是,这些对象中有许多相互依赖。所有这些对象都依附于接口,因此我不依赖于实现。我关心的是对象之间的依赖关系以及循环依赖的可能性。这是设计不好的征兆吗?其他人做了什么来分离责任和管理依赖关系?谢谢。您可以注入这些依赖项。。。。如果foo依赖于bar的一个实现,那么就让它的构造函数需要一个bar实例作为参数,或者通过setter方法设置它。好吧,您可以注入这些依赖项。。。。如果foo依赖于bar的一个实现,那么让它的构造函数需要一个bar实例作为参数,

寻求对此的意见:


我把各种责任分解成不同的对象。但是,这些对象中有许多相互依赖。所有这些对象都依附于接口,因此我不依赖于实现。我关心的是对象之间的依赖关系以及循环依赖的可能性。这是设计不好的征兆吗?其他人做了什么来分离责任和管理依赖关系?谢谢。

您可以注入这些依赖项。。。。如果foo依赖于bar的一个实现,那么就让它的构造函数需要一个bar实例作为参数,或者通过setter方法设置它。

好吧,您可以注入这些依赖项。。。。如果foo依赖于bar的一个实现,那么让它的构造函数需要一个bar实例作为参数,或者通过setter方法设置它。

重要的是对象模型具有和。这意味着,只有当它们必须(耦合)时,才应该依赖于其他事物,并且它们应该做一件事,而且只有一件事(非常好)(内聚)。除了经验(这意味着从错误中学习)将是你的主要驱动力外,什么时候做这些决定没有简单的答案。有许多设计模式用于解决耦合()。内聚通常只是一种重构练习,当您开始使用类时,将其移入或移出类。

重要的是对象模型具有和。这意味着,只有当它们必须(耦合)时,才应该依赖于其他事物,并且它们应该做一件事,而且只有一件事(非常好)(内聚)。除了经验(这意味着从错误中学习)将是你的主要驱动力外,什么时候做这些决定没有简单的答案。有许多设计模式用于解决耦合()。内聚通常只是一种重构练习,当您开始使用类时,可以将它们移入或移出类。

一般来说,我尽量避免像瘟疫一样的循环依赖,因为它会让事情变得难以推理和实例化。这也表明依赖于圆的对象是紧密耦合的。虽然这可能是必要的,如果它代表了问题的本质复杂性,那么在这些情况下,这种耦合应该更简单、更清晰地表达出来。如果一个对象显然是“基本”对象,而另一个对象显然是“自定义”对象,那么这可能表明您最好使用继承。具体来说,循环依赖是一个强烈的提示,提示您应该使用模板方法模式而不是策略模式。循环依赖也可能表明你会更好

一般来说,我尽量避免像瘟疫一样的循环依赖,因为它让事情变得难以推理和实例化。这也表明依赖于圆的对象是紧密耦合的。虽然这可能是必要的,如果它代表了问题的本质复杂性,那么在这些情况下,这种耦合应该更简单、更清晰地表达出来。如果一个对象显然是“基本”对象,而另一个对象显然是“自定义”对象,那么这可能表明您最好使用继承。具体来说,循环依赖是一个强烈的提示,提示您应该使用模板方法模式而不是策略模式。循环依赖还可能表明,您的情况会更好,因为另一位读者已经指出,您希望您的类具有低耦合和高内聚。如果你的类有循环依赖的风险,听起来你有一股糟糕的代码味道


考虑采用分层、自上而下的方法来看待关系。i、 e.哪个类包含其他类更有意义?如果它不是,并且你需要这两个类的功能,那么考虑一个复合适配器类,其中包含两个.< /p> ,另一个读者指出了你希望你的类具有Low Coupling和高内聚性。如果你的类有循环依赖的风险,听起来你有一股糟糕的代码味道


考虑采用分层、自上而下的方法来看待关系。i、 e.哪个类包含其他类更有意义?如果它不是,并且你需要这两个类的功能,那么考虑一个包含两个.2/P的复合适配器类。你不想做的一件事就是有太多的接口,其中逻辑上只有一个实现,当你尝试和维护时,它会混淆你的代码。(想想必须在C/C++中管理头文件)。每次在iterface中添加属性或方法时,都必须进入所有实现类并提供一个实现。即使使用Intellij IDEA这样的良好重构IDE,它也会很快变得非常混乱。@TheNoob:你是在考虑运行时对象引用而不是类依赖关系吗?你说对象依附于接口,这很好,所以类应该只依赖于接口,所以不应该存在循环依赖。然而,在运行时,你可以很容易地得到循环引用——这就是你的意思吗?我所说的循环依赖是指类A依赖于类B,类B依赖于类A。每个类都由另一个的实例组成。@Fuzzy lollipop——这一点很好。事实上,我遇到过这种情况,经历这种情况很痛苦。我将重构并仅将不断变化的行为封装为接口。您不想做的一件事是,在逻辑上只有一个实现的情况下,有太多的接口,当您尝试进行维护时,它将混淆您的代码。(想想必须在C/C++中管理头文件)。每次在iterface中添加属性或方法时,都必须进入所有实现类并提供一个实现。即使使用Intellij IDEA这样的良好重构IDE,它也会很快变得非常混乱。@TheNoob:你是在谈论运行时对象引用吗