我有一个课程' Image'它有3种方法crop()
,resize()
和convert()
。
是否违反了单一责任原则?
我应该将它们分成不同的类吗?
class Image{
public function crop() {}
public function resize() {}
public function convert() {}
}
答案 0 :(得分:1)
我喜欢认为SOLID原则与Pirate Code类似,因为它们“更像指导方针而非实际规则”,尤其是涉及单一责任规则时。
我认为没有理由创建一个CopyImage类,一个ResizeImage类和一个CropImage类。将这些项目组合在一起是有意义的,因为它们都与操作图像有关。
如果您过于明确地遵循单一责任原则,您将最终获得CropLeftSide类,CropRightSide类......等。
话虽如此,如果他们使用不同的图像库或完全不同的方法来完成结果,我会将这些方法拆分。例如:如果您使用ImageMagick库裁剪和调整图像大小,但使用完全不同的东西来复制图像,那么我会相应地拆分这些方法。这样,如果您更改复制图像的方法,则调整大小和裁剪的类不会更改。
答案 1 :(得分:0)
罗伯特·马丁将责任定义为改变的理由,并得出结论认为一个阶级或模块应该只有一个理由被改变(即重写)。
https://en.wikipedia.org/wiki/Single_responsibility_principle
您的课程需要重写的唯一方法是您处理图片的方式是否发生变化。因此,它永远不会违反单一责任模式。
class Image{
....
public function sendImageMail(){}
}
如果图像类具有通过电子邮件发送图像的方法,那么您将违反此原则,因为它有两个原因需要更改,包括处理图像的方式,以及是否需要更改电子邮件结构或格式。为了不违反单一责任原则,邮件方法将被转移到另一个类。
答案 2 :(得分:0)
是的,我会说这肯定违反了许多原则:
S RP - 是的,因为该类保存有关图像的信息,操纵它,转换为其他格式,这是很多代码
O 笔/关闭 - 是的,因为您无法在不修改类的情况下添加新功能(新操作,新转换格式)
L iskov替代, I nterface隔离, D ependendy注射 - 不适用
我完全放弃这个类而不是内置SplFileObject并为操作部分创建一个接口
public function manipulate(\SplFileObject $file): void
和转换部分:
public function convert(\SplFileObject $file): \SplFileObject