Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 作文,你怎么知道什么时候停止?_Oop_Design Patterns_Composition - Fatal编程技术网

Oop 作文,你怎么知道什么时候停止?

Oop 作文,你怎么知道什么时候停止?,oop,design-patterns,composition,Oop,Design Patterns,Composition,有一句古老而明智的谚语“价值构成胜于继承”。在我参与的最后两个项目中,我一直在尝试将此应用于其他OOP和设计模式 在大多数情况下,它运行良好,看起来有点正确。但我注意到有些时候,只有2到3个类真正从中获得了最好的效果,而其他10+类突然变成了简单的委托人,只是细节有了细微的变化 有时,我试图通过使用一个抽象类来解决这个问题,该抽象类具有不变的细节,将不同的细节委托给具体的实现,但感觉有些不太对劲 你如何平衡这一点,同时遵循这句老话?我做错什么了吗?我想你的问题可能是你试图遵循“老话”。您可能比任

有一句古老而明智的谚语“价值构成胜于继承”。在我参与的最后两个项目中,我一直在尝试将此应用于其他OOP和设计模式

在大多数情况下,它运行良好,看起来有点正确。但我注意到有些时候,只有2到3个类真正从中获得了最好的效果,而其他10+类突然变成了简单的委托人,只是细节有了细微的变化

有时,我试图通过使用一个抽象类来解决这个问题,该抽象类具有不变的细节,将不同的细节委托给具体的实现,但感觉有些不太对劲


你如何平衡这一点,同时遵循这句老话?我做错什么了吗?

我想你的问题可能是你试图遵循“老话”。您可能比任何通用指南更了解应用程序的需求

一旦你积累了一些构建应用程序的经验,你应该对如何做事情有一种自然的感觉。这些指南只是帮助你理解一个概念的指南。它们本身并不是规则。

“价值构成重于继承”是一句老话,即使在今天仍然有效。 组合和继承意味着增加可重用性&减少重复代码。继承还有其他好处

组合意味着如果您有属于2个或更多类层次结构的泛型方法,则将其作为新类分离出来,并让类层次结构将此新类作为组合的一部分。有了它,您还不必触及类层次结构,就可以获得可重用代码的好处

class Aves { ... }
class Hawk: Aves { ... }

class Mammal { ... }
class Bat: Mammal { ... }
在上面的示例中,所有鸟类都会飞(),(像企鹅或渡渡鸟这样不会飞的鸟类仍然可以使用禁飞来实现Fly()。 但是蝙蝠作为哺乳动物也能飞

现在,您可以将Fly()作为一个单独的类拉出,并支持组合而不是继承(包括将Fly()作为Aves的一部分)

例如,FlyBehavior可以是具有ShortFlightBehavior和LongFlightBehavior的类层次结构


我希望我没有进一步把你弄糊涂:)

听起来你在把启发式智慧变成绝对智慧。它不是告诉你“永远”不要使用继承。如果您处于继承或组合都同样有效的情况下,那么就使用组合。简单。

什么时候停止?不要再专注于作文了。如果你专注于其他规则,它会自然而然地出现

关注“is-a”和SRP以获得适当的继承

检查SRP类的最简单方法是尝试将每个方法名与类名关联

class Vehicle
{
    private void WriteLog(string message) {}
    public void Start();
}

WriteLog
方法实际上无法与
车辆关联。打破它,通过构造器(组合和依赖项注入)来实现它。

有趣。那么,在这种情况下,您会将
Log
对象传递给Vehicle的构造函数吗?你如何调用它?您仍然需要
WriteLog()
方法,该方法依次调用
Log
对象上的
Write()
方法。是吗?请注意,
WriteLog
方法是私有的。如果把它作为
公众
,情况会更糟。因此,在内部使用它并不是一个真正的问题。只使用该字段。没有注意到该方法是私有的。我的错误。谢谢你的解释。或者你可以为任何可能需要这个功能的对象实现一个接口,iLogable。
class Vehicle
{
    private void WriteLog(string message) {}
    public void Start();
}