コーディング基準
Symbian Signed は、Symbian がライセンス取得企業、 ネットワーク事業者、開発者との提携により共同考 案したプログラムで、Symbian スマートフォン対応 アプリケーションのテストおよび署名の基準向上に 寄与しています。 Symbian Signed の認証取得手順は、開発者からの フィードバックに基づいて迅速化、簡易化、低コス ト化され、Symbian アプリケーション市場の拡大に 貢献しています。 • Open Signed – Developer Certificate(開発者証明書) に基づくオフラインの無料署名プロセス。申請済 みの IMEI(携帯の固体識別番号)で管理される最 大 1000 台の端末にアプリケーションをインストー ルし、テストを実行することができます。 • Express Signed – Publisher ID 取得企業に対して開放 されたプロセスで、重要端末機能にアクセスしな いアプリケーションに即座に署名し、市場投入プ ロセスの短期化を実現することができます。$20 米ドルからの低コストでアプリケーションに署名 することができます。 • Certified Signed – システムの重要機能にアクセスす るアプリケーションや単独テストを必要とするア プリケーション向けの署名プロセス。 詳細は、www.symbiansigned.com を参照してください。
コーディング基準
より発行
コーディング基準 Essential Symbian OS シリーズより 第1版 02/08 発行元: Symbian Software Limited 2-6 Boundary Row Southwark London SE1 8HP UK(英国) www.symbian.com 商標、著作権、免責条項 Symbian、Symbian OS および関連する Symbian 商標は、すべて Symbian Software Ltd の商標です。Symbian は、本書に記載されたサードパーティ の商標権を承認しています。© Copyright Symbian Software Ltd 2008 All rights reserved. 本書のいかなる部分も Symbian Software Ltd の書面に よる明示的な許可なしに複写することは禁じられています。Symbian Software Ltd は、本書に記載された情報の適切性・正確性を保証するもの ではありません。本書の記載情報は一般情報としてのみ提供されたもの であり、その他の目的で使用および依存されるべきものではありません。
編集: Jo Stichbury 編集責任者: Ashlee Godwin
校閲者: Thomas Sutcliffe Mark Shackman Hamish Willee 日本語版校閲者: 小西一弘
謝辞 高度な技術力と実績を有し、貴重な助言や最良の事例をご提供 くださった技術者の皆様に感謝いたします。本書に記載した多 くの情報は、ご協力いただいた技術者の方々の総合的な知識を まとめたものです。
目次 本書の利用について ........................................................1 基本事項 ..........................................................................3 プレフィックス ............................................................3 サフィックス ................................................................5 アンダースコア ............................................................6 大文字の使用 ................................................................6 ヘッダファイルに関するガイドライン..........................7 クラスおよび関数の設計 ................................................8 関数のエクスポート ......................................................10 コードスタイル ............................................................11 コンストラクション ......................................................14 デストラクション ..........................................................14 例外処理とメモリ管理 ..................................................16 防衛的プログラミング ..................................................17 補足ルール ....................................................................18 参考文献 ........................................................................19 参考資料 ........................................................................20 開発者向けリソース ......................................................21
1
本書の利用について 多くの開発者は、厳密な基準に基づいてプログラミング を行わないまでも、自らのこれまでの経験や C++ に対す る理解に基づいて一定の規則に則ったコーディングを実 践しています。複数の技術者が共同作業を行う場合には、 様々な情報源から得られた知識や最良の事例を共有して プロジェクトが進められます。本書は「コーディング基 準」と題し、チームでプログラム開発を推進する際のプ ログラミング基準の設定に役立つ情報を提供すると共 に、Symbian C++ のコーディング品質を評価する際のガ イドラインとしてもご利用いただけます。 本書に記載されたコーディング基準を採用することに よって、品質が高く、一貫した Symbian C++ の基本を習 得することができます。また、複数の技術者がコード の見直しを行う際の評価基準としてもお役立ていただけ ます。 本書のガイドラインは、Symbian 技術者や Symbian に コードを提供する社外技術者によって使用されている C++ コーディング基準をとりまとめたものです。これら は、多くの Symbian ソフトウェア技術者の長年にわた る経験と実績に基づいており、Symbian OS における C++ の深い知識や幅広い理解の集大成として編集されま した。 Symbian 外部での開発に適切でないと考えられる一部の 基準は本書から除かれており、一般的な開発環境に適し た基準のみを記載しました。本書で採用した基準は、 Symbian およびライセンス企業におけるプログラム開
2 発、大規模プロジェクトにおける Symbian スマート フォン搭載 C++ アプリケーションの開発、アフターマー ケットアプリケーション、商用ソフトウェア、シェア ウェアの開発など幅広い開発環境に適用可能です。 各基準をよく吟味した上で、適切なものを採用するよう にしてください。一部のガイドラインの採用が適切でな い例外的なケースも考えられます。基準の採用が不適切 であると思われる場合は、その理由を慎重に評価検討す るようにしてください。最終的に採用が不適切であると 判断した場合には、コードにその旨をコメントとして記 述するようにしてください。 特別なレイアウトの要求、コメント、あるいは命名規則 など、追加の基準設定が必要な場合も考えられます。 コードのレイアウトはそれぞれの開発環境で独自に定義 されるべきものであるとの判断から、本書には、 Symbian OS C++ の基本的な命名規則以外のスタイルに 関するガイドラインは記載していません。本書後部には、 個々の環境において独自に定義するガイドラインや設定 を記入する欄が設けられています。 本書を、コードの見直しを行う際のチェックリストとし てもご活用ください。なお、紙面の都合上、各ガイドラ インの詳細は省いてあります。各ガイドラインの詳細は、 Symbian 開発者ネットワークの wiki (developer.symbian.com/coding_standards_wikipage.)を参 照してください。
3
基本事項 1.
警告メッセージがなくなるまでコンパイルを続ける ようにしてください。コンパイラの警告レベルを最 高に設定し、全ての警告メッセージがなくなるまで コンパイルを行ってください。警告が発生した場合 にはその理由を理解し、問題なくコードが実行され る場合でも、警告がなくなるようにコードを変更し てください。
2.
Symbian OS の命名規則に従うようにしてください。 全チームメンバーが同一の命名規則に従うことで、 すぐに理解できるようになり、共有や保守が容易に なります。これは、Symbian OS のユーティリティ や SDK など、全く異なる開発チームが作成した コードにも適応します。Symbian およびライセンス 企業は、開発キットのユーザが API やサンプルコー ドの使い方を容易に理解できるように、クラス、変 数、関数名に特定の命名規則を使用しています。
プレフィックス メンバー変数には、インスタンス (instance) を表す小文 字の「i」がプレフィックスとして使用されます。例:
4 TInt iCount; CBackground* iBitmap;
パラメータには、引数 (argument) を表す小文字の「a 」 がプレフィックスとして使用されます。母音で始まる引 数に「an」のプレフィックスは使用しませんので注意し てください。例: void ExampleFunction(TBool aExampleBool, const TDesC& aName);
(注意: Tbool anExampleBool ではなく TBool aExampleBool が指定されていることに注意して ください。 ) ローカル変数には、プレフィックスを使用しません。例: TInt localVariable; CMyClass* ptr = NULL;
クラス名には、「C」、「R」、「T」、「M」など、それぞれの Symbian OS タイプに対応する文字をプレフィックスに使 用します。ただし、クラスが静的メンバー関数のみで構 成される場合は例外とします。 (各 Symbian OS タイプの 特徴に関しては、Symbian Press シリーズまたは Symbian 開発者ライブラリの書籍を参照してください。 )例: class class class class
CActive; TParse; RFs; MCallback;
5 定数 (constant) には、「K」をプレフィックスとして使用 します。例: const TInt KMaxFilenameLength = 256; #define KMaxFilenameLength 256
列挙 (enumeration) はシンプルタイプであり、「T」をプ レフィックスとして使用します。列挙メンバーには、 「E」をプレフィックスとして使用します。例: enum TWeekday {EMonday, ETuesday, ...};
メンバー変数に値を設定するメンバー関数名には、 SetXxx() を使用します。メンバー変数の値を参照パラ メータとして取り出すメンバー関数名には、GetXxx() を使用します。メンバー変数の値を戻す関数名には、 Xxx()を使用します。例: void SetSpeed(TInt aSpeed); void GetSpeed(TInt& aSpeed) const; TInt Speed() const;
サフィックス 関数名の最後の「L」は、関数でリーブが発生する可能 性があることを示します。例: void AllocL();
6 逆 に 、「 L 」 で 終 了 し な い 関 数 名 を 使 用 す る 場 合 は 、 関数内でリーブが発生しないことを保証します。 関数名の最後の「 C 」は、クリーンアップスタックに プッシュしたポインタを関数が戻すことを意味します。 例: static CCylon* NewLC();
関数名の最後の「D」は、関数で参照されたオブジェク トが削除されることを意味します。例: TInt ExecuteLD(TInt aResourceId);
アンダースコア マ ク ロ ( __ A S S E R T _ D E B U G ) や リ ソ ー ス フ ァ イ ル (MENU_ITEM)以外では、アンダースコアを使用しません。 大文字の使用 クラス名の最初の文字には大文字を使用します。例: class TColor;
7 変数、クラス、関数名を構成する単語は、各単語の最初 を大文字にして結合します。クラスおよび関数の最初の 文字は大文字で指定しますが、関数パラメータ、ローカ ル/グローバル/メンバー変数の最初の文字は小文字で指 定します。 可能な限り、各単語の最初の文字以外は頭文字も含め小 文字で定義します。例: void CalculateScore(TInt aCorrectAnswers, TInt aQuestionsAnswered); class CActiveScheduler; TInt localVariable; CShape* iShape; class CBbc;// 通常頭文字には // 大文字を使用しません。
マクロは大文字のみで定義し、各単語をアンダースコア で区切ります。
ヘッダーファイルに関する ガイドライン 3.
ヘッダーファイルは「自己完結型」として単独コンパ イル可能とし、ファイル内で参照されるヘッダーを包 括するようにします。ヘッダーを含むコードは、コン パイル時に他を指定する必要がないようにします。
8 4.
ヘッダーファイルには、必要ないヘッダーを含めな いようにします。インクルード数を減らすため、で きるかぎり前方参照を使用するようにします。
5.
同じヘッダーを重複して取り込まないようにインク ルードガードを使用するようにしてください。例:
#ifndef GAME_ENGINE_H__ #define GAME_ENGINE_H__ ...
// ヘッダーファイルのコードをここに指定します。
#endif // GAME_ENGINE_H__
クラスおよび関数の設計 6.
M クラスはインタフェースの定義に使用され、通常、 純粋仮想機能のみ提供します。実装には使用されま せん。
7.
多重継承は、M クラスが定義するインタフェースを 介してのみ使用されます。CBase 派生クラスや1つ または複数の M クラスから継承するようにしてく ださい。(クリーンアップスタックによるデストラ クトが正しく行われるように、継承リストの最初に CBase 派生クラスが現れるようにしてください。 )
8.
特別な場合を除いてプライベート継承は行わず、で きるかぎり合成 (composition) を使用するようにし てください。
9 9.
列挙は関連するクラスあるいはネームスペース内で 参照し、グローバルネームスペースの混乱を避ける ために必要な場合を除いてグローバル宣言を行わな いようにしてください。
10. クラス設計の際には、デフォルトパラメータよりは むしろオーバーロード関数を使用するようにしてく ださい。 11. 仮想インライン デストラクタを除き、仮想関数は インライン展開しないようにしてください。 12. インライン展開する関数は、はっきりと inline キーワードで指定するようにしてください。 13. 関数内で所有権が受け渡される場合やパラメータが NULL であることが妥当な場合を除いて、一般的に ポインタよりはむしろ参照パラメータを使用しま す。所有権の受け渡しやパラメータが NULL となる 場合はポインタを使用しなければなりません。 14. 関数内でデータが変更されない場合、パラメータや 戻り値は必ず const 指定子で宣言するようにしてく ださい。 15. 関数内では、8 バイト未満の基本データタイプや Symbian OS の T クラスオブジェクトには必ず値を 渡すようにしてください。参照渡しは、8 バイト以 上のオブジェクトに使用するようにしてください。
10
関数のエクスポート 16. 関数のヘッダファイルの宣言部分に IMPORT_C のタ グを使用する場合は、実装部分に EXPORT_C のタグ を記述しなければなりません。 17. 可能な限りデータはエクスポートせず、データ変更 関数 ( (Set() )やデータを参照渡しで戻す関数をエ クスポートすることにより、データを変更するよう にしてください。 18. プライベート関数は、以下の場合にのみエクスポー トするようにしてください。 (i)
パブリック インライン メンバーがプライベー ト関数にアクセスする場合。
(ii) プライベート関数が仮想であり、エクスポー トするモジュール以外のコードでクラスが派 生する場合。 19. 以下の場合には、パブリックあるいは保護関数をエ クスポートしないでください。 (i)
関数がライブラリの外での使用を想定して設 計されていない場合。
(ii) 関数が純粋仮想関数である場合。 20. 関数の種類(パブリック、保護、プライベート)に かかわらず、インライン関数は決してエクスポート しないでください。
11
コードスタイル 21. 効率を考慮して、コンストラクタ内でメンバー変数 を初期化する場合には、代入文ではなくメンバー初 期化リストを使用するようにしてください。 22. C クラスのメンバーデータは、わざわざゼロに初期 化する必要はありません。 23. ブーリアンを評価をする場合、明示的な比較を避け、 if(iComplete==ETrue) ではなく if(iComplete) を使用するようにしてください。 24. ポインタの値が NULL であることを評価する場合は、 明示的な比較は必要ありません。明示的な比較の記 述により論理的意図が明確になる場合を除き、 if(ptr!=NULL)ではなく if(ptr)を使用するように してください。 25. 整数型の評価を行う場合は、明示的な比較をするよ うにしてください 。すなわち、 if(aLength) では なく if(aLength!=0) を使用するようにしてくだ さい。 26. スコープの拡張を避けるために、自動変数は必要に なるまで宣言しないでください。また、変数を使用 するコードの直前で宣言するようにしてください。 27. できる限りスタックの使用を最小限にとどめ、例え ば、大きなデータ構造の保存はスタックではなく ヒープ上に行い、ループや再帰関数内でスタック上 に大きな変数を定義する場合は、注意をします。
12 TfileName および TParse のオブジェクトは 512 バ
イト以上であるため、スタック領域を多く消費しま す。(デフォルトのスタックサイズは 8 キロバイト であることを覚えておいてください。 ) 28.「マジック」ナンバーを直接ソースに記述すること は避け、定数や列挙として定義するようにしてくだ さい。 29. 言語固有の基本タイプの代わりに、e32def.h で定 義される具体的なタイプを使用するようにしてくだ さい。例えば、int ではなく TInt を使用してくだ さい。 30. ネイティブ文字列、メモリバッファ、あるいは代わ りに手作りした文字列クラスなどではなく、 Symbian OS のデスクリプタクラスを使用するよう にしてください。 31. 文字列デスクリプタを作成する _L マクロは、テス トコードで必要な場合を除いて使用を避け、 _LIT マクロを使用するようにしてください。 32. デスクリプタを関数パラメータとして使用する場合 は、基本クラス(TDes および TDesC )を参照渡し で使用するようにしてください。
13 33. 手作りしたデータ構造ではなく、Symbian OS の日 付クラス(TDateTime および TTime)を使用するよ うにしてください。 34. switch 文の case で中止(フォールスルー)を使用 する場合は、論理意図を明確にするためにコメント を記述するようにしてください。また、switch 文 には、デフォルトでなにもすることがなくても、必 ず default を記述してください。 35. C スタイルのキャストではなく、C++ スタイルの キャスト(例: static_cast(expression)) を使用するようにしてください。C++ のキャスト演 算子のための Symbian OS マクロ (例: STATIC_CAST(type, expression))は、廃止 されたので使用しないでください。 36. ループ内のコードは、考えられる全ての入力に対し て(ループを)終了するようにしてください。 37. C++ のテンプレートの良さを利用し、なおかつコー ドを小型化するため、テンプレートコードには薄い テンプレートを使用するようにしてください。 38. DLL 内の書き込み可能なグローバルデータは、でき る限り使用しないようにしてください。
14
コンストラクション 39. C++ コンストラクタのコードは、リーブが発生しな いようにしてください。 40. 些細でない失敗をする可能性のあるコンストラク ションおよび初期化コードは、2 フェーズコンスト ラクタの第 2 フェーズ(通常、ConstructL())に 実装するようにしてください。 41. 2 フェーズ コンストラクションを使用する場合に は、オブジェクトのコンストラクションに1つまた は複数のパブリックスタティックファクトリ関数 (通常 NewL()および NewLC())を使用するようにし てください。コンストラクションの方法自体は、 private または protected にしてください。
デストラクション 42. デストラクタ内のポインタを逆参照する場合、継承 構造内の他のデストラクタによって、ポインタが初 期化されていないこと、既にポインタが破壊されて いないことを最初に確認するようにしてください。 43. デストラクト中にポインタが他(例:スーパークラ スのデストラクタ)から逆参照されるケースが考え られる以外、ポインタをデストラクタの中で NULL に設定することは非効率であり、不必要です。
15 44. デストラクタの外で削除され、後からアクセスされ る可能性のあるポインタ(例:メンバー変数ポイ ンタ)は、NULL に設定するか、直ちに再割り当て をしてください。 45. クラスが所有するリソースハンドルやヒープ上のメ ンバーデータは、デストラクタ内でクリーンアップ してください。 46. デストラクタ内ではリーブや C++ の例外が発生しな いようにしてください。 47. ヒープ上のクラスのデストラクタで TRAP を使用す ることは可能ですが、スタック巻き戻し時に呼び出 される可能性のあるデストラクタでの TRAP の使用 は危険です。 48. オ ブ ジ ェ ク ト の 消 去 時 に オ ブ ジ ェ ク ト が ク リ ー ンアップスタックに配置されないようにしてくだ さい。 49. new の呼び出しでオブジェクトを割り当てた場合 は、delete の呼び出しによって領域を 開放してください。同様に、 new [] によって割り 当てた C++ の配列は、delete [] を使用 して領域を開放してください。また、 User::Alloc()によって割り当てた領域は、 User::Free()を使用して開放してください。
16
例外処理とメモリ管理 50. ヒープ上にメモリを割り当てる場合、割り当ての成 否を確認するために、リーブを発生するオーバー ロード演算子 new ( new (Eleave) ) を使用するか、 メモリを確保する関数からの戻りポインタが NULL でないことをチェックしてください。 51. リーブ発生の際にメモリやリソースの孤立を避ける ため、クリーンアップ スタックを使用するように してください。 52. クリーンアップ スタックに割り当てられたオブ ジェクトが、同時に他のオブジェクトに所有されな いようにしてください。すなわち、クラスのメン バーデータがクラス デストラクタの中で破壊され る(これは通常のケースであるが)場合、当該デー タは、クリーンアップ スタック上に絶対に配置さ れないようにしてください。 53. 「C」で終わる関数名(例: NewLC())は、自動的 にオブジェクトへのポインタをクリーンアップ ス タック上に確保します。したがって、これらのオブ ジェクトをクリーンアップ スタックにプッシュし ないでください、オブジェクトが 2 度作成されてし まいます。 54. C++ の例外を発生するコードを呼び出す場合は、 すべての例外に対処してリーブに変換してくだ さい。 T R A P や T R A P D は、Sy m b i a n リーブ以外 (例: XleaveExceptio のタイプ)で発生した C++ の例外を受け取るとパニックを起こします。
17
防衛的プログラミング 55. PushL()と Pop()の数が対応していることを確認す るために、できる限り CleanupStack::Pop()およ び CleanupStack::PopAndDestroy()を使用するよ うにしてください。 56. プ ロ グ ラ ム エ ラ ー を 検 出 す る た め に 、 __ASSERT_DEBUG 断定マクロを頻繁に使用するよう にしてください。また、__ASSERT_ALWAYS を使用 して実行時の不正な入力を検出するようにしてくだ さい。 57. 断定ステートメントが、 「副作用」 (例: 変数値の変 更)を起こさないようにしてください。 58. 保守を容易にするため、断定ステートメントはコメ ントで前提条件を記述し、その論理的意図を明確に するようにしてください。
18
補足ルール 59.
60.
61.
62.
63.
64.
65.
19
参考文献 Symbian OS における C++ 開発の詳細は、Symbian Press が出版する開発者向け書籍を参照してください。参考 文献に関する詳細は、developer.symbian.com/books を ご覧ください。 また、Pearson Education, Inc. から出版されている C++ Coding Standards: 101 Rules, Guidelines and Best Practices(Herb Sutter、Andrei Alexandrescu 著− 2005) も合わせてご覧ください。
20
参考資料 Symbian 開発者ネットワーク ニュースレター developer.symbian.com/register
Symbian OS FAQ データベース developer.symbian.com/faqs
Symbian Press developer.symbian.com/books
21
開発者リソース Symbian 開発者ネットワーク developer.symbian.com
Symbian 開発者ネットワーク ニュースレター developer.symbian.com/register
Forum Nokia forum.nokia.com
UIQ 開発者コミュニティ developer.uiq.com
より新刊 Games on Symbian OS: A Handbook for Mobile Development Symbian Press 出版の技術シリーズ 書籍。Symbian OS v9.x 搭載スマー トフォンのゲーム開発に焦点を当 て、携帯ゲームの市場に関する情 報を詳述します。
Developing Software for Symbian OS, Second Edition Developing Software for Symbian OS (第 2 版)は、Symbian OS 上でのス マートフォン アプリケーション開発 経験のないソフトウェア技術者向け に用意された書籍です。Symbian OS v9 に対応して改訂され、アプリケー ション署名やプラットフォーム セ キュリティに関する章も追加されま した。開発環境に関する最新情報も 記載しています。 Symbian Press: developer.symbian.com/press
より新刊 Symbian OS Communications Programming, Second Edition Symbian OS Communications Programming(第 2 版)は、 Symbian OS v9.1 および v9.2 に特化 し、Symbian OS の主な通信機能を 紹介し、関連各分野において一般動 作実行の手法を例示しています。
Symbian OS C++ for Mobile Phones, Volume 3 Symbian OS の基本理念を詳細に説 明した Symbian OS の効率的開発の ための必読書。
Symbian Press: developer.symbian.com/press
より発行
The Symbian OS Architecture Sourcebook Symbian OS のアーキテクチャの詳 細を説明し、ソフトウェア開発に おけるオブジェクト指向 (OO) の要 点を解説。
S60 Programming 最新の Symbian OS v9 および S60 第 3 版に対応した Symbian OS ソフ トウェア開発者の必読書。著者の Symbian ソフトウェア開発に関する 教育コースの開発や実践における 経験に基づいて編集構成された実 用書。
Symbian Press: developer.symbian.com/press
より発行
Symbian C++ 開発者向け書籍: Symbian OS C++ for Mobile Phones – Volume 1 Richard Harrison 著 Symbian OS C++ for Mobile Phones – Volume 2 Richard Harrison 著 Symbian OS Explained Jo Stichbury 著 Symbian OS Internals Jane Sales 著 Symbian OS Platform Security Craig Heath 著 Smartphone Operating System Concepts with Symbian OS Mike Jipping 著 Accredited Symbian Developer Primer Jo Stichbury & Mark Jacobs 共著
より発行
発行書籍 Coding Tips Performance Tips Getting Started Java ME on Symbian OS P.I.P.S Carbide.c ++ Data Sharing Tips Essential S60 - Developers' Guide Essential UIQ - Getting Started Ready for ROM
翻訳書籍 中国語 日本語 韓国語
スペイン語 ロシア語
コーディング基準
本書は、個々の開発プロジェクトでコーディ ング基準を設定する際の手引きとして用意さ れたもので、Symbian スマートフォンで動作 する C++ のコードを評価する際の数々のガイ ドラインを提供します。 コーディング基準は、Symbian OS のアプリ ケーション開発者向けにわかりやすく情報を 解説する Essential Symbian OS シリーズの 1 部 です。
Symbian Press Symbian Press は、Symbian OS および関連技術 に関する実際的で信頼できる情報をタイムリー に提供することを目的として数々の書籍を発行 しています。Symbian Press に関する情報は、 www.symbian.com/books をご覧ください。