静态工厂对业务对象违反单一责任原则?

时间:2009-03-20 20:47:14

标签: oop single-responsibility-principle

如果我在业务对象上放置“数据访问”方法,我是否违反了单一责任原则(SRP)?我的直觉是,如果在类本身上存在Load方法而不必猜测方法恰好位于哪个类中,那么API会让用户更加友好?

示例:

public class Image
{    
   public static Image FromFile(string filename)
   {
       return ImageLoader.LoadImage(filename)
   }

   public void SetPixel(int x, int y, Color color)
   {
   }
 }

4 个答案:

答案 0 :(得分:3)

我没有看到这个本身的问题,除了没有令人信服的理由让静态方法存在于Image类中(因为它不依赖于类中的任何东西) ,但在班级本身)。

如果你最终得到一堆load-from方法,那么在不同的类中它们可能会更好

答案 1 :(得分:1)

一般来说,我不认为知道如何通过单一路径(在这种情况下,从图像文件)创建自己的实例并确保有效状态必然会使SRP变形。如果你有这样的方法,那将是一个代码气味,然后你应该把提示分开。

答案 2 :(得分:1)

我认为它是静态的这一事实使它不那么“恶劣”违反SRP,但我不是最大的SOLID纯粹主义者。这种启发式方法不应过于虔诚......

答案 3 :(得分:1)

在某种程度上,是的,但它没有您想象的那么糟糕。任何原则都可以达到极端,使其不舒服。

问题是,如果您希望将它们分开,因为您希望将静态应用于其他图像,或者您希望实现可能适用于其他类型数据的更复杂的方法,那该怎么办。

一般来说,重构java是很容易的,我建议你现在使用有意义的东西,并且只要记得它可能会导致你的复杂化,就会重新审视它。