【问题标题】:Cleaning up FileInfo.name switch/case statement with an interface使用接口清理 FileInfo.name switch/case 语句
【发布时间】:2015-04-01 15:09:33
【问题描述】:

我有以下几点:

foreach(var file in today.GetFiles())
{
    if(file.Length > 0 && file.Extension == ".txt")
    {
        switch (file.Name)
        {
            case "realy_long_ugly_file_name_0":
                //do something
                break;
            case "realy_long_ugly_file_name_1":
                //do something else
                break;
        }
    }
}

我遇到了this post,并认为我可以使用interface 清理我的代码。这是否适合这种情况?我已经设置了接口和继承,但不太知道如何进行。

我了解该接口根据IPizza 成员在IList<IPizza> 中的内容调用不同的class。我很难理解如何将file.Name(以前使用switch/case)传递给我的interface 来调用不同的类。

interface IMyFiles
{
    void Process(FileInfo file);
}

public class FileName0 : IMyFiles
{
    void IMyFiles.Process(FileInfo file)
    {
        //do somthing specific to FileName0
    }
}

public class FileName1 : IMyFiles
{
    void IMyFiles.Process(FileInfo file)
    {
        //do somthing specific to FileName1
    }
}

【问题讨论】:

    标签: c# oop interface


    【解决方案1】:

    您这里的目标是将基于文件的不同类型的处理封装到自己的对象中。

    这些是我看到的选项:

    1. IMyFiles 对象决定它们处理什么(您可以通过在具体实现的方法开头添加 if 来做到这一点)。基本上用你所有的 IMyFiles 类和调用过程制作一个集合,直到有人知道它需要拿起它。
    2. 使用您的 switch 语句创建一个工厂,以便它返回 IMyFile 的实例,然后只调用 process。这样,我是什么(建设)和我能做什么(是分开的)的决定。

    【讨论】:

      【解决方案2】:

      如果所有文件具有相似的列但数量不同,例如第一个有 3 列,其他有 x 列,我们可以有其他编程选择,但如果文件完全不同,那么这是很好的代码,它可读并记录在案

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-24
        • 2011-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多