- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图掌握开放/封闭原则(在我的 PHP 例子中,但这应该不会真正产生影响)。
我的理解是,类从不开放进行修改。仅用于错误修复。如果我想向类添加新代码,那么我必须创建一个新代码并扩展“旧”类。这是我向其中添加新代码的唯一方法。
在某种程度上我可以看到这样做的优点。因为基本上您创建了某种版本控制系统,旧代码始终可以工作,但您也可以随时尝试使用新类。
但是这在实践中是如何运作的呢?我的意思是,假设我有以下类(class):
class MyObject
{
public function doSomething()
{
echo 'Im doing something';
}
}
所以我可能在某个地方实例化这个类:
$obj = new MyObject();
但后来我决定在该对象中使用另一个方法是件好事。所以我也可以做点别的事情。根据 OCP,我无法修改该类。所以我必须创建一个新的,它可以扩展到旧的,对吗?
第一个问题。我如何称呼新类(class)?因为它并不是一个真正的全新对象。喜欢。用户对象是一个用户对象。我不能仅仅因为它需要另一种方法就突然给它完全不同的名称。不管怎样,我创建了新的类:
class MyNewObject extends MyObject
{
public function doSomethingElse()
{
echo 'Im doing something else now';
}
}
现在这也意味着我必须更改实例化“MyObject”类的代码行并将其替换为“MyNewObject”类,对吧..?如果这是在多个地方完成的,那么我必须搜索我的源代码...(考虑 Controller 类中的一种方法,它几乎总是使用“new”关键字来实例化某些类)。
这基本上也适用于继承。我必须找到继承旧类的每个类,并且必须用新类替换它。
<小时/>所以基本上我的问题是:
如何命名具有新方法的新类?只是因为我添加了一些新功能,并不意味着我可以给该类一个全新的名称......
如果“旧”类是从多个地方实例化(或继承)的,该怎么办?然后我就必须找到所有这些地方... yield 在哪里?
最佳答案
开闭原则无意用作一种版本控制系统。如果您确实需要对类(class)进行更改,请继续进行这些更改。您不需要创建新类并更改实例化旧类的所有位置。
开闭原则的要点是,设计良好的系统不应要求您更改现有功能以添加新功能。如果您要向系统添加新类,则不需要搜索所有代码来查找需要引用该类或有特殊情况的位置。
如果您的类的设计不够灵活,无法处理某些新功能,那么请务必更改类中的代码。但是,当您更改代码时,请使其灵活,以便将来可以在不更改代码的情况下处理类似的更改。它是一项设计政策,而不是阻止您进行更改的手铐。通过良好的设计决策,随着时间的推移,当您向系统添加新功能时,您现有的代码将需要越来越少的更改。这是一个迭代过程。
关于php - 开闭原则——如何调用新版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10727135/
我是一名优秀的程序员,十分优秀!