Нужен шаблон для вызова метода Verify для каждого шаблона метода экземпляра - PullRequest
4 голосов
/ 23 апреля 2009

У меня есть следующий код:

class Foo
{
    public Foo()
    {
        Size = true;
    }

    private bool _size;

    protected bool Size
    {
        get { _size; }
        set { _size = value; }
    }
}

class CrazyFoo : Foo
{
    public void First()
    {
        if (!Size)
            return;
    }

    public void Second()
    {
        if (!Size)
            return;
    }
    public void Finished()
    {
        if (!Size)
            return;
    }
}

Каков наилучший способ реализовать шаблон такого типа, так как он сводит меня с ума при наборе

   if(!Size) return;

возможно, я могу сделать это с атрибутами или АОП?

Какой самый лучший и простой способ?

Спасибо

Ответы [ 3 ]

1 голос
/ 23 апреля 2009

Если у вас один и тот же защитный оператор в начале слишком многих методов, вы можете создать метод executeWithGuard:

private void executeWithGuard(Action method)
{
    if (HeadSize) method();
}

Тогда вы можете сделать это:

public void ScreenFirstShot()
{
    executeWithGuard(() =>
    {
        // code here
    });
}

public void ScreenSecondShot()
{
    ExecuteWithGuard(() =>
    {
        // code here
    });
}
public void CrazyUp()
{
    ExecuteWithGuard(() =>
    {
        // code here
    });
}

Там не меньше кода, делающего это ... на самом деле, вероятно, больше кода, но он позволяет вам не выполнять поиск / замену, если ваше условие защиты когда-либо изменится. Я бы предложил это только в крайнем случае. Вполне возможно, что ваша настоящая проблема заключается в том, что вы выполняете проверку слишком далеко от дерева вызовов. Если вы можете сделать это на более высоком уровне, вы можете уберечь себя от всей этой проверки.

1010 * ТАКЖЕ *

Взгляните на шаблон нулевого объекта . Этот шаблон может использоваться в некоторых особых случаях для предотвращения или упрощения проверки состояния.

ТАКЖЕ (версия 2)

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

0 голосов
/ 23 апреля 2009

Однако, с точки зрения «шаблона», это не кажется мне обременительным. Мне кажется вполне разумным набрать:

if(!Size) 
    return;

Вы явно обрабатываете дела, которые хотите. В вашем случае эта проверка довольно специфична для того, с чем вы работаете, насколько я могу судить (из ваших оригинальных + правок). Я лично выбрал бы более очевидное имя, так как оно кажется немного странным (даже в вашем оригинале) и не совсем очевидно, что происходит.

Даже с AOP вы добавляете здесь некоторую другую информацию о каждом методе, чтобы убедиться, что ваш аспект был обработан.

0 голосов
/ 23 апреля 2009

Может быть, просто использовать один метод и Enum со значениями First, Second, Finished и т. Д.? Трудно сказать, потому что, кроме этой проверки, вы не говорите, что является общим. АОП может быть решением, но, возможно, нет, поскольку аспекты, как правило, носят более общий характер.

Кстати, возможно, выберете другое название для ваших образцов в будущем, это может обидеть некоторых людей. (Отредактировано в соответствии с новым именем)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...