Шаблоны проектирования: многие методы имеют один и тот же первый шаг - PullRequest
3 голосов
/ 26 февраля 2011

Есть ли шаблон проектирования, который может помочь мне избежать повторения DoThisStepFirst() во многих методах?

class Program
{
    static void Main(string[] args)
    {
        Method1();
        Method2();
        MethodN();
    }

    private static void DoThisStepFirst()
    {
        // Implementation
    }

    private static void Method1()
    {
        DoThisStepFirst();
        // Implementation
    }

    private static void Method2()
    {
        DoThisStepFirst();
        // Implementation
    }

    // {...}

    private static void MethodN()
    {
        DoThisStepFirst();
        // Implementation
    }
}

РЕДАКТИРОВАТЬ 1: Достаточно сказать, что это надуманный пример.
Моя фактическая реализация включает сигнатуры методов с параметрами и нетривиальные операции в каждом методе.

РЕДАКТИРОВАТЬ 2:

  • @ Марк Гравелл предложил Аспектно-ориентированное программирование. Да, это может помочь мне здесь.
  • Я также думаю, что модель цепочки ответственности может помочь мне и здесь.

@ Чарли Мартин хотел узнать больше о программе. Вот что я на самом деле пытаюсь сделать.

  • Я пытаюсь настроить тестовый жгут для запуска приложения ASP.NET MVC 2 для контроллеров ' m ' и методов управления n .
  • Приложение MVC тесно связано с SessionState. По разным причинам я не могу издеваться над SessionState.
    • Итак, внутри метода DoThisStepFirst() я бы хотел инициализировать SessionState.
    • И после инициализации SessionState я хотел бы перейти к указанному методу (поэтому я подозреваю, что могу искать шаблон проектирования «Цепочка ответственности»).

Ответы [ 6 ]

4 голосов
/ 26 февраля 2011

Если это Test Harness, то у вашей среды модульного тестирования должен быть метод TestFixtureSetup, он будет запущен до запуска ваших тестов:

Для NUnit:

[TestFixtureSetUp]
public void Setup()
{

}

Для MSTest:

[TestInitialize()]
public void Startup()
{
    //Do setup here
}
3 голосов
/ 26 февраля 2011
private static void MethodCommon(Func f)
{
    DoThisStepFirst();
    f();
}

private static void Method1()
{
    MethodCommon(() => 
        doSomething();
    );
}
3 голосов
/ 26 февраля 2011

Полагаю, у вас может быть метод, который всегда вызывает DoThisStepFirst(), затем выполняет переданное действие:

    private static void DoSomething(Action doSomethingElse)
    {
        DoThisStepFirst();
        doSomethingElse();
    }
1 голос
/ 26 февраля 2011

Если честно, нет способа ответить на это, не зная больше о программе. Похоже, «DoThisStepFirst» - это своего рода инициализация; заманчиво думать о

  DoThisStepFirst();
  Method1(); // and so on

и так далее, но, похоже, каждый метод нуждается в инициализации. Тогда возникает вопрос: «Почему каждый метод находится в состоянии, требующем повторной инициализации?»

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

0 голосов
/ 26 февраля 2011

нет, там вообще нет. Может быть, вы могли бы предоставить некоторые подробности о том, что вы пытаетесь достичь?

0 голосов
/ 26 февраля 2011

Как насчет помещения кода в DoThisStepFirst () в конструктор.Если все они нуждаются в том, чтобы он запускался для инициации там, у операций есть хороший шанс, что он может пойти туда.Если только он не сбрасывает состояния / поведения, которые необходимо сбросить, прежде чем ваши методы выполнят что-либо.

...