2014-11-03 85 views
0

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

我已经开始使用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

我会看看我在SOLID。你可能有一个通用的接口,但是有些东西比如说一个文件路径与说db连接非常不同。 – Kirby 2014-11-04 00:15:53

+0

谢谢@Kirby,那是我看到的问题。不同的资源不一定共享任何共同点。我能想到的一个例子可能是使用文件数据的多部分表单提交。有了@ NSFW的建议,多部分的例子可以用'FileStorage' implmentation覆盖,但它不需要'FileIdentifier'。 – Ablue 2014-11-04 01:29:48

回答

1

我认为你正在创建一个新类型的正确轨道,但我会把它称为FileIdentifier。它不一定会“揭露甲流”本身,而是将与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可能包装一个用户名,密码,表和主键等等。

+0

我的问题是基类'FileIndentifier'抽象类或接口是什么样子?“FileIdentifier”的不同实现是否共享任何内容? – Ablue 2014-11-04 01:23:37

+0

我想我只是将基类留空。关于它的一切都将针对相应的存储类。 – NSFW 2014-11-04 05:23:00

相关问题