基于枚举值编写方法而不会陷入代码气味

Gur*_*epS 3 design-patterns

想象一下,我有一个文件(word文档).

我有一个枚举,它将指示如何从文档中提取数据.因此,如果我只想要文本,图像,或两者(枚举的3个成员).

我有一个基于这个枚举的case语句,但没有陷入代码味道,我怎么能编写不太重复的代码?对于交换机中的每个条件,我应该有一个单独的方法(最简单的方法),还是一个接受一个paremeter的方法(比如枚举的值),然后用if语句说if(xyz)做abc,等等上.

还是有更快,更有效的方式?

tva*_*son 7

我会使用与工厂结合的策略模式,根据枚举值创建适当的策略. 编辑正如其他人指出的那样,你也可以通过Map确定正确的策略.工厂是我的选择,因为它只封装了逻辑,不需要任何数据存储.

public interface IExtractionStrategy
{
    object Extract( Document doc );  // or what ever result is best
}

public class TextExtractionStrategy : IExtractionStrategy
{
    public object Extract( Document doc )
    {
     .... algorithm for extracting text...
    }
}

public class ImageExtractionStrategy : IExtractionStrategy
{
    public object Extract( Document doc )
    {
     .... algorithm for extracting images...
    }
}


public static class StrategyFactory
{
     IExtractionStrategy GetStrategy( ExtractionEnum strategyType )
     {
         switch (strategyType)
         {
             case ExtractionEnum.Text:
                 return new TextExtractionStrategy();
                 break;
             case ExtractionEnum.Image:
                 return new ImageExtractionStrategy();
                 break;

             ...
         }
     }
}
Run Code Online (Sandbox Code Playgroud)