w00*_*w00 12 php oop open-closed-principle
我正在尝试掌握开放/封闭原则(在我的情况下是PHP,但这并没有真正有所作为).
我理解的方式是一个类永远不会被修改.仅用于修复错误.如果我想在课程中添加新代码,那么我必须创建一个新代码并扩展"旧"类.这是我可以添加新代码的唯一方法.
在某种程度上,我可以看到这种优势.因为基本上你创建了某种版本控制系统,旧代码总是可以工作,但你总是可以尝试使用新类.
但这在实践中如何运作?我的意思是,假设我有以下课程:
class MyObject
{
public function doSomething()
{
echo 'Im doing something';
}
}
Run Code Online (Sandbox Code Playgroud)
所以我可能在某个地方实例化这个类:
$obj = new MyObject();
Run Code Online (Sandbox Code Playgroud)
但后来我决定在该对象中使用另一种方法是件好事.所以我也可以做其他事情.根据OCP,我无法修改课程.所以我必须创建一个新的,延伸到旧的一个吧?
第一个问题.我怎么称呼新课程?因为它实际上不是一个完整的新对象.喜欢.User对象是User对象.我不能突然给它完全不同的名称,因为它需要另一种方法.无论如何,我创建了新类:
class MyNewObject extends MyObject
{
public function doSomethingElse()
{
echo 'Im doing something else now';
}
}
Run Code Online (Sandbox Code Playgroud)
现在这也意味着我必须更改我实例化"MyObject"类的代码行,并将其替换为"MyNewObject"类,对吧..?如果在不止一个地方完成,那么我必须搜索我的源代码...(想想控制器类中的方法,它几乎总是使用'new'关键字来实例化某些类).
这基本上适用于继承.我必须找到继承旧类的每个类,并且必须用新类替换它.
基本上我的问题是:
你如何命名具有新方法的新类?只是因为我添加了一些新功能,并不意味着我可以给全班一个全新的名字......
如果"旧"类从多个地方实例化(或继承),该怎么办?然后我必须找到所有这些地方......收益在哪里?
开闭原则无意用作一种版本控制系统。如果您确实需要对班级进行更改,请继续进行这些更改。您不需要创建新类并更改实例化旧类的所有位置。
开闭原则的要点是,设计良好的系统不应要求您更改现有功能以添加新功能。如果要向系统添加新类,则不需要搜索所有代码来查找需要引用该类或有特殊情况的位置。
如果类的设计不够灵活,无法处理某些新功能,那么请务必更改类中的代码。但是,当您更改代码时,请使其灵活,以便将来可以在不更改代码的情况下处理类似的更改。它是一项设计政策,而不是阻止您进行更改的手铐。通过良好的设计决策,随着时间的推移,当您向系统添加新功能时,您现有的代码将需要越来越少的更改。这是一个迭代的过程。