諏訪通信ネットワーク
スポンサードリンク
製品情報 ダウンロード サポート お知らせ
   


ソフトウェア

for Windows
Xp Vista 7 10

Keyboard IE
カーナビを...
ダイアグスキャナー
徒歩メーター
燃費ティーチャー

サンプリングメーター
みるCAN
CANメッセンジャー
CANレコーダー
CANレーベル



コーヒーブレイク

VB6の長所と短所
なぜVB6を使うのか
VB6のトラブル集1
VB6のトラブル集2
UWPのトラブル集1
C言語のコメント作法
C言語の常識ルール



蓼科電研

クルマ整備技術サイト
蓼科電研オートモーティブ















C言語の常識ルール
2021.7.23


C言語の入門書等では記載がありませんが、世の中の常識として通用しているルールがいくつかあるので紹介します。もちろん世の中のすべての分野やグループのルールを知った訳ではないので、特定の分野や集団では非常識な部分があるかもしれません。



1.{}の使い方 条件式
「 { 」は条件式の後ろに書きます。判定後の制御文は、条件式の後ろから有効になるためです。 「 } 」は条件式の先頭文字と同じ列に記載します。ネストで再び{}が使われる場合は、インデントで一段下げた同じ列に記載します。 「 } 」の最後には、必ず「 ; 」を付けます。 駄目な例は、難読化という意味では非常に有効的で、もはや何がしたいのか分かりません。

良い例

× 駄目な例 (良い例と同じ処理内容です。コンパイルは通ります)



2.条件式は、必ず比較演算子で判定する
条件式は、左辺と右辺を持つ比較演算子で判定しなければいけません。
「==」、「<=」、「>=」、「<」、「>」、「!=」のいずれかを使用しなければいけません。
条件の組み合わせは、論理演算子の「&&」、「||」を使用します。
コードレビュー等での可読性やテストのしやすさの観点で、このような制限があります。

良い例

× 駄目な例 (良い例とほぼ同じ処理結果となります。コンパイルは通ります)



3.1行1処理
処理は1行つず分けて記述します。
コードレビュー等での可読性やデバッグ等のしやすさの観点で、このような制限があります。Excel関数でsumif等を駆使してプログラミングを始めた人だと、駄目な例ように書きたがる人がまれにいるそうです。
例外として、条件式で論理演算子の「かつ、&&」や「または、||」等を持つ場合は、1行で収まる範囲であれば1行で書いてもかまいません。

良い例

× 駄目な例 (良い例と同じ処理結果となります。コンパイルは通ります)


例外で良い例



4.条件式内で代入演算子を使用してはいけない。
変数への代入は、条件式の前で行わなければいけません。
条件式で行うと、それがバグなのかどうか判断が付きにくくなるためです。

良い例

× 駄目な例 (良い例と同じ処理結果となります。コンパイルは通ります)



5.GOTO は使用禁止
GOTOを多用されると訳が分からなくなるため、一切禁止です。 「C言語 GOTO」でgoogle検索すると、ダメな理由が色々説明されています。 スパゲティコードと呼ばれるものです。
他の理由として、古いBASIC言語では IF (条件) GOTO(行)が基本であり、 当時に苦労した人たちがBASIC言語の象徴であるGOTOを嫌ったという側面もあります。

良い例 (GOTO文を使用しない)


× 駄目な例 (GOTO文を多用、上記と同じ処理内容です)




6.return文は、関数の最後に1回だけ
return文は、関数の末尾に1回だけ呼び出すようにします。 if文の中などにいくつもreturn文があると、スパゲティコードになってしまうためです。 グローバル変数を基本的に使用してはいけない理由と同じです。 関数の入口と出口は、1つでなければいけません。 入り口は関数の引数、出口はreturn文です。

良い例 


× 駄目な例 (上記と同じ処理内容です)
以下の例だと、戻り値とsend_err_msg()関数との関係が不明瞭のため、コードレビュー等における仕様との一致性の判断や問題発見が難しくなります。



7.1つの関数につき〇〇行までは、あくまでも目安
こんな意味不明のサブ関数がありました。
すぐ上の記述の1ヶ所からしか呼び出されません。




上司「A君、なぜこの処理をサブ関数で切り離したのかな?」
A君「1つの関数につき、100行までというコーディングルールがあります。」
上司「そうだね。」
A君「101行になってしまったため、3行をサブ関数で切り分けました。」
上司「・・・。(絶句)」

関数は、機能単位で分けて管理されるべきです。
ソフトウェア業務において各関数は、element ID、機能 ID などが通しで振られて、IDで図書館の本のように分類管理されます。 機能単位で分ける理由は、業務プロセスにおけるコーディングの元となる仕様書の仕様が、機能単位で書かれるためです。 C言語のstdlib.h、math.h 等の基本的な関数もすべて機能単位で呼び出せるようになっています。 サブ関数も、同じように機能として意味を持たせ、小さな機能単位で呼び出せるようにしなければいけません。 機能として最大行数に収まらない場合は、行数制限を無視して1つの関数内に記述します。 管理上の理由から、機能として関数を分けることの妥当性がない場合は、分けてはいけません。

行数制限に厳格に従って強引にサブ関数を作成すると、生産性に反する難読化にもなってしまいます。 色んな関数に処理が飛び飛びになってしまうと、コードレビュー等でウォーターホール的な流れとして全体を掴んでレビューしにくくなり、問題抽出率の低下を招きます。



スポンサードリンク

 Copyright (C)1999-2021 SUWA TSUSHIN NETWORK. All Rights Reserved.
ご利用条件