枚举与界面设计

时间:2017-10-17 20:47:58

标签: oop design-patterns

我有一个设计问题,其中要求是这样的:

  1. 编写一个带参数的生成函数(" TYPE")
  2. 根据TYPE,我需要生成一个String并返回它。所以TYPE有效地改变了你生成String的方式。
  3. 我正在考虑两种设计方案:

    1. 使用枚举:创建一个具有TYPES的枚举。然后提供一个generate方法,根据TYPE进行处理并返回一个字符串。
    2. 使用接口:创建一个具有函数generate()的接口。为每个TYPE创建实现,以实现generate()。
    3. 你觉得哪个更好,出于什么原因。

2 个答案:

答案 0 :(得分:1)

虽然,方法#2遵循OOAD的开放/封闭原则,即您将添加新的接口实现,每次添加新TYPE并且您不会修改现有代码,这是非常安全的因为它不需要测试旧代码/方法。因此,您的代码将打开以进行扩展,但已关闭以进行修改。但是,如果您经常添加新的TYPE,那么方法#2就有意义了。

IMO,在这种情况下,我建议使用方法#1,因为业务要求非常简单,即根据参数类型生成字符串。因此,在我看来,使用界面将过度工程化(如果不经常添加TYPES)。

答案 1 :(得分:1)

最好为此问题语句使用一些设计模式,以使您的代码更加健壮和可重用。我会建议你策略设计模式。它是使用Interface的基于抽象的模式。

基本示例:

public interface IMyStrategy
{
    string Generate(string someValue);
}

public class StragegyA : IMyStrategy
{
    public string Generate(string somevalue)
    {
        return /Implementation/;
    }
}

public class StragegyB : IMyStrategy
{
    public string Generate(string somevalue)
    {
        return /Implementation/;
    }
}
public class MyStrategyContext
{
    private readonly IMyStrategy _ImyStrategy;

    public MyStrategyContextIMyStrategy(IMyStrategy  myStragegy)
    {
        _ImyStrategy = myStragegy
    }

    public string GenerateResult(string someValue)
    {
        return _ImyStrategy .Generate(someValue);
    }
}

[Test]
    public void GenerateValue()
    {
   var abc = new MyStrategyContext(new StragegyA());
       abc.GenerateResult("hey print");
    }