クラスメソッドの数の制限は何ですか?


22

私が読んださまざまなデザインの本では、クラスに必要なメソッドの数に重点が置かれることがあります(たとえば、JavaまたはC#などのオブジェクト指向言語を考慮)。多くの場合、これらの本で報告されている例は非常に簡潔でシンプルですが、「深刻な」または複雑なケースをカバーすることはめったにありません。
ただし、範囲は5〜8のようです。

プロジェクトでは、属性としてTitle、Desctiption、CreateDateなどの属性を持つクラス「Note」を開発しました。
次に、getRelations(メモが別のドキュメントに割り当てられている場合)、getExpiryDate、ect などの基本的なメソッドを作成しました。

ただし、アプリケーションの開発を進めるには、より多くの機能が必要であったため、より多くのメソッドが必要でした。

クラスのメソッドが少ないほど、疎結合になります。これは、モジュール性と再利用性の面で確かに優れた利点であり、さらに編集が容易です。
ちなみに、コンテキストでサブクラスを作成する必要がない場合(または感覚さえある場合)、必要なすべての関数がそのクラスに関連している場合、さらにいくつのメソッドを追加できますか?

15を超えるメソッドを使用する場合は、少し再設計が必要になる可能性があることに同意します。
しかし、その場合でも、メソッドまたは継承の一部を削除することがオプションではない場合、適切な方法はどれですか?


3
人間は、組み込みの忘却範囲を持っているようです。7つのオプションを超えると、最初のいくつかは忘れられ始めます。したがって、インターフェイスごとに7つ以上のオプションを提供しないでください。
マーティンヨーク

+ 1 @ Martin- 7 +または- 2
モルガンHerlocker

この制限は、短期間の記憶のみです。それ以外の場合、これらの異なる文字や単語をすべて思い出すにはどうすればよいでしょうか?真剣に、クラスが頻繁に使用される場合、それをミニ言語と考えることができ、あなたがそれでしなければならないことを表現するために必要なだけのメソッドを持っています。
アルテム


回答:


30

必要な数のメソッドを用意してください。可能な場合は、パブリックメソッドの数をその5〜8のルールに抑えるようにします。正直なところ、ほとんどの人は逆ではない問題を抱えており、狂ったスーパーメソッドがあります。プライベートヘルパーメソッドがいくつあるかは、実際には関係ありません。実際、Javaで8つのメソッドを下回った場合、コンストラクター、toString、および3つのプロパティのゲッター/セッターのみを持つクラスで制限に達する可能性があります。これは厳密なクラスではありません。肝心なのは、クラスがいくつのメソッドであるかを心配しないでください。クラスが無関係な懸念を引き受けないこと、およびメソッドを理解しやすい合理的なパブリックインターフェイスがあることを確認することについて心配します。


正しいですが、ユーティリティクラスの場合は、10〜15までで十分です。
シド

1
@SidCool-決して使用しないと言っているわけではありませんが、ユーティリティクラスは最初からベストプラクティスではありません。それらは通常、関連のない一連の懸念をまとめる単なる神のクラスです。それを念頭に置いて、ユーティリティクラスは実際にはまったく存在すべきではなく、15個のメソッドが存在するはずです。
モーガンハーロッカー

1
私のクラス「Note」はユーティリティクラスではありません。ビジネスオブジェクト(ドキュメントにコメントと説明を追加できるメモ)を表します。しかし、「ユーティリティ」クラスの危険性については、私はアイロンコードに同意します。納期を急いでいるときに助けになりますが、多くの場合、より良いソリューション/設計があると思います。
フランチェスコ

13

答えは本当に簡単です。すべてをその責任に属するクラスに入れますが、責任を割り当てるときは注意してください。

大きなクラスは、責任が異なる小さなクラスの複合体である場合があります。

一般に、クラスの使用法や保守が扱いにくい場合、責任を小さなクラスに分割しようとします。500行を超えるクラスはめったにありません。私の最大のクラスには、およそ1.5kの場所があります。

「クラスにはn〜m個のメソッドが必要です」などの一般的なルールを単に述べることはできません。


8

(オブジェクト指向の設計では)あまりにも多くのメソッドしかない理由はありません。また、メソッドの少ないクラスがより適切に分離されているということも事実ではありません。

たとえば、java.lang.Stringクラスを見てください。文字列でできることは非常に多いため、多くのメソッドがあります。それにもかかわらず、強く結合していません。

なぜ15のようなマジックナンバーが良いデザインと悪いデザインを区別できるのだろうか。いいえ、簡単ではありません。


私は同意します。15という数字は、それらの設計書を読むことから導き出された近似値にすぎません(例としてスティーブン・マコーネルによる「コード完了」として)。実際、Stringクラスには無数のメソッドがあり、すべて同じエンティティに割り当てられています。
フランチェスコ

@Luca:それらの本のいくつかの問題は、例がしばしば工夫されているため、多くの実際の例よりも小さいことです。
FrustratedWithFormsDesigner

まさに...おそらくコンセプトをより明確にし、バイヤーの潜在的な基盤を拡大するため
フランチェスコ

あらゆる種類のDataGridや、15個のメソッドのみを備えたUIコントロールさえ見たいです。これらのクラスをより小さなクラスに分解すると、インターフェースは悪夢になります。
ファルコン

6

PMDでは、TooManyMethodsルールのデフォルトの動作は、10以上のメソッドを持つクラスを潜在的なエラーとして識別し、フラグを立てることです。ただし、これは任意の数字です。設定で簡単に変更できます。この番号が何であるかに関係なく、それは開発者がクラスに注目して問題があるかどうかを確認するための単なるフラグであり、問​​題があることではありません。

もう少し具体的なものは、7プラス/マイナス2ルールかもしれません。これは、人間の心がメモリ内の5〜9個の「オブジェクト」を保持および理解できることを示しています。特定のクラスを読み取る場合、オブジェクトはほとんどの場合、そのクラスを構成するメソッドとフィールドになります。しかし、クラスが頻繁に使用すると、アクセサ、ミューテータと(例えば、任意の標準操作カウントしていない場合でも、以上の9つのフィールドとメソッドを持っているtoString()hashCode()equals()Javaでの)。

最も関連性の高い対策は、ファンインとファンアウト、および結合結合の議論です。単一責任の原則の懸念の分離はクラスが行うか、一つのことと一人で一つのことを表している必要があります-適用されるべきです。これらは、設計または実装を評価するときに、メソッドの最大数/最小数に番号を割り当てるよりもはるかに優れています。


+1-7 + -2ルールは、ユーザビリティが関係する場所で生きるルールです。
モーガンハーロッカー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.