web-dev-qa-db-ja.com

メソッドまたは関数が1つのことを行うとはどういう意味ですか?

メソッドまたは関数は1つのことだけを行うべきだと言うとき、それはどういう意味ですか?

名前がまとまりさえあれば、いくつかのことができますか?

「と」という言葉を含むルーチンを避けるべきですか?

具体的な例を挙げてください。

注:この質問を単一の責任の原則と混同しないでください。これはクラスに関するものであり、"クラスは1つのことだけを行う必要がある"を意味するものではありません。

5
Piovezan

「ごみを出す」と言ったら、一つお願いします。それは一つのまとまりのあるアイデアです。それはそれ以上分解できないということですか?番号。

すべてをより多くのものに分解できます。この関数は、1つのことを行う必要があると言っているのであれば、1つのゴミ袋または1つのクォンティッククォークのみを操作する必要があるとは言いません。 「ゴミを出す」という名前の関数が「メールを持ち込む」も実装しているとしたら、それは私を驚かせ、いらいらさせるでしょう。

これで、ゴミを出すときにメールを持ってくるのが理にかなっていると主張できます。それはいいです。あなたが間違ったのは名前だった。

「あなたの雑用をする」は適合しますが、それは耳障りです。何が入っているか正確には分からないグラブバッグです。しかし、それは関数の中に何があってはならないかを教えてくれます。これはより高度な抽象化であるため、以前とは異なります。だからこそ、これはまだ1つのことです。

あなたはそれが2つのことをしていると主張することができます。しかし、ゴミを出すことは歩くこと、バッグを縛ること、そしてドアを開けることを含むと私は主張することができます。ひとつだけのものはありません。しかし、物事はあります。クリアなこと。これらのことを言うことは、このことには属しません。そのようなものはまとまりのある名前を持っています。ここでの名前はまさに制限要因です。

「ゴミ箱とメールを扱う」は、何が入っているかを正確に伝えるので、主に悪いです。実装の詳細がわかります。存在する単一のものを伝える責任は負いません。何が含まれているかを伝えるだけです。

これを考えると、「家事をする」の内部を見たときに何を見つける必要がありますか?

それが、開くコンテナ、削除するアイテム、およびそれらを運ぶ場所のリストである場合、2つの適切な名前と有用なレベルの抽象化を無駄にしていることになります。 「家事をする」という理由だけで「ゴミ出し」「郵便持ち込み」を捨てないでください。

「1つのこと」を実行したい場合は、関数の機能から戻り、その目的を尋ねます。それを呼ぶ人は本当に何を知る必要がありますか?彼らが知る必要のない詳細は何ですか?何か意味のある名前を付けられますか?

それが一つです。名前には細部まで詰め込むことができますが、名前の中心にあるのは、その機能についての1つの考えにすぎません。すべての小さなことではありません。

18
candied_orange

実際、単一の責任の原則は、各「クラス」(必要に応じて、コードのまとまりの単位、オブジェクトを指します) )変更する理由が1つだけある1つだけではなく.

重要な問題(通常の容疑者)は生産性です。これは、私たちが次のことを望む理由と同じです。

  • 辞書に定義が混在していない(「ライオンと鳥」の定義など)。
  • 複数の種類のドキュメントでフォルダを整理しない(「電話請求書と税務書類」フォルダなど)。
  • 同じオーディオCDにBeatlesEverly Brothersを混在させない(.. .ok、最良の例ではありませんが、オーディオCDのすべての内容を確認して、好きなバンドが含まれているかどうかを確認する必要はありません。1つのバンドで時間を節約できます。

生産性が低下するだからです。 より深いを見て、欲しいものを見つける必要があります。-time is moneyなので、私たちはせっかちな存在です。

私たちは物事を整理するのが好きで、複数のことを行う機能は生産性に反します。生産性が0.1%低下しても問題ありません。生産性の低下累積そして、私たちはしばしばit-seems-clear-to-me-at-the-moment誤謬の完全な犠牲者です。今日数秒で何が簡単に起こるかを理解するのに数秒になります。そして、管理するそのような「マルチモーダル」メソッドが複数ある場合、分は簡単にhoursになります。そして、それは悪化する可能性があります...それらは常にメソッドであるとは限りませんyoは書いています。そして、あなたはいつもあなたに説明を与えるために元のメソッド作曲家を持っているとは限りません。

あなたのスキルに関係なく、あなたはより生産的な取り扱いとシンプルな機能を維持しています。世界で最もよくまとまりのある名前であっても、関数の名前全体を読み、関数をざっと調べて、維持したい部分を見つける必要があります(チェック、レビュー、デバッグなど)。

簡単に言うと、メソッドに好きなだけ多くのことをさせることができ、もちろん、名前に「and」を適切に使用することを誰も禁止しません。しかし、比較的大規模なコードベースでこれを数回実行した後は、そうしたくないと思う前に時間の問題になるだけです。

2
Vector Zita

メソッドまたは関数は1つのことだけを行うべきだと言うとき、それはどういう意味ですか?

つまり、メソッドまたは関数は1つのことだけを実行する必要があります...

2つの処理を実行すると、テストが難しくなります(これらの2つの処理を個別にテストすることはできないため)。 2つの処理を行うと、コードはより脆弱になることがよくあります(多くの場合、両者の間で障害が発生するのではなく、常に両方が発生すると想定されているためです)。 2つの処理を実行すると、コードの柔軟性が低下します(多くの場合、一方の処理をもう一方の処理なしで再利用する必要があるため)。また、デバッグ可能性、命名、保守性、スケーラビリティ、およびソフトウェアとコード全般の他のすべての定性的側面への悪影響を無視しています。

「1つのことだけを行う」は、私たちが気にしているこれらすべてのことを支援するためのガイドラインです。これは従わなければならない規則ではありません。

なぜならば、圧倒的に、圧倒的多数の機能が複数のことを行うからです。 「これらの数値を加算して返す」は2つのことです。 「この入力をチェックしてデータベースに保存する」は2つのことです。私たちが本当に気にしているのはカップリングです。

関数が2つの小さいコンポーネントを受け取り、それらを組み合わせて少し複雑な処理を行う場合は問題ありません。小さいビットは、この機能の外部で分離されているため、個別にテスト/再利用/理解できます。ここで「1つのこと」は、2つの小さなコンポーネントを結合することです。ただし、重要なことは、「1つのことだけを実行する」ことは気にしないということです。コードが読み取り可能、テスト可能、スケーラブルなどであるかどうかが気になります。

名前がまとまりさえあれば、いくつかのことができますか?

まとまりのある名前は、それが合理的な抽象化である可能性があるというヒントですが、保証ではありません。

「と」という言葉を含むルーチンを避けるべきですか?

同様に、FooAndBar関数は、抽象化が十分に細かくない匂いですが、保証ではありません。

1
Telastyn