gpt4 book ai didi

php - 开闭原则——如何调用新版本?

转载 作者:行者123 更新时间:2023-12-03 01:44:17 25 4
gpt4 key购买 nike

我试图掌握开放/封闭原则(在我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com