ハードウェア、特にカメラを使用して画像を収集し、さまざまな方法で処理するソフトウェアのリファクタリング作業を少し行っています。いくつかの異なるカメラがサポートされており、将来的には異なるカメラが存在する可能性が高いため、それらのカメアの実装を、何らかの種類のように機能するインターフェイスICamera
の背後に隠すことをお勧めしますFacadeのすべてのカメラが持つ可能性のある基本機能を提供し、新しいカメラが追加されたときにメインアプリケーションロジックをそのままにしておくことができます。
現在、これらのカメラにはさまざまな機能があり、将来的に新しいカメラが導入される可能性があります。ズーム可能なカメラのIZoom
などの追加のインターフェイスを定義して、そのズーム機能の隠された部分を隠し、ユーザーインターフェイス要素を再利用できるようにすることを考えました。
ただし、これらのさまざまなインターフェイスを「だれが」追跡する必要があるかについて、私は少し混乱しています(たとえば、インターフェイスのコントロールを描画するようにGUIに指示する必要がある場合など)。デザインの問題に近づいているのではないかと思っています。
したがって、私の問題は、将来のハードウェア機能のためにソフトウェアアーキテクチャを準備したいが、同時に基本機能を「そのまま」にしておくことです。基本的なものが欠けていますか、それともやりすぎですか?問題は創造的なものですか、それとも構造的なものですか?
以下に自分のアイデアを視覚化しました:
私はいくつかの構造設計パターン(VisitorやDecoratorなど)を読み上げましたが、私の最初の感じは、それらがこの問題に適していないということです。私の間違いを証明してください!
入れ子にできますか?
つまり.
Interface IZoom
{
Tuple<int, int> Range {get;}
// ...
}
Interface ICamera {
IZoom Zoom {get;}
// ...
}
ズームがない場合、プロパティはnullになりますか?機能が存在する場合は常にテストする必要があるため、コードが完全にクリーンになるわけではありません。一方、アイテムを描画する場合は、とにかくインターフェイスの存在をテストする必要があります。
時々それはのような何もしない要素を持っていることを助ける
class NoZoom: IZoom
{
Tuple<int, int> Range => new Tuple<50, 50> // 50mm lens with no zoom
}
通常、いくつかの機能を複数実装すると、戦略パターンが提案されます。 https://en.wikipedia.org/wiki/Strategy_pattern
あなたの場合、1つのクラス(カメラのタイプごと)が複数のことを実行できる可能性があるため、状況はもう少し複雑です:記録、ズーム、フラッシュなど。特定のカメラでできることは、あなたが責任を負いますいくつかのクラスに割り当てる必要があります。カメラ自体に責任を割り当てることを検討できます。 ICameraインターフェイスのコンシューマー(UIやRecordingControllerなど)は、カメラがサポートする機能をクエリし、それに応じて動作します。
これが行われます。 Bluetoothプロトコル:Bluetoothデバイスは、サポートされている「プロファイル」(機能)を、指定されたリストから照会できます。
戦略パターンと組み合わせると、次のようなインターフェイス(ICameraインターフェイス)を作成できます(C#構文を使用)。
public interface ICamera
{
void Connect();
void Disconnect();
void Start();
void Stop();
void Zoom(Direction zoomDirection, int zoomDistance);
void Flash();
CameraFeatures GetCameraFeatures();
}
このインターフェイスには、カメラmightが持つすべての機能が含まれている必要があります。すべてのカメラのスーパーセット。
CameraFeaturesは、好きなものを使いたい構造/クラスにすることができます。
public struct CameraFeatures
{
bool SupportsZoom;
int MaxZoomDistance;
bool SupportsFlash;
}
既存の機能のみを備えたカメラを追加する場合は、そのカメラのクラスを実装するだけで済みます。
このパターンの欠点は、(ICoolFutureStuffを意味するような)新しい機能を追加するときに、インターフェイスとCameraFeatures構造体を変更する必要があるため、すべてのカメラクラスとおそらくUIを実装する必要があることです。その機能も使用する必要があります。機能を追加する頻度とカメラを追加する頻度に応じて、決定を行う必要があります。機能を追加するよりも頻繁にカメラを追加するので、これは理にかなっていると思います。
お役に立てれば。
キド。