0

私のプログラムは次のように実行する必要があります。

./myprogram inputType [Can be I1, I2 or I3]

このプログラムのほとんどの機能は次のとおりです。

void Foo::foo (IType inputType) {
    // Some common code
    if (inputType == I1) ... // some I1 specific code
    if (inputType == I2) ... // Some I2 specific code
    ...// similarly for I3
}

inputTypeのこれらのチェックは複数の場所に散在しており、時間の経過とともに管理がますます困難になっています。私はこのコードを次のようなものにリファクタリングすることを考えました:

InputType* iType = new InputTypeI1(); // or I2 or I3

void Foo::foo (IType inputType) {
    // Some common code
    iType.DoSomething(this, arg1, arg2,..)
}

class InputType1 : public InputType 
{
     // Virtual functions.. (with default implementations)
}

InputType1::DoSomething(Foo* f, Arg1* arg1, Arg2* arg2)
{
    f->DoSomethingFor1(arg1, arg2);
}

これにより、I1、I2、またはI3の項目が整理され、入力タイプに基づいて関連する関数が自動的に呼び出されます。しかし、これはもっとうまくできると思います。助言がありますか?

4

2 に答える 2

1

現在のコードは Foo と InputType を結合します:

  1. Foo creates InputType Object
  2. InputType calls Foo function

推奨される解決策は次のとおりです。

 1. Decouple InputType and Foo by using composites mode
    Foo could hold a pointer to `InputType*` then call InputType `virtual` function.    
 2. To make InputType, a factory will simple enough. 

サンプルコード:

class InputType
{
 public:
    virtual ~InputType();
    virtual void DoSomething();
};

InputType* MakeInputObject(const IType& inputType)
{
   return new InputTypeX; 
}

class Foo
{
public:
  Foo(const InputType& input) : input_type_ptr(MakeINputObject(input) {} 
  void DoSomething() { input_type_ptr->DoSomeThing(); }

private:
  std::unique_ptr<InputType> input_type_ptr;
};
于 2013-01-21T10:53:01.103 に答える
1

あなたが提供するスニペットから判断するのは難しいですが、FooI1、FooI2、FooI3 の 3 つの派生 foo クラスを持ち、InputType に基づくファクトリで適切なクラスを構築することを検討します。

次に、すべての特殊化が、新しいクラスごとに仮想メソッドに実装されます。

class FooI1: public Foo {
 void doSomething() {...};
}

I2/I3 についても同様です。

Foo * fooFactory(InputType iType) 
{ 
   return new FooX - depending on iType
};
Foo *f = fooFactory(i)

f->doSomething();
于 2013-01-21T10:44:15.233 に答える