
株式会社ソフテック |
制御用ソフトウェアの受託開発を手がけて40年の経験と
受注案件4750件(2012年4月末時点)の実績
|
|
|
| HOME > ソフテックだより > 第19号(2006年6月7日発行) 技術レポート「C言語のコーディング規約による保守性の向上」 |
ソフテックだより 第19号(2006年6月7日発行)
技術レポート
「C言語のコーディング規約による保守性の向上」 |
1. はじめに
ソフトウェア開発の性質上、一度開発したシステムは、何度も機能アップが繰り返される傾向が強く、高い保守性が必要となります。とりわけ、複数人が関わるような大規模な開発では、各個人がバラバラにプログラミングしていたのでは、ソースコードの均質化が図れずに結果として保守性を保つことは容易ではありません。
高い保守性を保つためには
(1) 読みやすい
(2) わかりやすい
(3) 統一されている
ソースコードであることが非常に重要と考えます。読み難く、統一されていないコードでは、プログラムの解析ミスが起こりやすく、バグを発生させてしまう恐れがあり、非常に危険です。
そのため、安全性を高めるためにもプロジェクト毎にコーディング規約を規定し、統一されていることが必要となってきます。
今回は、ある組み込みソフトウェア開発で使用したコーディング規約の一例を紹介したいと思います。
2. コーディング規約とは?
システムの保守性を高めるためには、実装工程(開発工程)で保守性の高いコードを作成する必要があります。
保守性の高いコードとは?
(1) 可読性に優れており、読みやすい
(2) 変数などのネーミングが適切である
(3) ロジックがシンプルである
(4) 無駄なコードの重複が無い
(5) インターフェースが直感的である
こうした条件を満たすコードを作成するためには、なんらかの「品質基準」に従ってプログラミングする必要があります。このソースコードの品質基準が「コーディング規約」です。
3. ファイル・ファンクション ヘッダに関する規約
ファイルや関数に何も説明がないと、どのような目的で、どのような処理をしているのか、一目ではわかりません。
下記例のようなヘッダ(説明)を付けることで、ここでどのような処理をしているのかをイメージしやすく、可読性を高めることが期待できます。
(1) ファイルヘッダの例
//--------------------------------------------------------------------------------
// ファイル名 : APPMT.C
// 概要 : Application (Multi Task) startup
// 詳細 : アプリケーション (マルチタスク) スタートアップ
// main task を起動する
// 履歴 : 2006/06/07 UserName 新規作成
//--------------------------------------------------------------------------------
|
(2) 関数ヘッダの例
//----------------------------------------------------------------------------
// 関数名 :main
// 概要 :
// 戻り値 :なし
// 引数 :int argc
// 説明
// 引数 :char *argv[]
// 説明
// 引数 :char *envp[]
// 説明
// 作成 :2006/06/07 UserName
//----------------------------------------------------------------------------
void main(int argc, char *argv[], char *envp[])
|
4. ソースコメントに関する規約
(1) コメントスタイル
メンテナンスの必要に駆られて解析をおこなう場合、ソースコードを解析するのにキーワード検索は有効です。しかし、コメントのスタイルがバラバラだと、検索キーワードを複数回指定しなければならない場合があり、非常に面倒です。また、検索漏れが起こる場合も考えられ、保守性を下げる要因となりえます。
そのため、下記のように、スタイルを決めておくと良いと思います。
- 数字・英字は半角
- 漢字・ひらがな・カタカナは全角
- 全角スペースは使用しない
|
(2) 判断文にはコメントをつける
コードには判断文(if,for,while,case)が多く含まれています。
この判断文にコメントをつけるだけで処理内容が一目でわかるようになります。
ソースコードの可読性を向上させるのは、コードのスタイルを統一することだけではありません。コードの中に的確でかつ、わかりやすいコメントを記述することも可読性の向上に大きくつながります。
5. ソースコードに関する規約
(1) 変数名はハンガリアン記法を使用する
変数名のみでもある程度の情報を得やすくするために一般的なネーミング規約の一つであるハンガリアン記法と記憶子を組み合わせて変数名を命名します。
ハンガリアン記法とは、変数の名前に型などの情報を縮めて付加する方法のことです。
|
| プレフィックス2_プレフィックス1+変数名 |
| (変数名の最初の1文字は大文字) |
|
|
|
|
| 例) |
|
|
| static unsigned char s_byTestFlg; |
|
//スタティックなunsigned char |
| int nWork; |
|
//ローカルなint |
|
|
| プレフィックス1 |
データ型 |
| c |
char |
| by |
BYTE(unsigned char) |
| u |
UINT(unsigned int) |
| n |
int |
| b |
BOOL(int) |
| w |
WORD(unsigned short) |
| l |
long |
| dw |
DWORD(unsigned long) |
| s |
文字列 |
| sz |
ASCIIZ文字列 |
| p |
ポインタ |
| lp |
long(far)ポインタ |
| np |
nearポインタ |
|
|
| プレフィックス2 |
記憶子 |
| g |
extern |
| s |
static |
| c |
const |
| なし |
ローカル |
|
|
(2) タブは4文字
インデントがバラバラだと、読み難いコードになってしまいます。
読み難いコードはバグの元です。
そのため、インデントはハードタブで4文字と規定しています。
(3) ネストレベルは5階層まで
if文やfor文でネストが深くなると、処理が複雑で、解読が非常に困難になってしまいます。そのため、ネストレベルを5階層までと規定しています。
例)
if(a == 0) //ネストなし
{
if(b == 1) //ネスト1
{
if(c == 2) //ネスト2
{
if(d == 3) //ネスト3
{
if(e == 4) //ネスト4
{
a = 1; //ネスト5
}
}
}
}
}
とは言っても、処理が複雑になったり、判断条件が増えると、ネストレベルは深くなってしまいます。その対策として、次の方法が考えられます。
■
returnで返す
判定文の後に処理をする必要が無い場合には、returnで返すことにより、ネストが深くなることを防ぐことが出来ます。
例)
if(a != 0)
{
return;
}
■
関数化する
一定のまとまりのある処理を関数化して、その関数を呼ぶことでも、ネストが深くなることを防ぐことが出来ます。
(4) 定数は大文字を使う
定数に小文字を使うと、変数なのか、定数なのか、見ただけではわかりません。一目で定数とわかるように、定数の場合は小文字を禁止し、大文字を使うように規定しています。
例)
#define MAX_COUNTER 10 →OK
#define Max_Counter 10 →NG(小文字は使用禁止)
6. おわりに
いかがでしたか?
自分の開発したシステムであっても、長時間経過すると、どのような処理をしているのか、忘れてしまいがちです。「3日前に書いたコードは他人のコードと同じ」ということも言われています。このような場合、わかり易く、読みやすいコードは、確実に効率よく、正確に解析をすることが出来ます。
ほんの一例を紹介させていただきましたが、C言語でソフトの作成を始める方にも参考にしていただければ幸いです。
(T.M.)
関連ページへのリンク
・開発紹介のページへ
・組み込みソフト開発のページへ
・パソコン用ソフトウェア開発のページへ
関連するソフテックだより
・ソフテックだより(技術分野別)〜組み込みソフト開発〜のページへ
・ソフテックだより 第144号 (2011年8月17日発行) 現場の声編「ソフトウェア開発の作業効率向上」
・ソフテックだより 第139号 (2011年6月1日発行) 技術レポート「効果的なソースコードのコメントについて」
・ソフテックだより 第47号 (2007年8月1日発行) 技術レポート「MISRA-Cルールに基づいたプログラミング」
・ソフテックだより バックナンバーへ