2015-11-15 22 views
0

我有法官女巫方法问题从设计,干净的代码==好的做法更好。oop继承方法vs仅仅让对象在调用它的类中调用方法

我从我的程序和类结构的启动文件加载一些数据看起来是这样的:enter image description here

更具体IngredientFromXmlReaderPizzaReaderDrinksFromXmlReader内部完成所有的工作,而不DataFromFileLoader推杆任何数据。

问号是DataFromFileLoader类它应该从PizzaReaderIngredientFromXmlReaderDrinksFromXml继承和有方法loadMenuFromFiles这样的:

private void loadMenuFromFiles() 
{ 
    this->loadIngredientsFromXml(); 
    this->loadPizzasFromXml(); 
    this->loadDrinksFromXml();  
} 

这种方法:

  • 看起来更干净对我来说,
  • 不创建不需要的对象,
  • 和Da taFromFileLoader不会看起来更拥挤,然后是第二种方法,因为方法是在父类中实现的。

或者只是做了我该怎么做是正确的认识,它们都必须实现公共方法loadXml(),这是AbstractReaderFromXml虚方法。然后我创建调用方法的对象。

private void loadMenuFromFiles() 
    { 
     IngredientFromXmlReader ingreRead; 
     ingreRead.loadXml(); 
     PizzaReader pizzaRead; 
     pizzaRead.loadXml(); 
     DrinksFromXmlReader drinksRead; 
     drinksRead.loadXml(); 
    } 

我为什么选择这样的:

  • 它更坚持单一职责原则,职责更加分离,有什么优势,
  • 我不给一个机会来调用这个方法在不需要的地方,因为我需要这样做,

第三个选项是使静态这三个类的所有内部方法,但我不喜欢它非常。在我看来,应用程序的重量要大得多,我尽量避免它。确定这是选项。

什么方法更好?

的最后一件事,如果这个问题适合计算器或者它应该

放在

https://softwareengineering.stackexchange.com/

+2

DR; TL;你没听说C++应该避免[钻石继承](https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem)。 – 101010

+0

@ 101010是的我听说过,但是如果我想从这3个类继承,我不会在类AbstractReaderFromXml中创建任何虚拟方法,所以它看起来像在类IngredientFromXmlReader中 - 方法loadIngredietnsFromXml代替这个虚拟构造loadXml – MyWay

+0

@101010 Thx表示良好的论点,第二个选项比第一个更好。 DR和TL的含义是什么? – MyWay

回答

0

在这个问题问题描述看起来我不清楚。但在这种情况下,我强烈建议不要钻石继承。

继承演示IS-A连接。 PizzaReader对我来说实际上并不像FileOpenerPizzaReader利用FileOpener打开文件,对吧?这意味着这是replacing inheritance with composition的一个很好的例子。

+0

也许,更好的想法是,如果我只是链接代码。你是对的,PizzaReader使用FileOpener的方法,thx求助,我会重构我的代码。 – MyWay

+0

@MyWay欢迎您。不要忘记,如果他们帮助你,你可以在这里标记答案。 –