Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 可接受的最大子类数_Php_Laravel_Oop - Fatal编程技术网

Php 可接受的最大子类数

Php 可接受的最大子类数,php,laravel,oop,Php,Laravel,Oop,使用PHP Mess Detector,我发现了一条规则,告诉我重构一个包含15个以上孩子的类 在这个问题中,我的类是存储库的基类,它实现了每个存储库必须具有的各种方法 我的问题如下 我一直认为,在面向对象编程中,继承的最大优点是避免代码重复,因此,如果一个类被许多孩子使用,怎么会有问题呢 规则如下: 2. 我非常感谢任何帮助来澄清这个疑问。使用特质而不是课堂。特质没有限制 比如: 所以,你可以在所有类中使用它,比如 class child { use ParentTrait;

使用PHP Mess Detector,我发现了一条规则,告诉我重构一个包含15个以上孩子的类

在这个问题中,我的类是存储库的基类,它实现了每个存储库必须具有的各种方法

我的问题如下

我一直认为,在面向对象编程中,继承的最大优点是避免代码重复,因此,如果一个类被许多孩子使用,怎么会有问题呢

规则如下:


2.

我非常感谢任何帮助来澄清这个疑问。

使用特质而不是课堂。特质没有限制 比如:

所以,你可以在所有类中使用它,比如

  class child {
     use ParentTrait;
  }

使用trait而不是class。特质没有限制 比如:

所以,你可以在所有类中使用它,比如

  class child {
     use ParentTrait;
  }

继承也会出现问题很多继承会导致对底层代码的大量依赖,假设您有两个类,它们是父类的子类,您在父类中添加了功能,但您犯了一个错误,您将停止所有类,并且发生这种情况的机会随着层次结构的增长而增加。通常框架通过组合/聚合和依赖注入来解决它。

继承也会出现问题很多继承会导致对底层代码的依赖,假设您有两个类,它们是父类的子类,您在父类中添加了功能,但您犯了一个错误,您将停止所有类,并且发生这种情况的可能性随着层次结构的增长而增加。通常框架通过组合/聚合和依赖注入来解决它。

根据我使用嗅探器工具的经验,这与其说是一个错误,不如说是一种气味。我觉得你所做的设计选择是完全正确的,一个特性或任何其他解决方案更像是一种黑客行为

所以,把它告诉你的一切都考虑进去,分析它,如果你仍然觉得它是正确的方式,就保留它


气味可以是,如果你把一些东西推广到一般的领域,它可以用于许多不同的领域。因此,这可能是您应该设计的解决方法。

根据我使用嗅探工具的经验,这与其说是一个错误,不如说是一种气味。我觉得你所做的设计选择是完全正确的,一个特性或任何其他解决方案更像是一种黑客行为

所以,把它告诉你的一切都考虑进去,分析它,如果你仍然觉得它是正确的方式,就保留它



气味可以是,如果你把一些东西推广到一般的领域,它可以用于许多不同的领域。因此,这可能是您应该设计的解决方案。

谢谢您的帮助。使用一种特质可以解决问题。但是你能解释一下限制子类的原因吗?trait通常用于较小的任务和修改-添加行为它们是很好的工具,但我不会将其用于如此大的类层次结构。我觉得trait不应该在这种情况下使用。Traits是指当你在多个类中有你想要的一般性东西时。如果您希望模特发送电子邮件,这是一个很好的例子。创建一个SendEmail特性,并在应该使用的地方使用它。那么,您对他的问题有何建议?我已经回答了这个问题,但是说扩展存储库是一个公平的设计决策似乎是不可接受的。我觉得他在这件事上没有错。谢谢你的帮助。使用一种特质可以解决问题。但是你能解释一下限制子类的原因吗?trait通常用于较小的任务和修改-添加行为它们是很好的工具,但我不会将其用于如此大的类层次结构。我觉得trait不应该在这种情况下使用。Traits是指当你在多个类中有你想要的一般性东西时。如果您希望模特发送电子邮件,这是一个很好的例子。创建一个SendEmail特性,并在应该使用的地方使用它。那么,您对他的问题有何建议?我已经回答了这个问题,但是说扩展存储库是一个公平的设计决策似乎是不可接受的。我不觉得他在这一点上是错的。不同意这一点,虽然这当然取决于你的软件在很多情况下这可能是一个问题,但我觉得这与说模型扩展到很多或者BaseController类扩展到很多是一样的。不,他们不是。它们是框架发挥作用所必需的。我的经验还表明,你常常最终会在时间上建立更具体的存储库。@anjalis在BaseController的情况下,我们应该将其转换为trait吗?然后我们就失去了类的多态性?我不是说它应该转换为trait,如果你检查了我的答案,这就解释了为什么我不同意你的回答,但是你却不同意?如果他需要将一个未知的报告传递给一个类,那么将一个抽象类定义为参数是一个很好的设计。不要同意这一点,尽管它总是取决于你的软件在很多情况下这可能是一个问题,但是我觉得这和说模型扩展到了很多或者BaseController类扩展到了很多是一样的。不,他们不是。它们是框架发挥作用所必需的。我的经验还表明,你常常最终会在时间上建立更具体的存储库。@anjalis在BaseController的情况下,我们应该将其转换为trait吗?然后我们就失去了类的多态性?我不是说它应该转换为trait,如果你检查了我的答案,这就解释了为什么我不同意你的回答,但是你却不同意?如果他需要将一个未知的报告传递给一个类,那么让一个抽象类定义为一个参数是一个很好的设计。我从不使用
扩展
,我不使用traits,也不禁止抽象类。我有大量的接口和实现,每一个都清晰而集中,易于维护和测试。PHPMD在检查我的产品时没有什么可抱怨的