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つ増えること。
これはどうせ一括で読み込んで使用する方法と、キャッシュして使用する方法ぐらいしかないのだから、やっぱりこれも冗長だ。


……どうするかなぁ(;´Д`)