У меня реализован шаблон стратегии. Одна из стратегий должна возвращать 2 значения, а остальные - 1 значение. В настоящее время я использую вне параметра в методе интерфейса, чтобы он был доступен для одной стратегии, которая устанавливает это значение и делает его нулевым для всех других стратегий, как в приведенном ниже примере.
Я хотел бы знать, есть ли лучший способ, чтобы эта одна стратегия возвращала несколько значений, не заставляя все другие стратегии иметь дело с этим параметром out (даже если все они собираются установить его равным нулю) Например:
public interface IContributionStrategy
{
decimal (decimal configuredAmt, out decimal? recurrent);
}
public class Strategy1 : IContributionStrategy
{
public Strategy1 (int param1)
{
this.Param = param1;
}
public decimal Calculate(decimal amt, out decimal? recurrent)
{
recurrent = somevalue;
//some logic that uses amt and this.Param and performs calc
return calculatedLogic;
}
public class Strategy2 : IContributionStrategy
{
public decimal Calculate(decimal amt, out decimal? recurrent)
{
recurrent = null; //having to set this to null only because its in the Calculate() in the interface and this strategy is not using the recurrent value.
//some logic that uses amt and performs calc
return calculatedLogic;
}
}
Или класс, в котором есть два свойства (для двух значений)?
Если у вас есть много стратегий, которые возвращают одно значение, и одна, которая должна возвращать несколько значений, это не похоже на то, что последнее принадлежит одному и тому же месту. Как они используются?





Я бы посоветовал вам рассмотреть две сильные альтернативные сигнатуры:
(1)
IEnumerable<decimal> Calculate(decimal configuredAmt);
(2)
decimal Calculate(decimal configuredAmt, Action<decimal> extra);
Вы бы реализовали это так:
(1)
public IEnumerable<decimal> Calculate(decimal amt)
{
yield return 1m;
yield return 42m;
yield return 2m;
}
(2)
public decimal Calculate(decimal amt, Action<decimal> extra)
{
extra(1m);
extra(42m);
return 2m;
}
Второй вариант можно использовать так:
var s = new Strategy1();
var extras = new List<decimal>();
decimal r = s.Calculate(1m, x => extras.Add(x));
В результате r == 2m и extras содержат 1m и 42m.
Я бы предложил класс, содержащий и то, и другое.
public class CalculateResult {
decimal amount {get;set}
decimal? recurrent {get;set}
}
Вместо того, чтобы возвращать примитивный тип данных, я предлагаю вам вернуть определенный пользователем тип данных (например, класс, структура), содержащий всю необходимую информацию в виде свойств.
class result
{
decimal result1;
decimal? result2;
.......
}
Возможно,
IEnumerable<decimal?>в качестве возвращаемого типа?