1

データベースからデータを収集するスレッドをいくつか作成しています。

ただし、これらすべてのスレッドで、Databaseオブジェクトへのローカル参照が必要になります。これを行うには、インターフェイスを使用する方法が 2 つあります。

public interface Command {
void execute();
void collectData();
void processData();
void setData(ArrayList<Objects> data);

}

次に、各 thead クラスで変数を手動で設定します (コマンド インターフェイスを拡張します)。

ただし、テストと検索を行うと、次のことができることがわかりました。

public abstract class commandtest implements Runnable{
    Database db;
    abstract void execute();
    abstract void collectData();
    abstract void processData();
    abstract void setData(ArrayList<Objects> data);
}

ここでは、各スレッド オブジェクトを拡張できる抽象クラスを作成し、必要な変数を設定するコンストラクターを作成します。

私の質問はどちらかといえば単純ですが、これら 2 つの方法のどちらが最善の方法ですか?

4

2 に答える 2

2

一部のコードまたは一部の変数を共有する必要性だけに基づいて、変数の配置を決定するべきではありません。抽象クラスが、それを拡張するすべてのものにアクセスできる必要があるという考えで設計されている場合は、基本クラスDatabaseを配置します。Database

一方、意図した実装の一部がデータベースとは関係がない場合はDatabase、抽象基本クラスに追加しないでください。もちろん、継承階層の 2 つのレベルだけに制限されているわけではありません。いつでもcommandtestを持たないものから始めてDatabase、データベースを必要とするすべてのものに対して別のレベルの抽象クラスを追加できます。

abstract class AbstractCommandTest {
    abstract void execute();
    abstract void collectData();
    abstract void processData();
    abstract void setData(ArrayList<Objects> data);
    // Other methods shared by all commands
}
abstract class AbstractDatabaseCommandTest extends AbstractCommandTest {
    protected Database db;
    protected AbstractDatabaseCommandTest(Database db) {
        this.db = db;
    }
}
class SomeCommandThatDoesNotNeedDatabase extends AbstractCommandTest {
    ...
}
class DatabaseCommand1 extends AbstractDatabaseCommandTest {
    ...
}
class DatabaseCommand2 extends AbstractDatabaseCommandTest {
    ...
}
于 2013-04-30T14:34:15.047 に答える