5

私は最近、次の設計上の考慮事項について考えています。たとえば、ファイルを読み取って結果を返すことができるオブジェクトがあるとします。このオブジェクトはむしろインターフェースを公開する必要があると思いますか?

void readFromFile(File file);

または、メソッドを持つように設計しますか

void readFromFile();

コンストラクターで必要な値を提供しますか?2番目のオプションは、コンストラクターに複数のパラメーターを設定し、ビルダーを使用してユーザー設定に基づいてfileReadersを構築する場合に適しているようです...どう思いますか?

4

4 に答える 4

9

それはオブジェクトのより広い文脈に依存します。

オブジェクトのまとまりが非常に高い場合、つまり、主に特定のファイルから読み取ることを目的とした狭い範囲のオブジェクトの場合は、コンストラクターで定義する必要があります。OOの設計に関しては、一般的に高い凝集度は良いことです。したがって、私は一般的にこのオプションを好みます。アプリケーションがマルチスレッドであり、オブジェクトがスレッドセーフである必要がある場合、私は間違いなくこれに傾倒します-このアプローチにより、きめ細かく不変のオブジェクトを簡単に構築できると主張します。これは、回避しようとするときに非常に役立ちます。競合の危険。

オブジェクトが他の多くのタスクを担当している場合は、並行性について心配する必要はありません。また、ファイルが実際のオブジェクトの状態の一部として含まれることは実際には意味がありません。パラメータは間違いなく最良の選択です。

于 2012-11-18T23:34:57.450 に答える
2

これはあなたのオブジェクトが何を表しているかについての質問だと思います。

ファイルなしでオブジェクトがモデル化するもののインスタンスを持つことに意味があるかどうか疑問に思う必要があります。

オブジェクトの責任について考え、「オブジェクトを砂漠に連れて行く」方法を使用します。オブジェクトが何であるか、そしてオブジェクトが何を知っておくべきかを考えてみてください。ちょうどその時あなたはあなたの答えを持っているでしょう。

于 2012-11-18T23:37:11.667 に答える
1

最初の解決策は最もクリーンです。

ただし、マルチスレッドを処理する場合は大きな違いがあります。

2つのケース:

クラスは一度インスタンス化されることになっています:

オブジェクトが不変でなくfile、フィールドとしてのオブジェクトを所有している場合は、予期しない事態を避けるために、多くの同期(ロック)を行う必要があります。

クラスはN回インスタンス化されることになっています

Nスレッドに対してN回=>要件とインスタンスの重みによっては、大量のメモリが必要になる場合があります。


したがって、APIは各スレッドに対してローカルであるためvoid readFromFile(File file);、より適しています。file

実際、クラスがfileオブジェクトを操作する多くのメソッドを所有していて、並行性とメモリスペースが最優先事項ではない場合はfile、インスタンスのフィールドを作成します。これにより、コードがクリーンアップされます。

于 2012-11-18T23:47:55.420 に答える
0

これは、このオブジェクトがどこで使用されるかによって異なります。これが、読み取られるファイルが1つまたは2つだけで、それらが何度も読み取られるプログラムの場合は、2番目のオプションの方が適しています。他のほとんどすべてのシナリオでは、単一のオブジェクトを使用して複数のファイルを読み取ることができるため、最初のシナリオが優先されます。

繰り返しになりますが、このクラスを多数のプログラムで使用する(または配布する)ことを計画していて、どちらのメソッドが事前に最適かわからない場合は、両方を含めることができない理由はありません-2つのコンストラクター(1つのデフォルト)があります1つ、およびファイルを取得する1つ)、次に上記の両方のメソッドを含めます。これにより、クラスをどちらのタイプのプログラムでも効果的に使用できます。

すなわち

public class YourFileReader() {
    File defaultFile;

    public YourFileReader() {
        //initialize
    }

    public YourFileReader(File aDefault) {
        defaultFile = aDefault;
        //initialize
    }

    public void readFromFile() {
        if(defaultFile!=null) {
            //read from defaultFile
        }
        else {
            //exception?
        }
    }

    public void readFromFile(File file) {
        //read from file
    }
}
于 2012-11-18T23:37:21.890 に答える