3

我的项目中有类似的东西,该项目已经完成(它正在工作)我只是想知道它是否符合 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,但是这个类是静态的,它包含彼此独立的静态方法,如果我为每个方法创建一个静态类,那是一样的

4

3 回答 3

8

据我所知,这里有很多 SOLID 违规行为!

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

我敢肯定还有其他一些,但这些是明显的。

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

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

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

其余的辅助方法确实属于扩展,所以它们很好。

于 2009-09-17T07:57:11.687 回答
2

根据您的示例,至少有一个 ISP 和一个 SRP 并且可能违反了 Demeter 法则(不是 SOLID 而是......)。

IMNSHO 你最好阅读关于 SOLID 的文章(或者购买Robert C. Martin 和 Micah Martin 的敏捷原则、模式和 C# 实践,这是我近年来读过的最有用的书之一)而不是在互联网上为这类事情寻求零碎的建议。

如果您想要捷径(尽管您不想要 - 书籍和 PDF 中有很好地解释事情的示例!),鲍勃叔叔的这些 Hanselminutes 播客非常好:

编辑:从Jon Limjapppiotrowicz那里获得了 SRP

于 2009-09-17T07:51:59.137 回答
0

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

  • 它不遵循单一责任原则,因为我没有做至少 3 件不同的事情(退货、退货、字符串操作?)
  • 不开放扩展违反了开放封闭原则
于 2009-09-17T07:56:42.070 回答