これは基本的な OO 設計の問題です。解析された入力 C ファイルに従ってフロー チャートの項目を表すクラスを C++ で作成しています。
FlowChartActionItemとFlowChartConditionItemの 2 種類の項目 (クラス) があります。これらは、それぞれフローチャートのアクションおよび決定/条件要素を表します。また、入力 C ファイルに存在するステートメントと If 条件もそれぞれ表します。どちらのクラスもFlowChartItemを継承しています。
各サブクラスには、その後に続く項目への多数のポインターがあります。はい、ノード (アイテム) とリンク (ポインター) を含むグラフがあります。ただし、FlowChartActionItemには 1 つの外向きポインターしかありませんが、FlowChartConditionItemには 3 つの外向きポインターがあります (then-statements ブランチ、else-statements ブランチ、および if-condition の両方のブランチの後に来るものへのポインター)。
私の問題は、外向きのポインター (nextItems) の適切なセッターを作成することです。クラスを見てください:
class FlowChartItem
{
public:
//I **need** this setter to stay in the parent class FlowChartItem
virtual void SetNextItem(FlowChartItem* nextItem, char index) = NULL;
};
-
class FlowChartActionItem:public FlowChartItem
{
public:
FlowChartItem* nextItem; //Only 1 next item
public:
void SetNextItem(FlowChartItem* nextItem, char index);
};
-
class FlowChartConditionItem: public FlowChartItem
{
public:
FlowChartItem* nextItem;
FlowChartItem* trueBranchItem;
FlowChartItem* falseBranchItem; //we have 3 next items here
public:
void SetNextItem(FlowChartItem* nextItem, char index);
};
サブクラスが持っているポインターの数に依存しない汎用セッターが必要でした。ご覧のとおり、どのポインターを設定するかをセッターに伝えるために char インデックスを使用しました。しかし、私はこれが好きではなく、物事をきちんとする必要があります. コードが読めないため、例えば:
item1.setNextItem(item2,1);
1が何を意味するか覚えていませんか?then-ブランチ ? 他に???
明らかな答えは、FlowCharItem で列挙型を定義することですが、次の 2 つの問題のいずれかが発生します。
1- Enum 値が定義され、現在のサブクラス FlowChartActioItem および FlowChartConditionItem に合わせて調整されるため、将来のサブクラスでの SetNextItem の呼び出しは非常に読みにくくなります。さらに悪いことに、3 つ以上の外向きポインターを持つことはできません。
2- 将来のサブクラスの開発者に FlowChartItem のヘッダー ファイルを編集させ、enum に任意の値を追加して、最初の問題を解決します。もちろん受け付けません!
クラスの読みやすさを維持するためにどのような解決策がありますか?