関数式プログラミングの重要性を深く理解します.
4195 ワード
最近は『コード大全2』を読み始めましたが、「多くの良いプログラミング方法は脳の灰質の負担を軽減できます」という一節を紹介しました.そこで、『*会社C言語プログラミング規範』を探して読んでみました.昼には多くの収穫があります.その中でいくつかの点に言及して、この記録を書いてください.
本文では関数に対して以下の部分の要求があります.再入力可能関数は、共有変数の使用を避けるべきであり、使用が必要であれば、相互反発手段(オフ、信号量)によって保護されるべきである. 関数は、グローバル変数、静的局所変数、およびIO動作の使用を避けるべきであり、避けられないところで集中的に使用すべきである. 関数のパラメータの個数は5つを超えません. ソースファイルの範囲内で宣言および定義されたすべての関数は、外部から見られない限り、staticキーを追加すべきである. 本文のヘッダファイルの部分に対する要求:ヘッダファイルにインターフェースを配置するのに適した声明は、不適切な配置で実現される. ヘッダファイルの循環依存を禁止します. ヘッダのファイルは自分で含めるべきです. 以上のような点を出して、これから書く時は注意してください.グローバル変数を関数にカプセル化しました. プロジェクトではしばしば構造タイプ(構造体)を使用して、大域変数を異なる関数で使用するために定義します.頭ファイルで自分の構造タイプを定義し、ファイルの先頭に大域変数を定義します. 多くの関数がこのグローバル変数のメンバーコンテンツを読み出したり変更したりする必要があると、ヘッダファイルに追加されます. は、したがって、他の.cファイル関数では、 採用できる仕様は このとき、test.c関数の各場所で、 は、一般的に、様々な構造型の変数が各関数間で使用されることがあります.これらの変数に対する関数パッケージを使用すると、これらの変数へのアクセスが明確になり、安全になります. 私たちのファイルは第三者に提供するかもしれませんので、必ずcファイルを倉庫に入れて、ユーザーにヘッダファイルを残します.この時、グローバル変数がたくさんあると、ユーザーがアクセスしやすくなります. モジュール間関数デカップリング: 以前に書かれたコードは、モジュール間で相互に多くの大域変数に使用されるため、知らず知らずのうちに結合性が大幅に増加し、常に1つの変数のポインタが最外層関数から4、5層の内部に入って使用される.実は多くの設計方式に問題があります.このように処理する必要はありません.サンプルコードを見れば分かります. は、形参として 実は は、正確な値で まずここに記録して、食事に行きます.
本文では関数に対して以下の部分の要求があります.
//protocol_data.h
typedef struct my_protocol
{
uint8_t frame_len;
uint8_t frame_data[20];
} MY_Protocol_t;
//protocol_data.c
MY_Protocol_Typedef Pro_Info;
&Pro_Info
、またはPro_Info.frame_len
をあちこち呼び出して、内容を修正する.これはプログラム設計上非常に良くない行為です.プロトコールにあります.data.csのほとんどは関連コンテンツのデータ処理関数であり、Pro_Info
はプライベートメンバ変数が情報を交換し続けていると考えられ、このとき、外部のtest.cの関数が呼び出されて修正されたと考えられています.data.cの他の関数の影響は、特にマルチスレッドシーンで大きな可能性がある.extern MY_Protocol_Typedef Pro_Info;
です.Pro_info_f()
の返却結果を受け取りに局所ポインタ変数を使用して、次のステップに進みます.// protocol_data.c
static MY_Protocol_Typedef Pro_Info;
MY_Protocol_Typedef *Pro_info_f(void)
{
return &Pro_Info;
}
// protocol_data.h
MY_Protocol_Typedef *Pro_info_f(void);
p_device
によって最外層関数Mate_Respond_process
によってもたらされ、PICK_Switch
に時又に一度入ったことが明らかになっている.PICK_Switch
は1つのメンバの値だけを読み取っていますが、Device_TypDef
のタイプ全体のポインタp_device
に完全に入ってきました.この構造タイプは他のモジュールヘッダファイルで定義され、PICK_Switch
も外部関数として宣言されている.したがって、Aモジュールのヘッダファイルに他のBモジュールのヘッダファイルを導入して、Device_TypDef
タイプによって定義された位置を識別する必要がある.Bモジュールが変更されるとAモジュールも再コンパイルされます.このような操作は大工事の中で多くなります.コンパイル時間の増加は非常に大きいです.PICK_Switch
にパラメータとして伝えられ、規格タイプのuint8_t which_node_val
をさわやかに定義することができ、Bモジュールのヘッダファイルを導入する必要がなくなりました.Mate_Respond_process
は、p_device
の後の2回の使用も、簡単にメンバーの値を読み取っています.上記のような方法で処理すれば、1つのパスが少なくなり、関数の使用の複雑さが減ります.多くの類似の関数はこのように結合を簡単にすることができ、いくつかの大規模なプロジェクトの維持には非常に友好的で必要である.