4

クラスが大きすぎて扱いにくくなります。Objective-C では、カテゴリを使用してクラスを分割したくなりますが、カテゴリは、がらくたでいっぱいの家を部屋に分割するだけではないでしょうか? 同じ質問が C# の部分クラスにも当てはまると思います。

「クラスが大きすぎる」コードのにおいを解決するために、どのような条件下でカテゴリを使用できますか? それが正しくなく、クラスを本当に「再構築するか、小さなクラスに分割する」必要があるのはいつですか?

4

4 に答える 4

9

参照すべき非常に優れた原則は、SOLID 原則です。特に、「S」は「単一責任」の略です。

単一責任の原則

オブジェクトが単一の責任のみを持つべきであるという概念。

クラスが大きくなりすぎると、責任が多すぎる可能性があります。クラスが行っていることの境界内で 2 つ以上の責任を定義できますか? その場合は、2 つ以上のクラスに分けてください。次に、ファサードまたは複合パターンを使用してそれらを集約して戻すことができます。

言い換えると:

  • クラスにあるコードは、単一責任の原則に従って異なるクラスに分割する必要があります
  • 元の God クラスは複合またはファサードになります。すべての新しいクラスを使用し、同じメソッドをシステムの残りの部分に公開しますが、古いスタイルの God クラス呼び出しを「変換」する以外に、それ自体には機能を実装しません。新しいスタイルのSOLIDコール。

これは、オブジェクト指向の観点から、領域は問題を解決するためにまったく何もしないことを意味します。実際、それらは問題を隠すことに貢献するため、実際には逆効果です。

この Jeff Atwood の記事も参照してください。

http://www.codinghorror.com/blog/2008/07/the-problem-with-code-folding.html

コーディングホラー領域

于 2011-11-05T09:26:38.677 に答える
2

私は Objective-C を使用したことがないことを認めなければなりませんが、もちろん C# を使用しました。

つまり、部分クラスはクラスと同じであり、クラスを複数のファイルに分割してもクラスは小さくならず、ファイルに分割されるだけです。クラスの使い方は同じです。

したがって、部分クラスがその問題を解決することに同意しません。それらは主に、Windowsフォーム、wpf、自動生成コードなど、他のもののために発明されました。これらは、クラスを論理的に分割できない他の状況でも役立ちますが、通常は避ける必要があります。

クラスをいくつかのクラスに分割する必要があると思います。クラスが複数のファイルに分割されている場合も、1k LOC (コード行) の後にクラスの匂いがし始めます。

継承を使用するか、フィールドとプロパティで接続された複数のクラスにクラスを分割します。ChemicalNova が提供する例では、複数のファイルではなく、複数のクラスに分割します。

于 2011-11-05T08:07:11.923 に答える
1

私が初心者だったとき、この神のクラス「BusinessService」またはそれに似たものがあったことを覚えています。誰かが TFS でそれをロックしたときはいつでも、あなたは取り残されました。だから私はこの素晴らしいアイデアを思いつきました。それを部分クラスに分割してみませんか。「BusinessService1.cs」..「BusinessService6.cs」のようなものになりました。それは完全な混乱であり、物がどこにあるかを見つけるのは完全にフラストレーションでした.

部分クラスを使用する必要があるたびに、それは設計ミスだと思います。マイクロソフトがそうするように強制する場合 (wpf、winforms など) - それは設計ミスです。

于 2011-11-05T08:32:57.963 に答える
-2

クラスをパーシャルに分割しても問題はありません。これを利用する開発者はほとんどいません。

個人的には、より大きなクラスをパーシャルに分割して、各パーシャルのビジネス面が同様の機能を持つようにするのが好きですが、設計時にそのクラスが非常に大きくなるように見える場合に限ります。それ以外の場合は、関連する機能をリージョンに分割します。

例として、データ層内に「UserService」がある場合、次のようにいくつかのパーシャルに分割できます。

UserServiceQueries.cs
UserServiceUpdates.cs
UserServiceInserts.cs
UserServiceLogicalFunctions.cs

..ただし、「UserService」の部分クラスが含まれています。私は通常 ORM をあまり使用しないので、関連する機能の各部分が非常に大きくなる可能性があるため、これは私にとって完璧です (明らかにこれは基本的な例です)。

最後に: 提供されているものを活用してください。クラスが巨大であることからコードの匂いがする場合.. 2 つの選択肢しかありません.. 書き直すか、分割します (これほど大きくする必要がある場合)。

とにかく私の意見。

于 2011-11-05T08:02:23.050 に答える