Java Swingを使用してBook Managerアプリを作成しています。Swingを使用すると、本のtxtリストを開く、本を検索する、本を追加/削除するなど、さまざまなことができます。
本の種類ごとに異なるクラスがあります。架空の本には独自のジャンルフィールドがあり、歴史の本には独自の期間フィールドがあります。これらの本はすべて、これらのクラスの基本フィールドを保持する抽象本クラスを拡張しています。
私はMVCパターンを使用しており、モデルに満足していますが、私の主な関心はビューにあります。
現在、22のクラスがあり、そのうち14はモデルのビューの側面に焦点を当てています。基本的に、コンポーネントの大部分にクラスがあります。 JFileChooser、MenuBarクラス、およびさまざまなブックパネルのクラスを拡張するファイルチューザなど。各サブブックパネルは、テキストフィールドとラベルのすべてを取得し、それらを追加することにより、一般的なブックパネルから拡張されます。
また、これまでにさまざまなコンポーネントを作成できるビルダーデザインパターンを実装しました。テキストフィールド用とラベル用の両方のインターフェイスを実装する2つのビルダークラスがあります。
私の質問は、これらすべては少し上にありますか?すべてをメインクラスに詰め込むのが良いのですか、それともたくさんのクラスを持つのが良いのですか?
あなたの質問は3つあります:
1。いくつのクラスが多すぎますか?
メソッドの所要時間やメソッドが持つことができるパラメータの数など、いくつかのメトリックに関するガイドはいくつかありますが、システムが最大で持つ必要のあるクラスの数に関するメトリックはありません。
私見複雑さを生み出すのはそれほど多くのクラスではなく、それらがまとまりがなく、互いに強く結合しているという事実です。クラスが大きすぎる場合は問題があり、そのためのメトリックがあります。クラスが密結合されている場合、別の問題があります。
一方、複雑さの直接的な指標ではないものの、いくつの抽象クラスまたはインターフェースの数は、ヒントを与えることができます。実装クラスとインターフェースの比率は比較的高いはずです。つまり、抽象化が適切であり、優れた目的を果たしているということです。実装者との比率が比較的50/50のインターフェースの場合、抽象化が不十分であるか、設計が不十分です。これは、開発の初期段階では当てはまりません。明らかに、実装者とほぼ同じ数のインターフェースがあるためです。
2。これ(すべてのクラス)のすべてが少し上にありますか?
前の質問を参照してください。しかし、あなた自身(あなたのチーム)が世話をすることの量に圧倒されすぎていると感じているかどうかも自問してください。その場合、助けを求めるべきです。プレゼンテーションレイヤープログラマーとビジネスルールプログラマーの間で作業を分割すると役立つ場合があります。
。すべてをメインクラスに詰め込むのが良いのですか、それとも多くのクラスを持つのが良いのですか?
ここでは、「詰め込まれた」という言葉を使用して自分に答えています。それは、神クラスと呼ばれる既知のアンチパターンです。あなたはそれを避けるべきです。
Bottomline:コンポーネントの量ではなく、コンポーネント間の関係が、システムを複雑にして維持できない原因にしています。
クラスの量を見ないでください。すべての葉クラスを除外したUML図を作成します。見た目はすっきりしてシンプルですか、それとも少なくとも管理しやすいでしょうか。もしそうなら、あなたは大丈夫です。
あなたは間違った質問をしています。 「すべてをメインクラスに詰め込むのは良い」ではなく、「クラスをたくさん持つのも良い」ということではありません。
すべてのケースをカバーする厳格なルールを生成するこのような試みから遠ざかると、はるかに優れたアプローチに到達します。つまり、 [〜#〜] solid [〜# 〜] 、そしてあなたのコードベースに適切な数のクラスができあがります。
その数が何であれ
特にGUIの場合、ウィジェットを追加すると、多くのクラスが作成される傾向があります。これは正常です。あなたが説明するシナリオは私には恐ろしいように聞こえません。
コードにクラスを含める主な理由は、そのコードを追跡しやすいにするためです。クラスを追加することにより、コードがより明確で記述的で概念的に意味のあるものになれば、正しい方向に進むことができます。しかし、クラスを追加することでコードが混乱したり、無秩序になったり、鈍くなったりするのを感じたら、それをしないでください。
単純な公式はありません。アプリケーションはそれぞれ異なります。このような判断を下せるのは人間だけです。さもなければ、コンピュータプログラムはそれら自身を書くことができます。 :)