(交叉programmers.stackexchange) 我试图第一次使用SOLID原则。我正在重新分解存储文件信息并使文件操作可用的File类。 然后将该类继承到特定的文件类型,以便为该类型提供可用的方法。
我已经开始使用SRP,并尝试创建一个FileWriter
和FileReader
抽象类来从不同的资源进行读写。一些包括:
SOAP
,REST
??)。我很高兴地说文件数据是由字节数组处理的,但我不知道如何处理资源的文件路径/ 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
类来公开流。
最好的方法是什么?
答案 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可能会包装一个用户名,密码,表和主键,等等。