オブジェクトの作成は、暗黙的または明示的にファイルを作成する必要がありますか?


9

私は、ある形式のファイルを読み取り、別の形式のファイルを作成することを唯一の目的とするオブジェクトを作成しています。

オブジェクトの初期化中に出力ファイルを暗黙的に作成するのが最善ですか、それともユーザーがこのファイルを作成するかを選択できるパブリックメソッドを用意するのが最善ですか?

回答:


12

それをサポートする言語で作業している場合は、ストリームを取得するSaveメソッドを提供します。これにより、ユーザーはどこにいてもデータを保存できます。

ファイルへの保存よりも書き込みに20秒長い時間がかかりますが、プログラマーには簡単に理解でき、呼び出し側では実際に何が発生するかが非常に明確になります。

それを記述した方法(入力を読み取り、別のファイルに出力するオブジェクト)は、奇妙に思えます。構築中にすべてを行うオブジェクトを構築する目的は何ですか?

このように呼びますか?

var stuff = DoStuff();
new SaveFileWeirdClass(stuff);
return;

SaveFileWeirdClassの合理的な実装については、それを作成するだけでは副作用はないと思います。ファイルの読み取り-結構です。ファイルを作成しますか?番号。

私にはそれはこのようにはっきりしているようです:

var stuff = new StuffReader(); //Better name needed...
string filePath = this.whatever;

using(Stream stream = new FileStream(filePath))
    stuff.Save(stream);

1
これはいい。別の同様のオプションは、アプリケーションのストリームベースを実装するオブジェクトを実装し、他のストリームと同様に扱うことです。
Steven Evers

3

クラスで行うことにこだわっている場合は、初期化中に作成してください。そのステップを遅らせると、2つの悪いことが起こります。1つ目は、出力を生成することを意図していない限り、最初にオブジェクトを作成しなかったであろう呼び出し側に、明示的なステップを追加することです。次に、クラスのコードがファイルを開いているかどうかを判断してその条件を処理する必要がある少なくとも2つのポイントを追加します。1つは出力を書き込むとき、もう1つは破棄するときに閉じるときです。前者は、書き込みのたびにそのチェックを行う必要があることを意味します。これは、大量のチェックを行う場合には無駄になる可能性があります。

個人的には、どちらも実行せず、呼び出し元に事前に開かれたファイルハンドルをコンストラクターに渡すことを選択します。クラス内にファイルを作成すると、アクセス許可の設定や、デバイスに書き込む場合はデバイス固有の初期化などのオプションを呼び出し元に与えることができなくなります。FooConverterファイルを操作し、作成の動作を行うクラスのバージョンが必要な場合は、それをでラップしFooFileConverterます。


2

明示的に。

将来のリリースや一般的ではないアーキテクチャーで機能しなくなる可能性がある巧妙な副作用規則に依存しないようにする必要があります。もちろん、ユーザーが上書きできるデフォルトのファイルを用意する必要があります。


1

明示的なメソッドの他の引数に加えて:コンストラクターで作業を行う場合、クラスのすべてのユーザーに、オブジェクトを作成するためだけに例外処理を強制する必要があります。これは、多くのボイラープレートコードにつながる可能性があります。

これに関する議論については、https://stackoverflow.com/questions/6086334/is-it-good-practice-to-make-the-constructor-throw-an-exceptionを参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.