方法的 oop 继承 vs 使对象仅调用 class 中调用它的方法
oop inheritance of method vs making object only to call method in class which invoke it
我对判断有疑问 方法从设计、干净的代码 == 好的实践来看更好。
我在程序启动时从文件加载一些数据,classes 的结构如下所示:
更具体地说,IngredientFromXmlReader
、PizzaReader
、DrinksFromXmlReader
在内部完成所有工作,没有来自 DataFromFileLoader
的任何数据。
问号是 DataFromFileLoader
class 它应该继承自 PizzaReader
、IngredientFromXmlReader
、DrinksFromXml
并具有方法 loadMenuFromFiles
像这样:
private void loadMenuFromFiles()
{
this->loadIngredientsFromXml();
this->loadPizzasFromXml();
this->loadDrinksFromXml();
}
这种方法:
- 对我来说看起来更干净了,
- 不要创建不需要的对象,
- 而DataFromFileLoader看起来并不拥挤,然后第二种方法,因为方法是在parent classes中实现的。
或者按照我的方法去做,他们都必须实现 public 方法 loadXml()
,这是 AbstractReaderFromXml
的虚方法。然后我创建调用方法的对象。
private void loadMenuFromFiles()
{
IngredientFromXmlReader ingreRead;
ingreRead.loadXml();
PizzaReader pizzaRead;
pizzaRead.loadXml();
DrinksFromXmlReader drinksRead;
drinksRead.loadXml();
}
我为什么选择这个:
- 更坚持单一职责原则,职责更分离,有什么好处,
- 我没有机会在不需要的地方调用此方法,因为我需要对象才能这样做,
第三个选项是将这 3 个 classes 的所有内部方法设为静态,但我不太喜欢它。在我看来,应用程序要重得多,我尽量避免它。当然这是选项。
哪种方法更好?
最后一件事,如果这个问题适合 Whosebug 或者也许应该放在
我觉得这个问题中的问题描述不清楚。但在这种情况下,我强烈建议不要使用钻石继承。
继承演示了 IS-A 连接。 PizzaReader
在我看来实际上并不像 FileOpener
。 PizzaReader
使用 FileOpener
打开文件,对吧?这意味着这是 replacing inheritance with composition.
的一个很好的例子
我对判断有疑问 方法从设计、干净的代码 == 好的实践来看更好。
我在程序启动时从文件加载一些数据,classes 的结构如下所示:
更具体地说,IngredientFromXmlReader
、PizzaReader
、DrinksFromXmlReader
在内部完成所有工作,没有来自 DataFromFileLoader
的任何数据。
问号是 DataFromFileLoader
class 它应该继承自 PizzaReader
、IngredientFromXmlReader
、DrinksFromXml
并具有方法 loadMenuFromFiles
像这样:
private void loadMenuFromFiles()
{
this->loadIngredientsFromXml();
this->loadPizzasFromXml();
this->loadDrinksFromXml();
}
这种方法:
- 对我来说看起来更干净了,
- 不要创建不需要的对象,
- 而DataFromFileLoader看起来并不拥挤,然后第二种方法,因为方法是在parent classes中实现的。
或者按照我的方法去做,他们都必须实现 public 方法 loadXml()
,这是 AbstractReaderFromXml
的虚方法。然后我创建调用方法的对象。
private void loadMenuFromFiles()
{
IngredientFromXmlReader ingreRead;
ingreRead.loadXml();
PizzaReader pizzaRead;
pizzaRead.loadXml();
DrinksFromXmlReader drinksRead;
drinksRead.loadXml();
}
我为什么选择这个:
- 更坚持单一职责原则,职责更分离,有什么好处,
- 我没有机会在不需要的地方调用此方法,因为我需要对象才能这样做,
第三个选项是将这 3 个 classes 的所有内部方法设为静态,但我不太喜欢它。在我看来,应用程序要重得多,我尽量避免它。当然这是选项。
哪种方法更好?
最后一件事,如果这个问题适合 Whosebug 或者也许应该放在
我觉得这个问题中的问题描述不清楚。但在这种情况下,我强烈建议不要使用钻石继承。
继承演示了 IS-A 连接。 PizzaReader
在我看来实际上并不像 FileOpener
。 PizzaReader
使用 FileOpener
打开文件,对吧?这意味着这是 replacing inheritance with composition.