それに対する明確な答えはありません。質問は狭いですが、説明はそうではありません。
私にとっては、オッカムのかみそりのようなものです。現在のコードを測定しようとするのに理想的です。簡潔で単純な言葉で特定するのは困難です。もう1つのメタファーは、「1つのトピック」であり、「単一の責任」と同じくらい抽象的、つまり把握が困難です。3番目の説明は、「1レベルの抽象化を扱う」ことです。
それは実際にはどういう意味ですか?
最近、ほとんど2つのフェーズで構成されるコーディングスタイルを使用しています。
フェーズIは、創造的なカオスとして最もよく説明されます。このフェーズでは、考えが流れるようにコードを書きます。つまり、生でrawいです。
フェーズIIは完全に反対です。それはハリケーンの後に掃除するようなものです。これには最も多くの作業と規律が必要です。そして、デザイナーの観点からコードを見ていきます。
現在、主にPythonで作業しています。これにより、後でオブジェクトやクラスについて考えることができます。最初のフェーズI-関数のみを記述し、それらを異なるモジュールにほぼランダムに広げます。では、フェーズII、私は行く事を得た後、私は解決策のどの部分でどのようなモジュール取引をよく見ています。そして、モジュールをざっと見ていくうちに、トピックが浮かび上がってきます。一部の機能はテーマ的に関連しています。これらはクラスの良い候補です。そして、関数をクラスに変換した後-ほぼインデントとself
pythonのパラメーターリストへの追加で完了します;)- SRP
OccamのRazorのように他のモジュールとクラスの機能を削除します。
現在の例は、先日小さなエクスポート機能を書くことです。
zip内にcsv、excelおよび結合されたexcelシートが必要でした。
単純な機能はそれぞれ3つのビュー(=機能)で行われました。各関数は、フィルターを決定するための一般的な方法と、データを取得するための2番目の方法を使用しました。次に、各機能でエクスポートの準備が行われ、サーバーからの応答として配信されました。
抽象化のレベルが多すぎます:
I)着信/発信のリクエスト/レスポンスの処理
II)フィルターの決定
III)データの取得
IV)データの変換
簡単なステップは、1つの抽象化(exporter
)を使用して、最初のステップでレイヤーIIからIVを処理することでした。
残っているのは、リクエスト/レスポンスを扱うトピックのみです。同じレベルの抽象化では、要求パラメーターを抽出しますが、これは問題ありません。ですから、私はこの見方のために「責任」を持ちました。
次に、エクスポーターを分割する必要がありました。これは、少なくとも3つの抽象レイヤーで構成されていました。
フィルター条件と実際の検索の決定は、ほぼ同じレベルの抽象化に基づいています(フィルターは、データの正しいサブセットを取得するために必要です)。これらのレベルは、データアクセスレイヤーのようなものに配置されました。
次のステップで、実際のエクスポートメカニズムを分解しました。一時ファイルへの書き込みが必要な場合、それを2つの「責任」に分割しました。
クラスとモジュールの形成に伴い、物事はより明確になり、どこに属していたのかが明らかになりました。そして、クラスがやり過ぎかどうか、常に潜在的な質問です。
各クラスが持つべき責任をどのように決定し、SRPのコンテキストで責任をどのように定義しますか?
従うべきレシピを与えるのは難しい。もちろん、私は不可解な»1レベルの抽象化«-それが助ければルールを繰り返すことができます。
私にとっては、それは現在のデザインにつながる一種の「芸術的直観」です。アーティストが粘土を彫ったり、絵を描いたりするようなコードをモデル化します。
コーディングボブロスとして私を想像してください;)