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

Oop 静态工厂对业务对象违反单一责任原则?,oop,single-responsibility-principle,Oop,Single Responsibility Principle,如果我将“数据访问”方法放在业务对象上,是否违反了单一责任原则(SRP)?我的直觉是,如果Load方法出现在类本身上,而不是必须猜测该方法恰好在哪个类中,那么API会感觉更加用户友好 例如: public class Image { public static Image FromFile(string filename) { return ImageLoader.LoadImage(filename) } public void SetPixel

如果我将“数据访问”方法放在业务对象上,是否违反了单一责任原则(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)
   {
   }
 }

我认为这本身没有问题,只是静态方法没有令人信服的理由存在于Image类中(因为它不依赖于类中的任何内容,而是依赖于类本身)


如果你最终得到了一堆loadfrom方法,那么它们在不同的类中可能会更好。一般来说,我不认为知道如何通过单个路径(在本例中,从图像文件)创建自己的实例并确保有效状态必然会使SRP紧张。如果你有大量这样的方法,那将是一种代码味道,然后你应该接受提示,将它们分开。

我认为它是静态的,这一事实使它不那么“惊人”违反SRP,但我不是最大的纯粹主义者。这种启发法不应该太虔诚……

某种程度上,是的,但它并不像你想象的那么糟糕。任何原则都可能被带到一个让人不舒服的极端

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


一般来说,重构java很容易,我建议你现在就去做有意义的事情,只要记得在它可能会导致撤销复杂性的时候重新访问它。

@John当你开始为此添加一系列单独的方法(即使它们在自己的类中)时,你同意这是一种调用气味,这种气味正是因为这个班级正在做一些事情。@Freddy:我想说的是,虽然有理由说,从外部数据流中获取水分可能不是你的责任,但这种情况并不一定是坏事。