Каков приемлемый способ динамического изменения функции делегата в .NET? - PullRequest
1 голос
/ 18 июня 2009

Предположим, у меня есть класс, который представляет продукт, который будет оцениваться с использованием одной из нескольких различных ценовых стратегий. Это ценообразование происходит сотни раз в секунду, поэтому для исключения повторяющихся операторов if / else я вместо этого использую делегат для запуска соответствующей стратегии, например:

Private Delegate Sub PricingModel(ByVal params As PricingParameters)
Private myPricingModel As PricingModel
Private myPricingParameters As PricingParameters

Public Sub RunPricingModel()
    myPricingModel(myPricingParameters)
End Sub

У меня такой вопрос: если я хочу изменить стратегию, что мне делать с myPricingModel? В настоящее время я просто устанавливаю его на новую PricingModel:

Public Sub SwitchStrategy(ByVal strategy As PricingStrategy)
    Select Case strategy
        Case PricingStrategy.STRATEGY_X
            myPricingModel = New PricingModel(AddressOf PricingModelStrategyX)
        Case PricingStrategy.STRATEGY_Y
            myPricingModel = New PricingModel(AddressOf PricingModelStrategyY)
        Case Else
            Exit Sub
    End Select
End Sub

Но мне это не кажется правильным (хотя, похоже, работает). Есть ли принятый / лучший способ сделать это? Или это стандартный способ? Или это просто обреченный подход с самого начала?

Ответы [ 2 ]

4 голосов
/ 18 июня 2009

Нет ничего плохого в этом общем подходе. До тех пор, пока PricingStrategy приемлема как перечисление, это вполне приемлемый способ изменить частное поведение для другой ценовой стратегии.

Мое единственное пристальное замечание было бы то, что в "Case Else" вы должны избегать молча провала.

0 голосов
/ 18 июня 2009

У вас может быть статический класс с ценовыми стратегиями (C #):

public static class PricingStrategies {
    public static PricingStrategyX( PricingParameters parameters ) { /* here is body */ }
    public static PricingStrategyY( PricingParameters parameters ) { /* here is body */ }
}

// ... somewhere elsewhere ...
public PricingStrategyDelegate Pricing;
// ...
this.Pricing = PricingStrategies.PricingStrategyX;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...