Php 实质违反原则

Php 实质违反原则,php,solid-principles,Php,Solid Principles,我有一个类“Image”,它有3个方法crop(),resize()和convert() 是否违反了单一责任原则 我应该把他们分成不同的班级吗 class Image{ public function crop() {} public function resize() {} public function convert() {} } Robert Martin将责任定义为更改的原因,并得出结论,一个类或模块应该有一个且只有一个更改(即重写)的原因 类需要重

我有一个类“Image”,它有3个方法
crop()
resize()
convert()

是否违反了单一责任原则

我应该把他们分成不同的班级吗

class Image{ 
     public function crop() {}
     public function resize() {}
     public function convert() {}
}
Robert Martin将责任定义为更改的原因,并得出结论,一个类或模块应该有一个且只有一个更改(即重写)的原因

类需要重写的唯一方法是处理图像的方式发生变化。因此,它永远不会违反单一责任模式

class Image{ 
....

public function sendImageMail(){}
}

例如,如果image类有一个通过电子邮件发送图像的方法,那么您将违反此原则,因为它有两个原因需要更改,一个是处理图像的方式,另一个是您需要更改电子邮件结构或格式。为了不违反单一责任原则,mail方法将被移动到另一个类。

是的,我想说它确实违反了一些原则:

SRP-是的,因为该类保存有关图像的信息,对其进行操作,转换为其他格式,这是大量的代码

Open/closed-是,因为在不修改类的情况下无法添加新功能(新操作、新转换格式)

Liskov置换,I界面分离,Dependendy注射-不适用

我会完全放弃这个类,转而使用内置类,并为操作部分创建一个接口

public function manipulate(\SplFileObject $file): void
以及转换部分:

public function convert(\SplFileObject $file): \SplFileObject

<强>我喜欢认为与盗版代码相似的实体原则,它们是“更像是准则而不是实际规则”< /强>,特别是当涉及到单一责任规则时。

我认为没有真正的理由创建CopyImage类、ResizeImage类和CropImage类。将这些项目组合在一起是有意义的,因为它们都与操纵图像有关

如果您过于明确地遵循单一责任原则,那么最终将得到一个CropLeftSide类CropRightSide类。。。等等


也就是说,如果这些方法使用不同的图像库或完全不同的方法来实现结果,我会将它们分开。例如:如果您使用ImageMagick库裁剪和调整图像大小,但在复制图像时使用了完全不同的方法,那么我会相应地拆分这些方法。这样,如果您更改复制图像的方法,则调整大小和裁剪的类不会更改。

不这样认为,使用具有适当方法的图像对象来更改图像是很常见的。因为我的类有三个方法,即裁剪()、调整大小()和转换(),现在根据SRP定义有三个理由进行更改。那么,这是否应被视为违反SRP?还是我不明白?我不太熟悉这个论点,所有有多个方法的类都有三个改变的原因。如果您根据jpg图像的行为实现该类,那么只有一个原因可以更改该类,那就是处理jpg图像的方式发生了变化。Simarily php库也以类似的方式实现了它,这只是使OOD变得非常重要。如果你看看干预是如何进行的,这与op的答案很接近,op的答案并没有让干预成为一段写得很好的OO代码。同意,但上面显示的设计比服务类方法要好,如果关注格式,让函数返回一个处理格式的新类。