レガシーファイルを表すクラスを実装しています。ファイルはバイナリであり、広範囲にわたる解析が必要です。ファイルを解析するためのコードはおそらく数千行あります。クラスには2つのコンストラクターがあります。
class CrmxFile {
public:
CrmxFile(std::wstring filename);
CrmxFile(std::ifstream& file);
...
}
オブジェクトはファイルの内容なしでは意味をなさないため、オブジェクトの作成中にすべての解析を実行する必要があります。私は大規模なコンストラクター(streamパラメーターを持つコンストラクター)を実装しようとしていましたが、私の同僚は、非常に大規模なコンストラクターを使用するのは良い習慣ではないと主張しています。代わりに、解析を実行するプライベートメソッドを作成し、ストリームが読み取り可能であることを確認した後、コンストラクターからこのメソッドを呼び出す必要があります。おそらく、ファイルヘッダーを読み取って、ストリームに正しいデータが含まれていることを検証します。
ガイドライン/ルール/規約などはありますか?そのような状況を支配するのですか?基本的に(擬似コードで)、2つのアプローチのどちらが優れているか、
長いコンストラクター:
CrmxFile::CrmxFile(std::ifstream& file) {
if (file is not readable) {
throw new CmrxException(read_error);
}
CmrxHeader header(file);
if(!header.isValid()) {
throw new CmrxException(invalid_file);
}
//now do all the reading/parsing of the file
//constructor may end up being a thousand lines of code
...
}
または短いコンストラクターとヘルパーメソッド:
class CrmxFile {
public:
CrmxFile(std::wstring filename);
CrmxFile(std::ifstream& file);
private:
ParseFile(std::ifstream& file);
...
}
CrmxFile::CrmxFile(std::ifstream& file) {
if (file is not readable) {
throw new CrmxException(read_error);
}
CrmxHeader header(file);
if(!header.isValid()) {
throw new CrmxException(invalid_file);
}
ParseFile(file);
}
void CrmxFile::ParseFile(std::ifstream& file) {
//do all the reading/parsing of the file here
...
}