В поисках альтернативы шаблону команды - PullRequest
2 голосов
/ 19 ноября 2010

Я написал Test Automation Framework. Каркас строится вокруг объектов и действий. Объект может быть текстовым полем. Действия для него могут быть такими, как set-text, clear, verify-text, verify-enabled и т. Д. Каркас не зависит от acitons, поэтому мы можем добавлять больше действий с течением времени без необходимости повторного использования самой каркаса. Я рассмотрел два подхода к действиям. Первым было использовать шаблон команды. В этом случае у меня будет интерфейс, который выглядит примерно так:

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 голос
/ 19 ноября 2010

Почему вы не можете использовать делегатов? То есть следуйте первоклассному функциональному подходу. Если вы думаете о создании конкретных экземпляров IAction, вы можете использовать вместо них указатели конкретной функции. Таким образом, ваш код может выглядеть как ваш последний пример, но не использовать отражение.

0 голосов
/ 19 ноября 2010

Подход делегата будет чем-то вроде этого?

   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)
    {
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...