Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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 - Fatal编程技术网

Oop 动态设计模式

Oop 动态设计模式,oop,design-patterns,Oop,Design Patterns,我有一个名为“Employee”的类。类中有一个名为getAgentsByHierarchy的方法,它返回一个包含所有代理及其相应ID和一些其他信息的数组 Array{ [0] => Array{ [0] => code [1] => id [2] => name [3] => role } } 我将此扩展到两个名为“Production”和“Payroll”的类。这两个类具有

我有一个名为“Employee”的类。类中有一个名为getAgentsByHierarchy的方法,它返回一个包含所有代理及其相应ID和一些其他信息的数组

Array{              
  [0] => Array{
     [0] => code
     [1] => id  
     [2] => name    
     [3] => role
  }
}
我将此扩展到两个名为“Production”和“Payroll”的类。这两个类具有fetchAll()方法,该方法调用Employee.getAgentsByHierarchy(),并获取所有代理和一个额外的数据/字段

因此,当我调用Production.fetchAll()时,它应该返回以下内容:

Array{              
 [0] => Array{
    [0] => code
    [1] => id   
    [2] => name 
    [3] => role
    [4] => production_figures_in_digits
 }
}
Array{              
 [0] => Array{
    [0] => code
    [1] => id   
    [2] => name 
    [3] => role
    [4] => payroll_figures_in_digits
 }
}
当我调用Payroll.fetchAll()时,它应该返回以下内容:

Array{              
 [0] => Array{
    [0] => code
    [1] => id   
    [2] => name 
    [3] => role
    [4] => production_figures_in_digits
 }
}
Array{              
 [0] => Array{
    [0] => code
    [1] => id   
    [2] => name 
    [3] => role
    [4] => payroll_figures_in_digits
 }
}
我如何进行这种设计

我的解决方案是在getAgentsByHierarchy()方法中包含一个参数,用于检查被调用方是来自生产类还是来自工资单类,以便它知道返回什么数据。但是我认为这种方式不是OOP方式,因为如果有一个扩展Salesforce的新类,我必须再次硬编码getAgentsByHierarchy(),以满足新类的要求


另外,我对设计模式还不熟悉,请原谅我写标题的方式。

如果
生产
有信息,要降低耦合,请这样做

Production.fetchAll() {
    Employee.getAgentsByHierarchy();
    Production.getFiguresInDigits();
    // some method to combine them then return
}

Payroll

一样,在理想的面向对象的书面应用程序中,父类永远不应该关心其子类的行为。继承的子类必须遵守父类的约定

所以Employee类不应该关心Production、Payroll或从Employee类继承的任何其他类的存在


理想情况下,应在Production and Payroll(或任何其他未来子类)中重写getAgentsByHierarchy,以将特定于它们的信息嵌入到数组中。

哪个类具有
生产数字和
工资数字的信息,
Class Employee
是否存储了所有信息?@lostyzd,我会在生产类中使用一个方法,返回员工的生产数据。payroll_figures也是一样,即payroll类中的一个单独方法返回payroll_figures。生产本身可以获取员工的数字,而无需调用employee?@lostyzd中的某个方法,但它必须首先知道从哪个员工获取数字。这就是getAgentsByHierarchy()的作用。它读取数据库并检索agents表中的所有代理。但是,如果我执行Production.fetchAll()之类的操作,它将使用与getAgentsByHierarchy()相同的代码,但每次检索代理信息时,它都会调用另一个方法来检索和计算该代理的生产数据。只有在存在“是”关系时才应使用继承。否则,作曲是通往成功的途径。是的,我可以做到。但这样做需要两次迭代。第一次迭代,获取所有代理。第二次迭代,循环遍历代理数组,得到它们各自的图形。我正在寻找一种方法,只对这个问题进行一次迭代。@pneftali据我所知,如果使用
Production.fetchAll()
,您仍然需要两次或更多的迭代。我想您是对的。但我的设计应该尽可能避免使用两个或更多的循环。“代理”表当前的行数不足1k。但是,productions表将继续随时间扩展。目前,它有12k行。我还在想一个更好的设计。@pneftali你的意思是有一个表存储所有东西,比如
代理id
生产数字和
工资数字。员工、生产和工资单。员工包含员工的所有基本信息。生产包含关于每个员工输出的所有时间戳记录。Payroll表也是如此。是的,我想在Production和Payroll类中重写getAgentsByHierarchy()。但问题是,我将只添加一两行代码,而不是完全更改代码。我还应该这样做吗?是的,你应该这样做,事实上,你必须在重写的函数中编写一些代码是件好事:)在更多地阅读oop和设计模式之后,我不应该首先使用继承,因为产品和工资单不是Salesforce。我在考虑作文,因为Salesforce有一个制作和工资单。。。这有意义吗?