単一の責任は、単一の機能が果たすことができるものではないかもしれません。
class Location {
public int getX() {
return x;
}
public int getY() {
return y;
}
}
このクラスは、単一の責任原則を破るかもしれません。それは2つの機能を持っていますが、コードの場合のためではないので、getX()
およびgetY()
変更を要求することができるさまざまなステークホルダーを満足しなければなりません。X副社長がすべての数字を浮動小数点数で表すメモを送信し、経理部長のY夫人が、X氏の考えがどうであれ、部門のレビューはすべて整数のままにすることを主張する場合、このクラスは混乱を招きそうなため、誰に責任があるのかという単一のアイデア。
SRPがフォローされていた場合、LocationクラスがX氏と彼のグループがさらされていることに貢献するかどうかは明らかです。クラスが何を担当しているかを明確にし、どのクラスがこのクラスに影響するかを知ってください。両方がこのクラスに影響を与える場合、変更の影響を最小限に抑えるように設計が不十分でした。「クラスには変更する理由が1つだけあるはずです」とは、クラス全体が1つの小さなことしかできないという意味ではありません。つまり、クラスを見て、X氏とY氏の両方がこのクラスに興味を持っていると言ってはいけません。
そのようなもの以外。いいえ、複数の方法で十分です。クラスに属するメソッドとそうでないメソッドを明確にする名前を付けてください。
ボブおじさんのSRPは、カーリーの法則よりもコンウェイの法則についてのことです。ボブおじさんは、クラスではなく関数にカーリーの法則を適用することを提唱しています。SRPは、一緒に変更する理由を混在させることに注意します。コンウェイの法則によると、システムは組織の情報がどのように流れるかに従っています。あなたが聞いたことがないことを気にしないので、それはSRPに従うことにつながります。
「モジュールは、ただ一人のアクターに責任があるべきです」
ロバートCマーティン-クリーンアーキテクチャ
人々は、範囲を制限するあらゆる理由についてSRPを望み続けています。スコープを制限する理由は、SRPよりも多くあります。さらに、クラスを抽象化して、内部を見ても驚くことのない名前をとることができるように、スコープを制限します。
カーリーの法則をクラスに適用できます。あなたはボブおじさんが話していることの外にいますが、あなたはそれをすることができます。間違っているのは、1つの機能を意味していると考え始めるときです。これは、家族には子供が1人しかいないと考えるようなものです。複数の子供を持つことは、それが家族であることを止めません。
クラスにカーリーの法則を適用する場合、クラス内のすべては単一の統一アイデアに関するものでなければなりません。そのアイデアは広範です。アイデアは永続性かもしれません。いくつかのロギングユーティリティ関数がそこにある場合、それらは明らかに不適切です。このコードを気にするのはX氏だけかどうかは関係ありません。
ここで適用する古典的な原則は、懸念の分離と呼ばれます。すべての懸念を分離する場合、1つの場所に残っているものが1つの懸念であると主張できます。1991年の映画City SlickersがCurlyというキャラクターを紹介する前に、私たちはこのアイデアを呼んでいました。
これは結構です。それは、ボブおじさんが責任と呼ぶものが懸念ではないということです。彼への責任はあなたが焦点を合わせたものではありません。それはあなたを変えることを強いることができるものです。1つの懸念事項に焦点を当てながら、さまざまなアジェンダを持つ人々のさまざまなグループに責任を持つコードを作成できます。
たぶん、あなたはそれを気にしません。いいよ 「1つのことをする」ことで、設計上のすべての問題を解決できると考えると、「1つのこと」が何であるかについての想像力が失われます。範囲を制限するもう1つの理由は組織です。ジャンクドロワーにすべてがいっぱいになるまで、多くの「1つのモノ」を他の「1つのモノ」の中にネストできます。私は前にそれについて話しました
もちろん、スコープを制限する古典的なOOPの理由は、クラスにプライベートフィールドがあり、ゲッターを使用してそのデータを共有するのではなく、そのデータを必要とするすべてのメソッドをプライベートにデータを使用できるクラスに配置することです。一緒に属するすべてのメソッドがまったく同じフィールドを使用するとは限らないため、多くの人はこれをスコープリミッターとして使用するには制限が強すぎると感じています。データをまとめるアイデアが、メソッドをまとめるアイデアと同じになるようにしたいのです。
これを見るための機能的な方法は、a.f(x)
それa.g(x)
は単にf a(x)とg a(x)です。2つの関数ではなく、一緒に変化する一連の関数のペア。ザ・はa
もそれにデータを持っている必要はありません。単純に、どの方法f
とg
実装を使用するかを知ることができます。一緒に変化する機能は一緒に属します。それは古き良きポリモーフィズムです。
SRPは、範囲を制限する多くの理由の1つにすぎません。それは良いものです。しかし、それだけではありません。