ホーム>source

単一の責任ルールに固執しようとしている間、私のクラスはこのように見え始めました

<前>ウィズウィズ

これは1つのサンプルにすぎません。 表面上は、非常にシンプルでテスト可能なクラスを提供しているため、すべてがかっこよく見えます。ただし、コードの読みやすさや使いやすさに気付かれないように気をつけてください。アップロードされたファイルの単純な初期化(上記のコードに示されているように)を処理する場合でも、無数のコード行を記述する必要があります。

私は何かがおかしいと感じ始め、単一責任原則の概念を誤解しました。

それは、各クラスに対して単一の責任を持つ純粋なOOPがどのように処理されるのですか、それとも私は適格ではありませんか?

$productImage = new ProductImage(// holds all rules for product image only new ImageFile( // makes sure given file is an image file new ReadableFile( // checks given item is a readable file / permissions check new UploadedFile( // validates given file is uploaded file new FilePath( // validates given string is a valid file path new Path( // validates for string to be a path new NonEmptyString( // given string is not empty '/tmp/xyzk7kjnbrukhg' ) ) ) ) ) ) );
あなたの答え
  • 解決した方法 # 1

    あなたは完全に SRP から離れています  ( Single Responsibility Principle )。どのように SRP  仕事はあなたのコードでは全く見られません。彼らがさまざまな仕事を担当するクラスを持っているのは問題ありません。多分または私は推測しますが、それらは SRP を尊重することによって実装されます 。 SRPの可視性は、想定を除いて、コードでははるかに少なくなります。

    ウィズウィズで 、クラスは他のクラスに依存しています。それは完全に正常です。ウィズウィズ  あなたのコードで完全に見られます。しかし、あなたは OOP を維持することはできません  複雑な構造を構築するときと同じように、コンストラクターメソッドを使用します。次のようにしてください。

    <前>ウィズウィズ

    しかし、これはこれを行うための正しい方法ではありません。これを適切に行うには、 Dependency Injection を使用する必要があります 。ウィズウィズ  実際に他のオブジェクトを作成します。ファクトリメソッドパターンの実装があり、それが Dependency Injection の作成を担当するとします   <?php // given string is not empty $nonEmptyString = new NonEmptyString('/tmp/xyzk7kjnbrukhg'); // validates for string to be a path $path = new Path($nonEmptyString); // validates given string is a valid file path $filePath = new FilePath($path); // validates given file is uploaded file $uploadedFile = new UploadedFile($filePath); // checks given item is a readable file / permissions check $readableFile = new ReadableFile($uploadedFile); // makes sure given file is an image file $imageFile = new ImageFile($readableFile); // holds all rules for product image only $productImage = new ProductImage($imageFile); としてのオブジェクト   Factory Method Design Pattern の依存関係があります 。次のコードスニペットで必要なすべてのクラスをインポートしたと仮定します。

    <前>ウィズウィズ

    ああ! Factory Method Design Pattern のメディアに書き込みがあります 。あなたがそれを読むかもしれない場合。こちらがSRPのリンクです

    これがあなたに役立つことを願っています!ハッピーコーディング!

    ImageFile

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ javascript - なぜそれが異なる結果を返すのですか? (es6矢印機能)