2010-11-18 7 views
2

私はテストオートメーションフレームワークを作成しました。このフレームワークは、オブジェクトとアクションを中心に構築されています。オブジェクトはテキストボックスです。そのためのアクションは、set-text、clear、verify-text、verify-enabledなどのようなものかもしれません。フレームワークはacitonsから独立しているので、フレームワーク自体を再スムーズにすることなく時間をかけてアクションを追加できます。私はその行動に対して2つのアプローチを考えた。最初は、コマンドパターンを使用することでした。問題は、我々は多くので終わるだろうということです
コマンドパターンを検索する代わりに

public interface IAction
{
void Execute(StringDictionary properties);
}

:この場合、私はこのようになりますインターフェイスを持っているでしょうこれらのコマンドクラス。

public class SetTextAction : IAction
{
public void Execute(StringDictionary properties)
{
}
}

public class ClearAction : IAction
{
public void Execute(StringDictionary properties)
{
}
}

public class VerifyTextAction : IAction
{
public void Execute(StringDictionary properties)
{
}
}

public class VerifyEnabledAction : IAction
{
public void Execute(StringDictionary properties)
{
}
}

さらに任意の共有コードは、さらに別のクラスであることが必要であろう。これは、コード内の信号対ノイズ比を増加させるようです。

私が思いついた別の方法は、アクションのタイプとメソッドにユーティリティクラスを使用することです。これは、このように見える終わる:

public class TextboxActions
{
public static void set-text(StringDictionary properties)
{
}
public static void clear(StringDictionary properties)
{
}
public static void verify-text(StringDictionary properties)
}
}

これは、テキストボックスのコードは、すべて一緒になるという利点を有する
public static void verify-enabled(StringDictionary properties)
{
。さらに、複数のアクションに共通するコードはすべて同じクラスに含まれます。残念ながら、このアプローチでは、リフレクションを使用してアクションメソッドを「見つける」必要があります。これは明らかにタイプセーフではなく、時間がかかることがあります。私はキャッシュを追加したので、同じアクションを2回見つける必要はありませんが、コードの複雑さが増します。

どちらの解決策も機能しますが、どちらも望ましくない特性を持っています。誰かが提案できるこの問題に対する代替アプローチがありますか?

答えて

1

なぜ代理人を使用できないのですか?つまり、ファーストクラスの関数アプローチに従ってください。個々のIActionの具体的なインスタンスを作成することを考えているのであれば、代わりに具体的な関数ポインタを用意することもできます。そうすれば、あなたのコードは最後の例のように見えるが、リフレクションは使われない。

+0

ありがとうございました。 –

+0

 delegate void TestAction(IDictionary properties); interface ITestObject { public List GetActions(); } 

0

デリゲートのアプローチはこれに沿ったものでしょうか?

public abstract class TestObject 
{ 
    public delegate void TestAction(StringDictionary properties); 

    public void AddTestAction(TestAction action) 
    { 
    } 

    public void Execute() 
    { 
     // foreach test action etc. 
    } 
} 

public class TestTextBox : TestObject 
{ 
    TestTextBox() 
    { 
     Initialize(); 
    } 

    private void Initialize() 
    { 
     AddTestAction(new TestObject.TestAction(this.SetText)); 
     AddTestAction(new TestObject.TestAction(this.Clear)); 
    } 

    public void SetText(StringDictionary properties) 
    { 
    } 

    public void Clear(StringDictionary properties) 
    { 
    } 
} 
+0

あなたは 'AddTestAction'を必要としません。 Initializeルーチンは 'TestAction + = SetText;を実行できます。 TestAction + =クリア; '。デリゲートは本質的にマルチキャストされていることを忘れないでください。 –

+0

これは当てはまりますが、何が実行されるかについては、制御と明快さが少なくなります。それぞれの行動で標準的な準備とクリーンアップをしたいのですが? – Vitalogy

関連する問題