クローズ。この質問は
オフトピックです。現在、回答を受け付けていません。
コメント
回答
続行する場合より多くのコードを書くと、コードを整理するのが難しい場合があります。
これはあなたの問題です。整理を正しく行う、
コードを整理するのを待つのではなく、コードを整理してください。言語はそれを行いませんが、コードは、結合性が低く、凝集性が高いモジュールに編成する必要があります。
これらのモジュールは、当然、名前を付けます。衝突を避けるために、モジュール名を省略し(長い場合)、関数名の前にモジュールを付けます。
個々の識別子のレベルでは、これらはおおよそ主観の昇順です。
- 規則を選んでそれを守る
- たとえば、
function_like_this(struct TypeLikeThis variable)
が一般的です
-
ハンガリアン記法は絶対に避けてください(申し訳ありませんがJNL)
-
本当に不透明なCookieタイプでない限り、ポインタのtypedefは避けてください。混乱させる
struct Type *ok; typedef struct Type *TypePtr; TypePtr yuck;
不透明なCookieタイプとはどういう意味ですか?モジュール(またはライブラリ、またはクライアントコードに渡す必要がありますが、そのクライアントコードは直接使用できません。ライブラリに返すだけです。
たとえば、データベースライブラリは、次のようなインターフェイスを公開する場合があります
/* Lots of buffering, IPC and metadata magic held in here. No, you don"t get to look inside. */ struct DBContextT; /* In fact, you only ever get a pointer, so let"s give it a nice name */ typedef struct DBContexT *DBContext; DBContext db_allocate_context(/*maybe some optional flags?*/); void db_release_context(DBContext); int db_connect(DBContext, const char *connect); int db_disconnect(DBContext); int db_execute(DBContext, const char *sql);
これで、コンテキストはクライアントコードに対して不透明です。内部を見ることができないためです。ライブラリに戻すだけです。FILE
のようなものも不透明であり、整数ファイル記述子も cookie ですが、不透明ではありません。
設計に関する注意
上記の低結合と高凝集というフレーズを説明なしで使用しましたが、少し気分が悪いです。あなたはそれを検索することができ、おそらくいくつかの良い結果を見つけることができますが、私はそれを簡単に取り上げようとします(繰り返しますが、私はエッセイを書くことができますが、そうしないようにします)。
上にスケッチしたDBライブラリは低結合は、小さなインターフェースを外の世界に公開するためです。実装の詳細を非表示にすることで(部分的に不透明なCookieのトリックを使用)、クライアントコードがそれらの詳細に依存するのを防ぎます。
不透明なCookieの代わりに、コンテキスト構造を宣言してその内容が表示されるようにします。これには、データベースへのTCP接続用のソケットファイル記述子が含まれます。その後、共有メモリセグメントの使用をサポートするように実装を変更すると、 DBが同じマシンで実行されている場合、クライアントは単に再リンクするのではなく、再コンパイルする必要があります。さらに悪いことに、クライアントはファイル記述子の使用を開始した可能性があります。たとえば、setsockopt
を使用してデフォルトのバッファサイズを変更しますが、コードも変更する必要があります。これらすべての詳細実用的な場合は、モジュール内にilを非表示にする必要があります。これにより、モジュール間の結合度が低くなります。
この例では、高い凝集度も示されています。モジュール内のメソッドは、同じタスク(DBアクセス)に関係しています。つまり、実装の詳細(つまり、Cookieの内容)について知る必要がある コードのみが実際にそれらにアクセスできるため、デバッグが簡単になります。
懸念事項が1つしかないため、これらの関数をグループ化するためのプレフィックスを簡単に選択できることもわかります。
この例が優れていると言うのは簡単です(特にそうではないため)。 「完全ではありません)が、すぐには役に立ちません。秘訣は、コードを記述および拡張するときに、同様のことを実行する関数または同じタイプで動作する関数(独自のモジュールの候補となる可能性がある)、および多くの別個のことを実行する関数を監視することです。」本当に関連していて、分割の候補になる可能性があります。
コメント
回答
私の意見では90 a)は、変数名と関数名を次のようにわかりやすくすることで、命名問題の%を解決します。可能な場合、 b)はコード全体で一貫性があります(つまり、関数の名前がaddNumbersの場合、2番目の関数の名前はmultiplyNumbersにする必要がありますnumbersMulではなく)および c)は、入力する必要があるため、可能であれば名前を短くするようにしてください。
このトピックの他の側面を確認したい場合は、命名規則のWikipediaページに必要な事項のリストがあります。覚えておいてください。また、CおよびC ++に関するセクションもあります。
CおよびC ++では、キーワードと標準ライブラリ識別子はほとんど小文字です。 C標準ライブラリでは、省略名が最も一般的です(たとえば、文字が英数字かどうかをテストする関数のisalnum)が、C ++標準ライブラリでは、単語の区切り文字としてアンダースコアを使用することがよくあります(たとえば、out_of_range)。マクロを表す識別子は、慣例により、大文字とアンダースコアのみを使用して記述されます(これは、定数にすべて大文字の識別子を使用する多くのプログラミング言語の規則に関連しています)。二重下線を含む名前、または下線と大文字で始まる名前は、実装用に予約されており(コンパイラ、標準ライブラリ)、使用しないでください(例:reserved__または_Reserved)。[5] [6]これは表面的には革砥に似ていますが、セマンティクスが異なります。下線は(革砥のように)文字を引用するのではなく、識別子の値の一部です。__fooの値は__foo(予約済み)であり、fooではありません(ただし別の名前空間で)。
コメント
回答
Cの唯一の厳しい制約は、名前空間がないことです。したがって、ファイルシステムライブラリのrename()
関数をrename()
と区別する方法を見つける必要があります。 メディアライブラリの機能。通常の解決策は、filesystem_rename()
やmedia_rename()
などのプレフィックスです。
その他の一般的なアドバイスは次のとおりです。プロジェクトまたはチーム内で一貫性があります。読みやすさが向上します。
コメント
回答
グローバルに探している場合承認された形式
MISRA / JSF / AUTOSARは、C / C ++コードの命名と編成に関するあらゆる業界標準のほぼ100%をカバーしています。問題は、彼らが無料で手に入れることができないということです。つまり、各ガイドブックにはいくらかのお金がかかります。 MISRA 2008 C / C ++コーディング標準の本はおそらく約50米ドルかかることを私は知っています。
これらは、ジャーナルを作成する際の参考文献と追加の読書のためのハーバード参照と考えることができます。私はMISRAを使用しましたが、関数と変数に名前を付け、適切に使用できるように整理するのに適した方法です。
一時的なものを探している場合
PythonとJavaに提供した参照は大丈夫だと思います。私は、javadocスタイルのコメント、名前付け、およびコードの編成を採用している人々を見てきました。実際のところ、前回のプロジェクトでは、Javaのような関数/変数名でC ++コードを作成する必要がありました。この背後にある2つの理由:
1)従うのが明らかに簡単でした。
2)製品コードの要件がセーフティクリティカルなソフトウェアシステム標準の根拠に触れていませんでした。
3)レガシーコードは(どういうわけか)その形式でした。
4)DoxygenはJavadocスタイルのコメントを許可しました。当時、私たちはdoxygenを使用して、制作担当者向けのドキュメントを生成していました。
多くのプログラマーはこれに反対しますが、個人的には、Cでjavadocスタイルの関数/変数の命名を採用しても問題はありません。 / C ++。もちろん、フロー制御、スレッドセーフなどを整理する方法は、関係なく対処する必要があります。しかし、私はここでは申請者ではありません。また、プロダクションコード形式の要件がどれほど厳しいかわかりません。トピック外の領域に転用することなく、要件を確認し、特定の命名規則にどの程度依存しているかを調べて、前述の解決策を採用することをお勧めします。私と他の人の回答
これが役に立てば幸いです!?
コメント
回答
命名時に考慮すべき重要なことはほとんどありません。
-
actionObjectまたはObjectActionタイプを確認します(オブジェクトはC用ではありませんが、一般的に他のオブジェクト指向言語に移動する場合)これは役立つはずです
-
休息は一貫性があり、短く、確実に説明的です。
- また、定義されたすべての変数と関数の唯一の目的。例:値を一時的に格納する場合は、intのnTempValという名前を付けます。
- 変数は名詞、メソッドは動詞である必要があります。
コメント
回答
ほとんどの回答は良いですが、命名についていくつか言いたいことがあります。 C ++やJavaなどの他の言語で名前空間を使用する場合と同様に、ライブラリとインクルードファイルの規則:
ライブラリを構築する場合は、エクスポートされたシンボルの共通プレフィックス、つまりグローバル関数、typedef、変数を見つけます。これにより、他のライブラリとの衝突が防止され、関数が自分のものであることが識別されます。これは、アプリのハンガリアン記法のほんの一部です。
さらに進んで、エクスポートされたシンボルをグループ化します。libcurlは、グローバルシンボルにcurl_ *を使用し、さまざまなインターフェイスにcurl_easy _ *、curl_multi_ *、curl_share_ *を使用します。そのため、すべての関数にcurl_ *を使用することに加えて、さまざまなインターフェイスに別のレベルの「名前空間」を追加しました。curl_multi_*ハンドルでcurl_easy_ *関数を呼び出すと、正しくないように見えます。 http://curl.haxx.se/libcurl/c/
エクスポートされたシンボルのルールを維持し、 edファイル:これらの関数に共通のプレフィックスを見つけてください。 「my_string」というファイルに静的文字列ユーティリティ関数があるのではないでしょうか。 これらすべての関数の前にmy_string_ *を付けます。
コメント