1

私は自分の PC ブリッジに Teensy++ 2.0 を使用して基本的な EEPROM バーナーを自作しました。うまく機能していますが、互換性を拡張しようとすると、私のコードはかなりハッキリしています。このコードを拡張可能にするための適切な設計についてのアドバイスを探しています。ソフトウェアデザインパターンの授業を受けたことがありますが、それは少し前のことで、現在空白を描いています。基本的に、使用例は次のとおりです。

ReadByte()、WriteByte()、ProgramByte() (プログラムするためにマルチバイト書き込みシーケンスを必要とする FlashROM 用)、EraseChip() などのいくつかのメソッドがあるので、基本的には EEPROM の純粋な仮想ベースがあります。サポートしたい各チップタイプの具象クラスによって実装されるクラス。注意が必要な部分は、生成するチップ タイプ オブジェクトを決定することです。私は現在、Teensy++シリアル入力で疑似端末フロントエンドを使用しています。これは、パラメーターを備えた基本的なコマンドラインタイプのインターフェイスであり、チップタイプなどのオプションをTeensy++に送信します。問題は、ファクトリ パターンのようなデザイン パターン (C/C++) があり、チップ タイプの文字列入力を受け取り (ユーザーから取得しているため)、EEPROM オブジェクトを返すかどうかです。正しい派生型の、新しいチップ派生クラスを作成するたびに新しいチップをリストに追加する必要があるような、大きなswitchステートメントやそのような醜いものを手動で作成する必要はありませんか? 次のようなものです:

public const EEPROM & GetEEPROM(const std::string & id)

文字列「am29f032b」を渡すと、AM29F032B オブジェクトへの参照が返されます。または、文字列「sst39sf040」を渡すと、SST39SF040 オブジェクトへの参照が返されます。これにより、前述の関数を呼び出すことができます。指定されたチップで機能します。

このコードは AVR マイクロコントローラーで実行されるため、OOP のオーバーヘッドが大きいものは何もありませんが、私が使用している特定のマイクロコントローラーには、比較的大量のプログラム フラッシュとワーク RAM があるため、私のようなものではありません。 m は 2kb で操作しようとしていますが、リソースが限られていることに注意する必要があります。

4

2 に答える 2

2

あなたが探しているのはPluggable Factoryです。ここに良い説明があります。これは John Vlissides ( Gang of Fourの 1 人) によるもので、Abstract factory パターンをさらに数歩進めたものです。このパターンは、たまたま COM のアーキテクチャ基盤でもあります。

C++ で実装する通常の方法は、抽象ファクトリの静的レジストリを維持することです。いくつかのテンプレートと静的初期化子を慎重に使用することで、各具体的な製品 (例: チップの種類) に含めるボイラープレートの数行で全体をまとめることができます。

静的イニシャライザを使用すると、レジストリと製品を作成するコードの両方から具体的な製品を完全に切り離すことができ、それぞれをプラグインとして実装する可能性があります。

于 2013-07-10T22:10:50.817 に答える
0

string->factory オブジェクトのマップを保持するシングルトン ファクトリ マネージャを使用できます。次に、各ファクトリ クラスは、起動時にマネージャに登録するグローバル インスタンスを持ちます。

私は一般的にグローバル、特にシングルトンを避けようとしていますが、他のアプローチでは、避けようとしている何らかの形式の明示的なリストが必要になります。タイミングの問題に注意する必要があります (さまざまなファクトリが作成される順序について、実際には何も想定できません)。

于 2013-07-10T21:58:07.587 に答える