私は卓上ゲームのデータを管理する単純なプロジェクトを行っていますが、ほとんどの場合、正しいコーディングの経験を積むために使用しています。
5 つのクラスが密結合している状態になりましたが、すべてをそのままにしておくか、リファクタリングするかはわかりません。
私が持っているのは基本的にこれです:
- class
ShipTemplate
: このクラス (c++ テンプレートとは関係ありません) には、すべての定数メンバーがあり、船のカテゴリに関する基本的な情報が含まれています。 - class
TemplateSet
: このクラスには、現在ビルドに使用できるすべての ShipTemplates が含まれており、名前があります。各プレーヤーがいつでも利用できるテクノロジーを表すため、スタンドアロンである必要があります。そのため、さまざまなセットをさまざまな時間に保存/ロードできます。 - class
Ship
: このクラスは、ロードアウト、名前などを含む完全な船を表します。基本的な機能を参照するために、クラスが変更することを許可されていない ShipTemplate への const 参照が含まれています。ShipTemplate を拡張することもできますが、どの Ship が特定の基になる ShipTemplate を持っているかを追跡したかったので、このようにする方が簡単に思えました。 - class
Fleet
: このクラスには船のリストが含まれており、名前とその他の情報が含まれています。これには、その中のすべての船のコストの合計に等しいコスト変数が含まれている必要があります。 - class
Deployment
: このクラスには、プレイヤーが利用できるすべての船、艦隊、および TemplateSet へのポインタが含まれています。また、利用できなくなったものの、すでに建造された Ship でまだ使用されている ShipTemplates を追跡する必要もあります。これには、プレイヤーが利用できるすべての船のコストの合計に等しいコスト変数が含まれている必要があります。ある艦隊から別の艦隊への船の移動を管理する必要があります。どの船が特定の艦隊内にあるか、またはどの船が特定の ShipTemplate を持っているかを調べる必要があります。
残念ながら、すべてのクラスは他のすべてのクラスとかなり絡み合っています。さまざまなアプローチを考えましたが、そのうちの 1 つでも正しいかどうかはわかりません。
- あらゆる場所でステートメントを使用
friend
して、1 つのクラスが何かを変更した場合に、他のすべてを正しく更新できるようにします。 - のような非常に長い名前を使用
Deployment::modifyShipThrustInFleet
し、すべてを処理する Deployment クラスを介してのみ変更を許可します。 - TemplateSets と Fleets を削除し、Deployment 内でそれらを表現して、「正確性」ルールを破ることなくコスト値/ポインターを正しく更新できるようにします。これもまた、システムへのすべての変更が Deployment を通過する必要があることを意味します。
- 上位クラスへのポインターを下位クラスに挿入します。たとえば、船で何かを変更すると、展開と艦隊の両方のコストを自動的に更新できます。
私が見たことのない他の解決策がありますか、それとも読みやすく、管理しやすいコードを実現するのに役立つより多くのクラスへのリファクタリングがありますか?