这违反了SOLID原则吗?

时间:2009-09-17 07:48:56

标签: c# oop solid-principles

我的项目中有这样的东西,项目已经完成了(它正在运行) 我只想知道SOLID原则是否合适

static public class Tools
{
    static public GetProduct(this id){...}

    static public GetProductCategory(this id){...}

    static public GetUser(this id){...}

    // I also have here methods like IsStringNull ...
    // IsNull IsFalse, lots of stuff, everything static
}

,用法就是这样

var UserThatCreatedCategoryForThisProduct = 
      prodId.GetProduct().CategoryId.GetProductCategory().Creator.GetUser();

我知道很明显它违反了SRP,但是这个类是静态的,并且它包含彼此独立的静态方法,如果我为每个方法创建一个静态类,它就是一样的

3 个答案:

答案 0 :(得分:8)

我可以看到,这里有很多SOLID违规行为!

  • 违反单一责任原则 - 首先你有几个类的数据访问方法,其次你有辅助方法(IsStringNull,IsNull等)与它们交织在一起。
  • 违反接口分离原则(如Ruben所述) - 如果我只关注产品,为什么我需要接触获取用户的方法?

我确信还有其他一些,但这些都是明显的。

更新现在有人对此发表了评论,我认为他们是对的;上面的代码看起来像某种形式的扩展方法滥用

例如,我不认为数据访问应该降级为扩展方法,或者更糟糕的是,名为“工具”的类。

有一个基类(在一个完全不同的命名空间和/或程序集上)抽象你的数据访问一般性,然后为每个唯一的域对象继承一个数据访问类(例如,UserDAO,ProductDAO)可能更有意义。等)。请理解我的假设是GetProduct或GetUser实际上是指GetFromDatabase。

其余的辅助方法确实属于扩展,所以它们没问题。

答案 1 :(得分:2)

根据你的例子,肯定有一个ISP和一个SRP,可能至少有一个Demeter法(不是SOLID但是......)违规行为。

IMNSHO你最好不要阅读关于SOLID的文章(或购买Agile Principles, Patterns, and Practices in C# by Robert C. Martin and Micah Martin,这是一本非常好的文章,也是我近几年阅读过的最有用的书之一),而不是要求关于互联网的零碎建议。这种事情。

如果你想要一个快捷方式(你没有 - 书籍和PDF都有可以解释事情的例子!),这些带有叔叔鲍勃的Hanselminutes播客非常好:

编辑:从Jon Limjapppiotrowicz

抓取SRP

答案 2 :(得分:0)

它在很多方面违反了SOLID原则。

  • 它没有遵循单一责任原则,因为我至少做了3件不同的事情(退回产品,回头客,字符串操作?)
  • 违反开放封闭原则,因为没有开放延期