4

初心者として、グローバル変数の過剰な使用を避けるためにどこでも読んでいます。さて、どうやってそうするのですか?私の低いスキルは失敗します。私は大量の構造を渡すことになり、グローバルを使用するよりも読みにくいです。私のコードはめちゃくちゃです この問題/アプリケーション構造の設計をガイドする良い本/記事の推奨事項はありますか?

4

5 に答える 5

9

変数の動作によっては、グローバル スコープが最適なスコープになる場合があります。(フラグは、割り込みが到着したことを知らせるものであり、計算ループの途中で都合のよいときに処理する必要があると考えてください。)

小さなユーティリティ プログラムは、多くの場合、グローバル変数を使用することではるかにクリーンに感じることができます (私は特に小さな言語パーサーについて考えています)。しかし、これにより、将来、小さなユーティリティ プログラムをより大きなプログラムに統合することが非常に難しくなります。常にトレードオフがあります。

しかし、「正しい」データ構成がそれほど面倒に感じられない可能性は十分にあります。ここにコードを投稿すると、誰かがよりクリーンなレイアウトを提案できるかもしれませんが、実際の問題は、コードが簡単に理解できる小さなサンプルを超えたときに発生します.

私はお気に入りのプログラミング スタイルの本をたくさん持っていますが、この状況に対処するために私が知っている最良の方法は、Kernighan と Plauger によるThe Elements of Programming Styleだと思います。かなり古く、見つけるのは難しいですが、短く、甘く、どこかで使用されているものを見つける価値があります.

それほど短くもなく、甘くもありませんが、Code Complete, 2nd editionを見つける価値は十分にあります。それは、はるかに詳細で、より多くのコードを提供し、ソフトウェアの設計に関わるより多くの多様性を提供します。それは素晴らしいですが、もっと恐ろしいかもしれません。

マスターを勉強するのに勝るものはありません。Unix 環境での高度なプログラミング、第 2 版のコードは驚くべきものであり、1 時間勉強する価値があります。

もちろん、経験は常にありますが、それを習得するには時間がかかります。自分の過ちから教訓を学ぶことは、他人の過ちから教訓を学ぶことよりもずっと強く残る傾向があります。だからそれを続けてください。:)

于 2010-08-02T10:01:48.573 に答える
1

YourdonとConstantineによるStructuredDesignをお勧めします。コンピュータ標準による古い本(テープを含む例があります!)が、あなたが抱えている問題について非常に健全です。

于 2010-08-02T09:49:02.873 に答える
0

状況を改善するために使用できる2つのオプションを次に示します。

  1. 読み取り専用構造の場合、constポインターを使用してデータへのアクセスを制御できる関数があります。

    struct my_struct;

    const my_struct * GetMyStruct(void)const;

  2. 静的と宣言することにより、グローバル構造の公開を制限します。このようにすると、ファイルスコープのみが含まれます。

    static mystruct myStructInstance;

于 2010-08-02T09:49:42.403 に答える
0

あなたのプログラムがグローバル変数がそれほど悪く感じられない一種の「小さな」プロジェクトであるが、将来それをより大きなプロジェクトに統合する必要があると思われる場合、非常に簡単な解決策は単一のコンテキストポインタ引数を追加することです.各関数に移動し、そこにすべての「グローバル」変数を保存します。常に同じ名前を付けると、次のようなこともできます。

#define current_filename   context->current_filename
#define option_flags       context->option_flags

などで、コードはグローバルの場合と実質的に同じように見えますが、単一のプログラムで複数のインスタンスを使用したり、ライブラリに統合したりなど、最小限の手間で行うことができます。これらの定義は、パブリック インターフェイス ヘッダーではなく、ソース モジュールで使用されるプライベート ヘッダーに保持してください。

于 2010-08-02T10:21:25.210 に答える
0

@PeterKの問題は、構造自体がCの本で常に提示され、さまざまな関数に何度も宣言/渡すことができるコンテナとして提示されることです.コンテナ (これにより、コードが読みやすくなる可能性があります)。

1 つのモーターを制御する 3 相モーター制御アプリケーションを作成しています。あなたが書いたすべてのものに基づいて、問題を解決する私の現在の考えが正しいかどうかを確認してください:

  1. 関数exに従って、いくつかのグローバル情報を構造体にパックします。(sInverterState、sButtonsState、sInverterParameters など)
  2. メニュー UI を作成する場合、C ファイルで静的変数を使用でき、LCD が 1 つしかない場合は構造体を渡す必要はありません。GTK++ のように見せたくありません。
  3. 再入可能コードを書くことはまだ私には向いていません。この目的のためにはやり過ぎです。
  4. IT分野で適切な教育を受けます。

最終的に多くのグローバルになる可能性がありますが、少なくともそれらは適切にパックされ、読みやすくなっています。

于 2010-08-02T10:31:03.100 に答える