私は Java の世界に不慣れで、自分のアプリケーションに少し苦労しています。アプリケーションをいくつかのレイヤー (UI、コントローラーなど) に分割しました。最下層は、センサーからのデータ収集を担当します。
私の目標は、外部ユーザー/プログラマーが新しいセンサーを簡単に追加できるように、このレイヤーを拡張可能にすることです。
各センサーを個別のクラスに分離するだけでよいですか、それとも他の解決策はありますか?
それが「奇妙な」質問である場合、私の謝罪、私はただの初心者です:)
ありがとう!
私は Java の世界に不慣れで、自分のアプリケーションに少し苦労しています。アプリケーションをいくつかのレイヤー (UI、コントローラーなど) に分割しました。最下層は、センサーからのデータ収集を担当します。
私の目標は、外部ユーザー/プログラマーが新しいセンサーを簡単に追加できるように、このレイヤーを拡張可能にすることです。
各センサーを個別のクラスに分離するだけでよいですか、それとも他の解決策はありますか?
それが「奇妙な」質問である場合、私の謝罪、私はただの初心者です:)
ありがとう!
基本的に、構築しているのはフレームワークです。センサー コードは、ハリウッドの原則に従います。「電話しないでください。電話します」
これは、依存性逆転の原則を適用することによって実現されます。
インターフェイス Sensor.java を作成します。
public interface Sensor {
Reading getReading();
}
そして、Reading.java (これを一般化することは、センサー データ構造に必要な一般性に関連する Open Closed Principle の課題です):
public final class Reading {
}
そしてaa SensorReader.java:
public final class SensorReader {
private final Iterable<Sensor> sensors;
public SensorReader(Iterable<Sensor> sensors) {
this.sensors = sensors;
}
public void readSensors() {
for (Sensor sensor : sensors) {
Reading reading = sensor.getReading();
// so stuff with reading
}
}
}
ここより上はすべてフレームワークで、ここから先はすべてアプリケーション/クライアント コードです。
そして MotorEncoder.java:
final class MotorEncoder implements Sensor {
@Override
public Reading getReading() {
// do stuff to actually read motor encoder
return new Reading();
}
}
そして Application.java:
import java.util.Arrays;
public final class Application {
public static void main(String[] args) {
Sensor sensor = new MotorEncoder();
SensorReader sensorReader = new SensorReader(Arrays.asList(sensor));
sensorReader.readSensors();
}
}
最下層はList<Gatherer> gatherers変数を持つことができます。Gatherer は、最下層にとって重要なメソッドとのインターフェースである必要があります。
その後、誰でも独自の Gatherer を作成してレイヤーに登録できます。
最下層は、ギャザラーの実行、登録/削除などを担当します。