私は現在(主にC言語でも他の言語でも)コードを学習していますが、現在いくつかのプロジェクトでは同じ種類の「問題」に直面しています。 :C言語の任意のデータセットを扱う方法
多くの場合、データの任意のセットを扱わなければなりません。例えば、私は標準的な形式でかなりの数のコマンドを取るようなプログラムを書く必要があるかもしれませんが(例のために11としましょう)、柔軟なコードを作っています。このプロジェクトの後半に戻って、他のコマンドを追加したいのであれば、私はそう簡単にやりたいと思っています。
私のコードのどこかでこれらのコマンドの名前を手動で入力する必要があります。私が現在気に入っている方法は、構造体の配列を使用することです。各要素には、コマンド名のchar *とコマンドの機能を担当する関数ポインタが含まれています。
まだ、私は完全に私を満足させる方法でこの配列を実装していません。
私はそれから得た最も近いものがシングルトンを介したものでしたが、配列が必要なときには私はシングルトンを呼び出しましたが、それ以来、シングルトンは本質的にグローバル変数と同じ問題を抱えていることを学びました。私は依存性注入について少し学んだことがありますが、これはオブジェクト指向言語にのみ適用されるような原則です。
シングルトンを私がCでやりたいことに使用しない方法はありますか?
TL; DR: コード内に任意のデータセットを構築する必要がありますが、これをどのようにエレガントで簡単に保守可能な方法で実装できますか?
お返事いただける方に感謝します。
例:
私は、標準入力でコマンドをして、これらのコマンドを実行するために聞くのプログラムを持っています。 入力を読み込むたびに、文字列形式のコマンドの所定のリストと比較し、コマンドが一致する場合は適切なコードを実行します。
どのように文字列のセットを作成しますか?各文字列に対応する一連の関数をどのように作成しますか?どのように2つのセットを結びつけますか?あなたはどのようにこの組み合わせセットをどこにでも簡単にアクセスできるようにしますか?
これまでのところ、これに対する私の答えはされています:私は追加したい場合は
struct s_cmds {
char *cmd;
void (*func_cmd)(...);
};
この方法では、関係なく、私は私のコードを作成する方法の進化:構造と
s_cmds *singleton(void)
{
static s_cmds ret[] = {{"cmd1", &func_cmd1}, {"cmd2", &func_cmd2}, ...};
return (ret);
}
コマンドを使用すると、シングルトンに要素を追加するだけで済みます。コード内でこの配列にアクセスしたい場合は、シングルトンを呼び出すだけです。しかし、これは本質的にグローバル変数を使用するようなものですか?
「クリーナー」の方法はありますか?
これを具体的な例で書き直せますか?それは現在書かれているように一般的な方法です。 –
@Let_Me_Be私が現在取り組んでいる例を追加しました。私はそれが十分明確であることを望む。 – Arjofocolovi