【发布时间】:2012-05-23 20:12:22
【问题描述】:
我正在尝试掌握 Open/Closed 原则(在我的 PHP 案例中,但这并不会真正产生影响)。
我的理解是一个类从不开放修改。仅用于错误修复。如果我想向该类添加新代码,那么我必须创建一个新代码并扩展“旧”类。这是我可以添加新代码的唯一方法。
在某种程度上我可以看到这样做的好处。因为基本上你创建了某种版本控制系统,旧代码总是可以工作,但你也可以尝试使用新类。
但这在实践中如何运作?我的意思是,假设我有以下课程:
class MyObject
{
public function doSomething()
{
echo 'Im doing something';
}
}
所以我可能在某个地方实例化了这个类:
$obj = new MyObject();
但后来我决定在该对象中使用另一种方法是件好事。所以我也可以做点别的。根据 OCP,我无法修改课程。所以我必须创建一个新的,延伸到旧的,对吧?
第一个问题。我如何称呼新班级?因为它实际上并不是一个完整的新对象。像。用户对象是用户对象。我不能因为它需要另一种方法就突然给它起一个完全不同的名字。无论如何,我创建了新类:
class MyNewObject extends MyObject
{
public function doSomethingElse()
{
echo 'Im doing something else now';
}
}
现在这也意味着我必须更改实例化“MyObject”类的代码行并将其替换为“MyNewObject”类,对吧..?如果这在不止一个地方完成,那么我必须搜索我的源代码......(想想控制器类中的一个方法,它几乎总是使用'new'关键字来实例化某些类)。
这同样适用于继承。我必须找到继承旧类的每个类,并且必须用新类替换它。
所以基本上我的问题是:
如何命名具有新方法的新类?只是因为我添加了一些新功能,并不意味着我可以给这个类一个全新的名字......
如果“旧”类是从多个地方实例化(或继承)的呢?那么我必须找到所有这些地方......哪里有收获?
【问题讨论】:
-
$x = new MyObj_version_3.14159265()?嗯。馅饼。 -
请注意,Open/closed principle 有两种解释方式。您似乎主要考虑的是较旧的(Meyers),而现在该用例通常由委托处理。
-
用一个更现实的例子来回答这个问题会更容易。我认为命名等会更明显。
标签: php oop open-closed-principle