BREWのファイル管理(2)
とりあえず今の脳内設計。
class InputStream{ public: int read() = 0; int read( Array< byte > buf , int off , int len ); int close() = 0; }; class OutputStream{ public: int write( int v ) = 0; int write( Array< byte > buf , int off , int len ); int close() = 0; };
class FileInputStream : public InputStream{ private: FileInputStream( StorageFile ); }; class FileOutputStream : public OutputStream{ private: FileOutputStream( StorageFile ); }; class StorageFile{ InputStream getInputStream(); OutputStream getOutputStream(); };
class FileManager{ static StorageFile openStorageFile( const String& str ); };
こんな感じ。
StorageFileからInputStreamとOutputStreamを取得出来るようにする。
InputStreamとOutputStreamのインターフェースを満たしたストリームクラスと、それを実装する為に必要なクラスを用意する。
そうすれば、ファイル系クラスの中身は、全てのデータをバッファに格納しようが、ちょっとずつ読み込もうが、CRCを付けようが付けまいが、どんな実装にしても構わなくなる。
ただ、この実装だと、ファイル系クラスにインターフェースがないので、ちょっと違和感を感じる。
だからといって、ファイル系クラスのインターフェースを、
class FileBase{
InputStream getInputStream() = 0;
OutputStream getOutputStream() = 0;
};
こうやってしまうと、(意味的に)read onlyなファイルに対して書き込んでしまうことになる。仮にnullを返すような実装にしても、本来はストリームクラスにthisを渡すだけなのに、わざわざ書き込めるかどうかのnullチェックをするのは冗長だと思う。
はっきり言って、インターフェースクラスは必要だけれども、インターフェースは必要がない気がする。
まあ、ファイル系クラスにはファイル名が必ず存在するので、それをインターフェースにしてやることにする。
class FileBase{ String getName() = 0; }; class StorageFile : public FileBase{ String getName(); InputStream getInputStream(); OutputStream getOutputStream(); };
しかし、この実装だとまだ問題がある。
それはファイル系クラスを1つ作るたびに、ストリーム系クラスも1つ増えること。
これはどうせ一括で読み込んで使用する方法と、キャッシュして使用する方法ぐらいしかないのだから、やっぱりこれも冗長だ。
……どうするかなぁ(;´Д`)