添加条件逻辑而不违反SOLID原则C#

时间:2016-01-21 09:28:10

标签: c# architecture solid-principles

我有以及接口和实现如下。 如果一个数字可以被devisor整除,它将显示名为" Divisible"的内容。 现在新的增强功能出现在我需要根据时间更改文本的地方。 如果数字是可分的并且时间是12:00 PM,则显示" Divisible ***"。如果时间不是" 12:PM"显示旧值i:e" Divisible"。 我知道可以做到,但条件是我们不应该违反SOLID原则。我所做的设计是错的吗?请建议。

public interface IRule
{
    string GetResult(int number);
}

public class DivisibleRule : IRule
{

    private readonly int divisor;


    private readonly string contentToDisplay;


    private readonly string replacementContent;


    public DivisibleRule(int divisor, string contentToDisplay)
    {
        this.divisor = divisor;
        this.contentToDisplay = contentToDisplay;
    }

    /// <summary>
    /// Gets the result.
    /// </summary>
    /// <param name="input">The input.</param>
    /// <returns>Returns the content if divisible.</returns>
    public string GetResult(int input)
    {
        return input % this.divisor == 0
             ?  this.contentToDisplay
            : string.Empty;
    }
}

1 个答案:

答案 0 :(得分:2)

如果要在不修改现有代码的情况下添加此功能(基本上是Open/closed principle的内容),那么您可以添加一个decorator,它将新的条件逻辑应用于已经返回的结果现有DivisibleRule。然后,只要合适,您就可以使用装饰师装饰的DivisibleRule

这个装饰器看起来像这样:

public class RuleTimeDecorator : IRule
{
    private readonly IRule _decoratedRule;

    public RuleTimeDecorator(IRule decoratedRule)
    {
        _decoratedRule = decoratedRule;
    }

    public string GetResult(int input)
    {
        var result = _decoratedRule.GetResult(input);

        return IsMidnight()? $"{result} ***" : result;
    }

    private bool IsMidnight() => //here goes the code to check if current time meets criteria 
}

很好的是,这个装饰器可用于装饰IRule的任何其他植入(只要它在你的域中产生感觉)。

BTW我正在使用一些C#6功能,如字符串插值和表达身体的成员,但这不是必需的。