Есть ли лучший способ написания этого кода? - PullRequest
0 голосов
/ 11 июня 2011

У меня есть класс с перечислением DoStuff со значениями before, after или none. Эти имена не являются истинными именами, но это помогает понять смысл. У класса есть метод foo.

Ниже приведен набор свойств только для чтения различных типов, каждый из которых выглядит следующим образом:

public [type] MyProperty {
    get {
        if(enumValue == DoStuff.Before)
            foo();

        [type] result = //Do calculations here

        if(enumValue == DoStuff.After)
            foo();

        return result;
    }
}

Есть ли способ абстрагировать эти вызовы до / после расчета? В настоящее время я могу думать о двух решениях:

  • Создайте закрытый метод, который принимает делегата и вызывает foo в соответствующем месте. Осложняется отсутствием обобщений на платформе, для которой я пишу.

  • Создайте нереализуемый базовый класс без вызова обертки и получите подкласс До и После, который обращается к свойствам базового класса, с вызовом в соответствующем месте

Есть ли хорошо известный шаблон для такого рода структуры?

Ответы [ 3 ]

1 голос
/ 11 июня 2011

Создать метод с этим синтаксисом:

delegate void Handler();

void DoHandler(Handler handler)
{
        if(enumValue == DoStuff.Before)
            foo();

        handler();

        if(enumValue == DoStuff.After)
            foo();
}

Тогда в вашей собственности

public [type] MyProperty 
{
    get 
    {
        [type] result = default(type); 
        DoHandler(() => 
        {
            int a = 5;
            int b = 6;
            result = a + b;
        });
        return result;
    }
}
0 голосов
/ 11 июня 2011

Я думаю, что лучше поместить значение enum в отдельный класс, который имеет 1 свойство с именем EnamumValue и событие BEfore и After, и обработать это событие в классе, который использует класс enamvalue, когда enumvalue меняет огонь соответствующий Событие

public class EnumValueClass
{

    public event BeforeDelegate OnBefore();
    public event AfterDelegate OnAfter();
    private EnumType enumValue;
    public EnumType EnumValue
    {
        get {
            return enumValue;
        }
        set{
            this.enumValue = value;
            if(enumValue == DoStuff.Before)
                if(OnBefore!=null)
                    OnBefore();

            if(enumValue == DoStuff.After)
                if(OnAfter!=null)
                    OnAfter();
        }


    }
}
0 голосов
/ 11 июня 2011

Я был бы склонен создать событие / делегат До и После и шлепать foo () в соответствующем месте, вероятно, там, где вы сейчас устанавливаете enumValue. Затем позвоните:

get {
   BeforeDelegate();
   // Do calcs
   AfterDelegate();
}

Какое практическое применение? Зачем вам этот шаблон?

Sidenote: Если у меня есть геттер, выполняющий такую ​​логику, я с большей вероятностью включу ее в метод. Это меньше шансов удивить людей. Методы намекают на то, что я, вероятно, что-то сделал под капотом, чтобы получить запрашиваемое вами значение, помимо простого представления скалярного значения.

...