Enum过度使用?

Cod*_*key 2 c# enums dictionary

我不确定我是否在这里滥用Enums.也许这不是最好的设计方法.

我有一个枚举,它声明了执行批处理文件的方法的可能参数.

public enum BatchFile
{
    batch1,
    batch2
}
Run Code Online (Sandbox Code Playgroud)

然后我有我的方法:

public void ExecuteBatch(BatchFile batchFile)
{
    string batchFileName;
    ...
    switch (batchFile)
        {
            case BatchFile.batch1:
                batchFileName = "Batch1.bat";
                break;
            case BatchFile.batch2:
                batchFileName = "Batch2.bat";
                break;
            default:
                break;
        }
    ...
    ExecuteBatchFile(batchFileName);
}
Run Code Online (Sandbox Code Playgroud)

所以我想知道这是否是合理的设计.

我想的另一个选择是在构造函数中创建一个Dictionary <>,如下所示:

Dictionary<BatchFile, String> batchFileName = new Dictionary<BatchFile, string>();
batchFileName.Add(BatchFile.batch1, "batch1.bat");
batchFileName.Add(BatchFile.batch2, "batch2.bat");
Run Code Online (Sandbox Code Playgroud)

然后我会去,而不是使用switch语句:

public void ExecuteBatch(BatchFile batchFile)
{
    ExecuteBatchFile(batchFileName[batchFile]);
}
Run Code Online (Sandbox Code Playgroud)

我猜测后者是更好的方法.

Mit*_*eat 8

我可能会按照以下方式进行设计:

public interface IBatchFile
{
    void Execute();
}

public class BatchFileType1 : IBatchFile
{
    private string _filename;

    public BatchFileType1(string filename)
    {
        _filename = filename;
    }

    ...

    public void Execute()
    {
        ...
    }
}

public class BatchFileType2 : IBatchFile
{
    private string _filename;

    public BatchFileType2(string filename)
    {
        _filename = filename;
    }

    ...

    public void Execute()
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

实际上,我将任何常见功能提取到BatchFile基类中

  • 我贬低并且这样做是因为我发现这个答案促使过早的复杂性.枚举的一个要点是用户不必知道文件名.此外,不需要第二种实现类型来表示批处理文件,因此不需要创建单独的接口类型. (2认同)
  • @Mark Cidade:这绝对是一个更好的方法.虽然它可能会在前面添加一点点复杂的复杂性,但它会减少繁琐的复杂性,从而使维护变得复杂.如果可能,应避免使用案例陈述,以支持更灵活,面向对象和可扩展的解决方案. (2认同)