2010-12-01 12 views
0

私はパーサーが知る必要があるあらゆる種類のファイル(現在はSOURCE、HEADER、RESOURCE)を保持する "fileType" enumのクラスを持っています。私のような一般的な何かをできるように私の解析機能が欲しい:拡張可能なパーサーの設計

if(token == some_known_fileType) 
    put_nextToken_in_the_list_for_that_fileType(); 
else 
    return an_error(); 

しかし、キャッチがあります:私は単にTargetのサブクラスで知らfileTypesプロパティを拡張できるようにしたいのですが、enumを拡張正しい方法で、私がこれをやった方法についてはBase enum class inheritanceを参照してください。私は上記のコードを変更するのではなく、ターゲット全体を一般的に拡張したいだけです。 C++ 0Xが必要な場合があり、大歓迎です。

ありがとうございます!

UPDATE:ここでそれを説明しようとすると、いくつかの低減クラス宣言を投稿すると、私は自分のデザインが壊れて実現し、私は私のクラス構造の深すぎたfileTypeの専門をプッシュしようとしました。私はすべての既知のタイプの完全なリストを格納する場所は1つだけ必要でしたが、そうしようとすると、一度に2つの場所でそのリストにアクセスできるようになりました。私は今、すべてのfileTypesのリストは、SOURCE、HEADERなどのキーワードがどこから読み込まれ、そこから一般的に扱われるべきであることを認識しています。私は1つの場所に完全なリストを格納し、後で "巨大な" enumを通してそのリストにアクセスします。ここでは論理的な選択肢としてstd::map<fileType, std::set<std::string> >が頭に浮かびます。具体的にはそれぞれの場合はsetという名前が付けられています。あなたの応答にbraincandyをありがとう!どんな考えもまだ歓迎されています。

+1

コードをもう少し追加してもよろしいですか?私はそれがあなたがしたいことが分かりません... – ronag

答えて

2

これは通常適切なアプローチではないと私は信じていますが、それは私の考えです。私はこれを別のやり方でやるだろう。 一歩を踏み出し、達成しようとしていることは、入力(入力パラメータ)値に基づいて動作を制御したいということです。 クラスがあるとしましょう:FileA FileB ... file_typeはファイルのタイプを保持します。 ファクトリを使用して、使用可能なファイルのリスト(異なるファイルの登録に基づいて変更可能)を制御します。

class FileA { 
    void register_type(); // register itself to the factory. 
}; 

class FileB.. 
//main code 
class FileFactoryDelegator { 
    ... 
    delegateControl (FileType file_type) { 
     //validate file_type. 
     file_types[file_type]->performFileOperation (..); 
    } 
}; 

if-elseループの代わりに。

file_factory.delegateControl (token); 
+0

これは実際に私が最終的に 'std :: map >'を使って実装したものです。私が以前考えていたよりも。ありがとう! (私はfileType登録の必要はなく、常にそれらのすべてを利用できるようにしました。また、 'std :: map :: operator []'は要素が存在しない場合に作成します。 – rubenvb

0

これは、あなたがトークン、ファイルタイプ値、およびターゲットインスタンスを使って何をしているかによって大きく変わります。しかし、ここでのテーマは、if()文を仮想メソッド呼び出しで置き換える必要があるということです。例えば、あなたのコードは

if (tokenLists.supportsFileType(token)) 
    tokenLists.getListForType(token).put_nextToken_into_this_list(); 
else 
    return an_error(); 

上記tokenLists例になってしまう可能性がファイルタイプの具体的な方法のすべての種類を組み合わせTargetSpecificLogicインスタンスのレジストリに一般化することができます。

対象クラスは、サブクラスが拡張し、残りのコードが評価できる仮想メソッドretrieveAllKnownFileTypes()を実装できます。

対象クラスは、bool isFileTypeKnown(filetype)という仮想メソッドを実装し、trueまたはfalseを返すことができます。

...など。

関連する問題