我的第一个SOLID重新分解

时间:2014-11-03 23:54:25

标签: c# solid-principles

(交叉programmers.stackexchange) 我试图第一次使用SOLID原则。我正在重新分解存储文件信息并使文件操作可用的File类。 然后将该类继承到特定的文件类型,以便为该类型提供可用的方法。

我已经开始使用SRP,并尝试创建一个FileWriterFileReader抽象类来从不同的资源进行读写。一些包括:

  • 文件系统
  • 数据库
  • 其他未定义的服务(SOAPREST ??)。

我很高兴地说文件数据是由字节数组处理的,但我不知道如何处理资源的文件路径/ uid。

这是我的......

public abstract class EFileReader
{
    event EventHandler<IEFileEventArgs> ReadThreadedComplete;
    public abstract byte[] Read(object source);
    public abstract async Task<byte[]> ReadAsync(object source);
    public abstract void ReadThreaded(object source);
    protected virtual void OnFileRead(IEFileEventArgs e)
    {
        EventHandler<IEFileEventArgs> handler = this.ReadThreadedComplete;
        if (handler != null)
        {
            handler(this, e);
        }
    }
}

我可以将对象转换为实现中所需的类型。 或者,它可以是在实现中以某种方式指定的泛型类型。

public abstract class EFileReader<T>
{
    event EventHandler<IEFileEventArgs> ReadThreadedComplete;
    public abstract byte[] Read(T source);
    public abstract async Task<byte[]> ReadAsync(T source);
    public abstract void ReadThreaded(T source);
    protected virtual void OnFileRead(IEFileEventArgs e)
    {
        EventHandler<IEFileEventArgs> handler = this.ReadThreadedComplete;
        if (handler != null)
        {
            handler(this, e);
        }
    }
}

我可以在实现中定义或约束T

...或者可能有一些我可以编写的源代码抽象,以适应各种可能的用例。 我想我可以让它采用一个抽象的FileResource类来公开流。

最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

我认为您在创建新类型时走在正确的轨道上,但我称之为FileIdentifier。它不一定&#34;暴露流&#34;本身,它将与FileStorage类一起使用,如

abstract class FileStorage
{
    public abstract Stream GetStream(FileIdentifier id);
}

FileReader类可能不再需要是抽象的 - 而是它的构造函数需要一个FileStorage派生类的实例,它将拥有从文件中获取流的详细信息:

class FileReader
{
    FileReader(DiskFileStorage storage)..

    override byte[] Read(FileIdentifier id)
    {
        Stream stream = this.storage.GetStream(id);
        return stream.Read....
    }
}

您可以使用DiskFileStorage,NetworkFileStorage,DatabaseFileStorage等,以及相应的FileIdentifer派生类。 DiskFileIdentifier只包装一个文件路径字符串,NetworkFileIdentifier可能会包装一个URL,DatabaseFileIdentifier可能会包装一个用户名,密码,表和主键,等等。