不确定我是否选择了正确的标题。但无论如何。
我必须支持并开发已有的项目。
它建立在OOP之上。
我有订单,产品等型号。它们经常用于代码中。
每个模型都绑定到相应的表。
客户希望将新类型的客户集成到系统中。 这类客户拥有与之相关的不同数据,并订购完全不同类型的产品。所以订单看起来会有所不同。
我决定不将旧的秩序和新的秩序混合在一起。首先,我将它们放入分离的表中,以便不破坏工作系统并为它们创建不同的类。
现在我有型号Order.php和OrderNew.php,Product.php和ProductNew.php等等。
我是全局设置对象,其中属性包含我需要实例化的类型。
现在我已经搞砸了很多代码:
if ($global->object->isNewKindOfCustomer()) {
$product = new ProductNew;
} else {
$product = new Product;
}
但是在很多地方这样做我强烈感觉我做了一件非常错误的事。
所以我的第一个想法是应该由类Product决定应该实例化什么样的产品。
如果我可以转到旧的Product类并在其构造函数中执行并执行某些操作,那将是完美的:
Class Product {
__construct() {
if ($global->object->isNewKindOfCustomer()) {
$product = new ProductNew;
} else {
$product = new Product();
}
}
}
此外,我将从Product继承ProductNew并重新定义需要更改的所有方法。类似的东西:
Class ProductNew extends Product {
public methodsDefinedInProductButInNeedToBeChangedForProductNew (){
}
}
但问题是我没有设法在PHP中找到一种理智的方式,它仍然闻起来不太好。但比第一种方法好得多(至少对我而言)。
第三个想法是,我现在将创建ProductNew类,但也创建ProductOld类(不存在但我本身得到的东西)。
我会将当前Product类的所有代码移动到ProductOld。 所以我目前的Product类没有方法。它会变空。 此外,ProductNew将继承自ProductOld。
有了这样的计划,我根本不会触及整个系统的代码。 在代码中的任何地方,配置都将具有以下外观
$product = new Product
并且在内部我将需要以某种方式管理将在Product构造函数中创建的对象。
第四个想法是,我将首先创建一个泛型类,并将其命名为例如产品一般。它将包含与ProductNew和ProductOld类相关的方法。他们都将扩展ProductGeneral。而在Product内部,只会根据当前用户的角色实例化适当的类。虽然我不确定ProductGeneral是否如此必要......
仍然不知道如何在Product类中替换它。我记得它在C ++中被称为动态绑定。
有没有更好的解决方案来解决这个问题?我错过了什么吗?
很抱歉,我试图让它尽可能短。
答案 0 :(得分:2)
if ($global->object->isNewKindOfCustomer()) { $product = new ProductNew; } else { $product = new Product; }
但是在很多地方这样做我强烈感觉我做了一件非常错误的事。
我同意。这就是压倒一切的原因
Assimung $global->object
的类型为Customer
,添加您可以根据需要覆盖的方法newProduct
:
class Customer
{
public function newProduct()
{
return new Product();
}
}
class CustomerNew extends Customer
{
public function newProduct()
{
return new ProductNew();
}
}
然后,您必须准确检查一次是处理新客户类型还是旧客户类型(在实例化Customer
或CustomerNew
时),而不是再次。
这基本上就是“工厂模式”,而不是一个单独的类。
此外,我建议您不要使用“普通”旧类和新的重写类,而是将所有共同点移动到新的基类,例如
abstract class CustomerBase
{
// Define here all methods that Customer and CustomerNew have in common
// And make "implementation-dependent" methods abstract:
public abstract function newProduct();
}
class Customer extends CustomerBase
{
public function newProduct()
{
return new Product();
}
}
class CustomerNew extends CustomerBase
{
public function newProduct()
{
return new ProductNew();
}
}
这将是一个“更清晰”的实现(语义上),您仍然不必用Customer
或其他东西替换代码中的每个CustomerOld
。
我建议您使用Product
执行相同的操作,而不是仅仅覆盖“默认”中的方法
答案 1 :(得分:1)
您可能希望Product
类包含所有基本函数,ProductOld
具有特定于该类的函数,以及ProductNew
具有特定于该类的函数。此外,ProductFactory
将返回您需要的产品类。
如果没有看到代码,就很难说上面是否最好,或只是extend
Product
类,并且ProductFactory
。
答案 2 :(得分:1)
哦不:(完全错了。
Class Product {
__construct() {
if ($global->object->isNewKindOfCustomer()) {
$product = new ProductNew;
} else {
$product = new Product();
}
}
}
你从哪里得到$global
?它不在你的构造函数中。你无法从任何地方获得实例。这会产生untestable code。
您正在寻找factory pattern。