====== コーディング規約 VB2005 ====== ===== 1. はじめに ===== ==== 1.1 本書の位置付け ====  本書では、Visual Basic 2005 言語を使うプログラム作成時のコーディング規約である。 ==== 1.2 本書の目的 ====  本書は、Visual Basic 2005 言語によるコーディングの指針を説明するものである。また、本書では、コーディングの標準化により、プログラム保守時のコードの可読性、コーディングの生産性、および、品質の向上を目的としている。 ==== 1.3 対象読者 ====  プログラマに相当する知識・経験を有する者を対象としている。 ==== 1.4 前提知識 ====  本書はVisual Studio 2005、および、Visual Basic 2005 言語の知識を必要とする。 ===== 2. 基本方針 =====  この章では、コーディング規約全般についての方針を記述する。 ==== 2.1 本規約で明示されていないものについて ====  本書で明示されていないものについては、.NET Frameworkの規則に従う。.NET Frameworkの規則については、Microsoft Visual Studio 2005 ドキュメントに含まれる以下の文献を参照のこと。 *「Visual Basic のコーディング規則」 *「クラス ライブラリ開発のデザイン ガイドライン」 *「安全なコーディングのガイドライン」  規則に従うということは、上記文献のクラス・ライブラリの規約や記載されたサンプルとの矛盾がないことである。 ==== 2.2 本規約の適用範囲について ====  Visual Studioやツールによって自動生成されたコードに関しては、本規約の対象外とする。ただし、コーディング・スタイルの設定を行うことができるツールを使用する場合は、可読性を向上させるために、可能な限り本規約にのっとった形で設定することを推奨する。 ==== 2.3 ファイルの構成について ====  複数のクラスを1ファイルにまとめることは許可しない。基本は1ファイルにつき1クラスを記述する。これは、アクセス修飾子(Public/Protected/Friend/Protected Friend/Private)に関係なく従うものとする。ただし、ネスト・クラス(インナー・クラス)/パーシャル・クラスに関してはこの限りではない。\\  単一クラスをファイルに格納することで、クラス管理を容易するのがこの構成の目的である。 ===== 3. 命名規約 =====  命名に関しては、別途整理する。 ===== 4. コーディング スタイル ===== ==== 4.1 コードの構成順序 ====  コードの構成順序を以下のように定める。 Option Explicit On Option Strict On Imports .NET Framework のクラス・ライブラリの名前空間(*1) Imports ODP.NETなどのベンダ製クラス・ライブラリの名前空間(*1) Imports プロジェクト共通部品の名前空間(*1) Imports 上記以外の名前空間(*1) Namespace xxx クラス/モジュール ヘッダ Public Class XXX_XXX(*2) 定数定義(*1) 変数定義(*1) 列挙型定義(*1) 構造体定義(*1) ネスト・クラス定義(*1) プロパティ定義(*1) コンストラクタ定義(*1) ディスポーズ定義(*1) イベント定義(*1) メソッド定義(*1) End Class End Namespace * *1 複数定義の繰り返しを表す。 * *2 上記の例ではクラスを記述しているが、モジュールの場合はClassをModuleに置き換えて解釈すること。 ==== 4.2 コメント ====  コードの中に既にある情報やコードから自明であるような情報の重複は避ける。コードが発展するにつれて必要がなくなるようなコメントは避ける。\\  また、アクセス修飾子にかかわらず、クラス/モジュール/構造体/列挙型/メソッド/イベント/プロパティ/ローカル変数/メンバ変数/定数にはコメントを記述する。 === (1) クラス/モジュール ヘッダ ===  すべてのクラス/モジュールは、コメントを用いて、サブシステムⅠD・サブシステム名・プログラムID・クラス名・親クラス名・概要・作成者(フルネーム)・作成日・更新履歴を記述する。更新履歴に関しては、単体テストが終了し運用環境へのリリース後の変更を対象とする。 === (2) 構造体/列挙型 ヘッダ ===  構造体/列挙型には、名称、概要を記述する。\\ \\  共通部品に関しては、タグを必ず記述する。Visual StudioのIntelliSense 機能によりリファレンスを表示し、コーディング時の生産性を高めるためである。 === (3) メソッド/イベント/プロパティ ヘッダ ===  メソッド/イベント/プロパティには、概要が分かるようにコメントを付ける。引数が存在する場合は指定内容を記述し、戻り値が存在する場合も同様に内容を記述する。\\ \\  共通部品に関しては、引数が存在する場合にはタグ、返り値が存在する場合にはタグを必ず記述する。 === (4) ローカル変数/メンバ変数/定数 ===  変数には、その変数が何を示しているのかを記述する。定数に値の意味を記述する。共通部品のインタフェース構造体に関しては、メンバ変数に必ずタグを記述する。 === (5) メソッド内のコメント ===  論理的な処理の単位ごとに、コメントを挿入する。 === (6) ソースコード修正のコメント ===  修正箇所の範囲を明確にするために、修正コメントが開始~終了のブロックを構成するように挿入する。 ==== 4.3 インデントサイズ ====  インデントサイズは、スペース4つ分を標準と定める。 === (1) Visual Studio テキスト エディタ オプションの設定 === a. [ツール]メニューの[オプション]をクリックして、[オプション]ダイアログ ボックスを表示する。\\ \\ b. [オプション]ダイアログ ボックスの[すべての設定を表示]チェックボックスがオフの状態で、[テキスト エディタ]フォルダにある[Basic]フォルダの[エディタ]プロパティ ページを表示する。\\ \\ 標準の設定は以下のとおりである。 * [インデントの種類]は[スマート]を指定する。 * [タブ サイズ]は4を指定する。 * [インデント サイズ]は4を指定する。 {{:develop:vs2005_vb_indent.png?600|VB2005インデント設定}}\\ c. [OK]ボタンをクリックして設定を有効にする。 ==== 4.4 長い行の折り返し ====  行が長くなった場合(100文字を超える時)は、以下の項目の例に従って改行を挿入する。改行後にステートメントが続いている間はインデントを挿入する。 === (1) カンマ === 例: カンマ(,)の後で改行 Dim year As Integer = 2009 Dim month As Integer = 1 Dim day As Integer = 1 String.Format("{0:d4}/{1:d2}/{2:d2}", _ year, month, day) === (2) 算術演算子 === 例: 算術演算子(=, +=, *, /, +, -)の後で改行 Dim unitPrice1 As Decimal = 100 Dim amount1 As Decimal = 10 Dim unitPrice2 As Decimal = 500 Dim amount2 As Decimal = 2 Dim amountOfMoney As Decimal amountOfMoney = unitPrice1 * amount1 + _ unitPrice2 * amount2 ※算術演算子を残して改行を行うことで、コードが続くことを容易に想像することができる。 === (3) 連結演算子 === 例: 連結演算子(&)の後で改行 lblCustomereName.Text = customerInfoStructure.CustomerName " " & _ customerInfoStructure.BranchOfficeName ※連結演算子を残して改行を行うことで、コードが続くことを容易に想像することができる。 === (4) 優先度の低い演算子 === 例: 優先度の低い演算子(Or)の後で改行 If Not (employeeCode.Substring(0, 1) = "0" Or _ employeeCode.Substring(0, 1) = "1") Then === (5) 継承、および、インプリメント === 例: クラス宣言(Class)、継承(Inherits)、インプリメント(Implements)を改行で分割 Public Class MasterUpdateProcessLockFile Inherits LockFile Implements IDisposable … End Class ===== 5. ガイドライン =====  この章では、品質や保守性、および、生産性の観点から、本書が強く推奨する項目について記述する。 ==== 5.1 変数宣言/縮小変換の明示 ====  **Option Explicit On**、および、**Option Strict On** を明示的に記述する。\\ \\ 例: **Option Explicit On**、および、**Option Strict On** の記述 Option Explicit On Option Strict On 名前空間のインポート定義 クラス/モジュール ヘッダ Public Class MasterMaintenanceScreen 定数定義 … End Class * ※**Option Explicit On**、および、**Option Strict On** ステートメントを使用する場合は、ファイル内の他のどのソース コード ステートメントよりも前に記述する必要がある。 === (1) 変数の明示的宣言 ===  Option Explict On により変数を明示的宣言するように強制する。これにより、既存の変数名を誤って入力したり、変数のスコープが明確でないコード内で混乱が起きたりするのを避けることができる。\\ \\ 例: 変数の明示的宣言 Dim amount As Integer amount = 10 ' コンパイル可能(宣言された変数への代入) amountOfMoney = 100 ' 「名前は宣言されていない」エラーとなる === (2) 縮小変換の明示 ===  Option Strict On は縮小変換を明示的行うように強制し、遅延バインディングを禁止する。これにより、データの損失を伴う意図しない型変換を回避できるとともに、遅延バインディングの禁止によって パフォーマンスが改善(*1)される。 * *1 遅延バインディングの禁止は、全ての変数が事前バインディングされることを意味する。事前バインディングされたオブジェクトでは、アプリケーションが実行される前に、コンパイラによってメモリの割り当てとその他の最適化が実行されるため処理が高速である。 例: 縮小変換の明示 Dim amountOfMoney1 As Integer Dim amountOfMoney2 As Decimal amountOfMoney2 = 2147483647 amountOfMoney1 = CInt(amountOfMoney2) ' コンパイル可能(明示的に縮小変換を行う) amountOfMoney1 = amountOfMoney2 ' 「暗黙的な変換はできない」エラーになる ==== 5.2 文字列連結と算術演算の演算子 ====  文字列を連結するときは & 演算子を使用し、数値を加算するときは + 演算子を使用する。\\ \\  + 演算子を使用して文字列を連結することもできるが、文字列連結を & 演算子に限定することにより文字列連結と算術演算が混在する複雑な記述において、混乱が起きるのを避けることができる。