如何使我的代码可扩展以供将来使用

时间:2016-05-02 13:55:56

标签: c#

我正在尝试构建我的代码,以便将来可以轻松扩展它,但是我认为我正在过度思考并努力实现这一目标。

我的情景是: 基于传递给我的一些数据,我需要生成一个类。 我需要生成的类在性质上与任何其他类都不相似。

例如,我有几个可以创建的类:

public class File1{
   public string Name {get;set;}
   // etc...
} 
public class File2{
   public int ID {get;set;}
   // etc...
} 
public class File3{
   public string MyType {get;set;}
   // etc...
} 

在我的主要课程中,我有:

switch (myExtension)
            {
                case ".abc":
                    ProcessABC(myContents);
                    break;
                case ".def":
                    ProcessDEF(myContents);
                    break;
                case ".ghi":
                    ProcessGHIL(myContents);
                    break;
               //etc...
            }

我尝试使用常用方法创建界面:

public ProccessStuff(data);

但我认为这样做不会有效,因为我没有共同的回报类型。

然后我想到了一个抽象类,但似乎我会把很多工作推到那个抽象类中。

public abstract class MyAbstractClass 
{
    public void ProcessStuff(string data)
    {
        // Parse the data into an object

        // Update some DB fields

        // Log some data
    }
}

我是否正在创建一个抽象类来处理我的所有逻辑?

2 个答案:

答案 0 :(得分:2)

你说这些课程没有任何相似之处。但事实并非如此 - 他们都需要string进行一些处理,而这正是您希望在类之间共享的。

创建一个界面IDataProcessor(或其他东西)。在那里,有一个方法 - void Process(string)。文件类将以他们需要的方式实现该方法。

这会将您的主要课程switch更改为简单的

IDataProcessor actualDataProcessor = ...;

actualDataProcessor.Process(myContents);

当然,您仍然需要某种方法来创建适当的IDataProcessor基于例如扩展名。根据您的确切需求,简单的Dictionary<string, Func<IDataProcessor>>可能就足够了。否则,还有很多其他方法可以根据需要更动态地绑定类,或使用显式工厂类。

答案 1 :(得分:0)

您是否尝试过使用泛型? 这是一个例子:

public void Process<T>(string contents)
    where T : IProcessStuff, new ()
{
    // Common work to do here
    // ...

    // Specific processing stuff
    T t = new T();
    t.ProcessStuf(contents);
}

public interface IProcessStuff
{
    void ProcessStuf(string contents);
}