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など)があります。
  • インターフェース分離の原則の違反(ルーベンが述べたように)-私が製品だけに関心を持っていたのなら、なぜユーザーを獲得する方法に触れる必要があるのですか?

他にもあると思いますが、これらは明白なものです。

更新誰かがそれにコメントしたので、私は彼らが正しいと思います。上記のコードは、何らかの形の拡張メソッドの悪用のように見えます。

たとえば、データアクセスを拡張メソッド、さらに悪いことに「Tools」という名前のクラスに追いやるべきだとは思いません。

データアクセスの一般性を抽象化する基本クラス(まったく異なる名前空間やアセンブリ上)を用意し、一意のドメインオブジェクト(UserDAO、ProductDAOなど)ごとに1つのデータアクセスクラスを継承する方がおそらく理にかなっています。 。ここでの私の仮定は、GetProductまたはGetUserとは、実際にはGetFromDatabaseを意味するということを理解してください。

残りのヘルパーメソッドは拡張機能に属しているため、問題ありません。

于 2009-09-17T07:57:11.687 に答える
2

あなたの例に基づいて、間違いなくISPとSRP、そしておそらくデメテルの法則(SOLIDではありませんが...)の違反が少なくとも起こっています。

IMNSHO SOLID に関する記事を読んだ方がはるかに良いでしょう (または、Robert C. Martin と Micah Martin による C# の Agile Principles, Patterns, and Practices を購入します。これは、全体を通して優れており、私が最近読んだ中で最も役立つ本の 1 つです)。この種のことについてインターウェブで断片的なアドバイスを求めるよりも。

ショートカットが必要な場合は (必要ありません。本や PDF には、物事を非常によく説明する例があります!)、Bob おじさんとのこれらの Hanselminutes ポッドキャストは非常に優れています。

編集: Jon Limjapppiotrowiczから SRP を取得しました

于 2009-09-17T07:51:59.137 に答える
0

多くの点でSOLIDの原則に違反しています。

  • 私は少なくとも3つの異なること(製品の返品、顧客の返品、文字列操作?)を行っていないため、単一責任の原則に従っていません。
  • 延長のために開かれていないことにより、開放閉鎖原則に違反しています
于 2009-09-17T07:56:42.070 に答える