1

SetParams(...)可変数の引数で名前を付けた C 関数があります。この関数は、静的データ構造をセットアップします (名前を付けましょうData)。SetParamsなどの引数のペアで使用されますSetParams("paramA", paramA_value, "paramB", paramB_value)。何度も呼び出すこともできます。e.g.

SetParams("paramA", paramA_value);
SetParams("paramB", paramB_value);
...

Executeすべての「パラメータ」が設定されると、引数を取らない別の関数が呼び出されます (名前を付けましょう)。

Execute();
// uses data from static 'Data' and performs error_handling and execution

この種のコードをよりオブジェクト指向の方法で構築できないかと考えていました。いくつかの引数のペアが他の引数と矛盾する可能性があるため、特にエラー処理についてアドバイスをお願いします。

4

4 に答える 4

2

C でオブジェクト指向設計を作成するための一般的な方法は、すべてのクラス メンバ変数を格納するために使用される構造体への参照を渡すすべてのメソッドに対してです。言い換えれば、 C++ では、 C で持っているはずlistObj.clear()です list_clear(&listObj)

これはちょっと見苦しいですが、静的メンバー変数を使用し、実装を 1 回だけ使用するように制限したい場合を除き、必要です。

以下の例では、各メソッドで構造体 ParamUtilObj への参照がどのように渡されるかに注目してください。

// --- paramUtil.h

// Stores all the objects member variables (public and private)
struct ParamUtilObj {
  int paramCnt;
  char param1[25];
  char param2[25];
  ...
};

bool paramUtil_initialize( struct* ParamUtilObj pData );
bool paramUtil_addParam( struct* ParamUtilObj pData, const char* pKey, const char* pValue );
bool paramUtil_execute( struct* ParamUtilObj pData);

可変長メソッドに関して。可能であればそれらを避け、一度に 1 つずつ追加するようにします。パラメータを検証するビジネス ロジックは、私の意見ではまったく別のトピックです。最良のアプローチを推奨するには、より多くの情報が必要です。しかし... if( MethodA ) などの検証を行う必要があるため、他の引数の存在を確認する必要があるように思えます...ユーザーが使用する MethodType ごとにいくつかの SetParam メソッドを作成する方が簡単かもしれませんスクリプトで指定できます。

于 2009-10-05T21:07:14.240 に答える
1

リンクされたリストを使用してパラメーターを保存し、すべてのメソッドを構造体への関数ポインターとして配置することをお勧めします。

struct MyClass {
  struct LinkedList* params;
  void (*setParams)(...);
  void (*execute)()
}

リンクされたリストはキーと値のペアになります

struct LinkedList {
   struct LinkedList *next;
   char * key;
   char * value;
}
于 2009-08-11T12:54:33.163 に答える
0

SetParams をどのように実装したのかわかりません。サウンドから、解析と保存を少しだけ行い、エラー処理を下流の Execute 呼び出しに転送します。可変長の引数を使用しているため、va_* マクロを使用していますか? フォーマット文字列を使用してこれを行うと、エラー処理を SetParams 呼び出しに挿入し、Execute で値を反復処理してその処理を実行できるようになる場合があります。

一般に、設定パラメーターを処理する関数がある場合は、設定パラメーターに関連するエラーを管理する必要があります。コマンドの実行中に発生したエラーは、実行機能で対処する必要があります。

于 2009-08-11T13:14:46.953 に答える
0

Cでは、可変引数関数は指定した引数の数を認識しないため、この方法では実行できません。そのため、最初のパラメーターとしてパラメーターの数を指定するかprintf、パラメーターの数を使用する方法を指定するなど、関数にそれを知らせる必要があります。フォーマット文字列から見つけることができます。

于 2009-08-11T13:35:36.820 に答える