Open show-t opened 7 years ago
Arduinoの命名規約を作成
Arduino IDEでコードを書く上で変数や定数の名前をつけることで、初めてソースを見た人でも何に使われている変数なのか、どのような処理を行っている関数や引数かを明確にする。
UTF-8
/*
スケッチタイトル
制御内容を簡潔に表現する.個々のピンに接続されたコンポーネントを参照する.
The circuit:
* 各inputに接続されているコンポーネントのリスト
* 各outputに接続されているコンポーネントのリスト
Created 年月日
By 著者名
Modified 年月日
By 著者名
http://url/of/online/tutorial.cc
*/
IotPlatFormSetup.ino
ESP8266Setup.h
pin1 = 2
pin2 = 3
etc.
int myPins[] = { 2, 7, 6, 5, 4, 3 };
digitalWrite(myPins[1], HIGH); // turns on pin 7
for (int thisPin = 0; thisPin < 6; thisPin++) {
digitalWrite(myPins[thisPin], HIGH);
delay(500);
digitalWrite(myPins[thisPin], LOW);
delay(500);
}
"_"+ローワーキャメルケース または ローワーキャメルケースのいずれかを使う
アッパーキャメルケースを使う
全て小文字のスネークケース または ローワーキャメルケースのいずれかを使う
ローワーキャメルケース
アッパーキャメルケース
ローワーキャメルケース
本規約は,ArduinoIDEに記述されたプログラムの品質向上を目的に,守るべき最低限のルールを規定し、 コードの可読性・保守性・メンテナンス性の向上を目的とする。
無し
コードは、UTF-8で記述する。
インデントはスペースキーで行い、幅は4のみ許可する。
コンパイラレベルは最高レベルに設定し、警告は全て取り除くこと。 ArduinoIDEでは、ファイル→環境設定→より詳細な情報を表示する項目のコンパイルにチェックを入れ、 コンパイラの警告を全てに設定する。
ソースファイル・ヘッダファイルの内部構成は以下のルールとする。
ファイルヘッダ
関数ヘッダ
void setup() {
処理
}
関数ヘッダ
void loop() {
処理
}
関数ヘッダ
関数処理() {
処理
}
ファイルフッタ
ファイルヘッダには、ファイル名、プロジェクト名、機能概要、更新履歴、更新日付、作成者氏名、includeファイル情報、typedef宣言(ヘッダのみ)、定数定義(同ファイルで用いるもののみ記述する。 複数ファイルで使用する定数の場合はヘッダへ記述)、グローバル変数宣言。 ファイルヘッダは、ヘッダファイル、ソースファイルの共に適応する事。
/*
ファイル名
制御内容を簡潔に表現する。
個々のピンに接続されたコンポーネントを参照する。
The circuit:
* 各inputに接続されているコンポーネントのリスト
* 各outputに接続されているコンポーネントのリスト
Created 年月日
By 著者名
Modified 年月日
Place 変更箇所
By 著者名
*/
/*
includeファイル
*/
/*
typedef宣言
*/
/*
定数定義
*/
/*
グローバル変数
*/
使用例
/*
LEDFlashing.ino
LED点滅回路
16番ピンに接続されたLEDを点滅させる。
The circuit:
* input:none
* output:16
Created 2017/07/01
By Hirotaka Nagaoka
Modified 2017/07/05
Place 点滅周期変更
By Hirotaka Nagaoka
*/
/*
includeファイル
*/
#include <arduino.h>
#include "ESP8266WiFi.h"
/*
typedef宣言
*/
typedef enum statusLED{
OFF = 0,
ON
} STATUS_LED;
/*
定数定義
*/
#define PIN_LED 16
/*
グローバル変数
*/
static unsigned int flagState = 1;
ファイルフッタには権利ロゴを記述する。
/*
Copyright HAL College of Technology & Design
*/
各種関数開始の前に、以下の規約に従って関数ヘッダを記述する。関数ヘッダには、以下の項目を 記述する。関数名、機能名、機能概要、引数の型、引数名、I/O情報、引数の解説、戻り値の型、 戻り値の値、作成日、作成者。
/*
関数名
機能名
機能概要
引数:
戻り値:
Created 年月日
By 著者名
*/
使用例
/*
LEDFlashing
LED点滅
LEDを一定周期で点滅させる。
引数:
STATUS_LED led LED点滅関数実行前のLEDの状態
戻り値:
STATUS_LED LED点滅関数実行後のLEDの状態
Created 2017/07/01
By Hirotaka Nagaoka
*/
単語は英語を主体とする。ローマ字は認めない。また、英字の略語は許可する。
ファイル名は「アッパーキャメルケース」で統一すること。
例)IotPlatFormSetup.ino
ヘッダーファイルは、機能名を採用する。
例)ESP8266Setup.h
単語は英語を主体とする。ローマ字は認めない。また、英字の略語は許可する。
関数名は「ローワーキャメルケース」で統一すること。
例)getPortState
関数のスコープ開始位置は、関数名の1行下に記述すること。 後述する制御文のスコープ位置とは扱いが異なる為注意すること。
関数の引数が存在しない場合、必ずvoidを付与すること。
各項目に特別な表記が無い限り、以下の規約に従う。
演算子とオペランドの間
a += 1;
※アロー、ドット、インクリメント、デクリメント演算子は例外とする。
制御文・関数等と丸括弧の間
if( a )
制御文・関数等が終わる等の丸括弧と中括弧の間
switch( c ) {
カンマの後ろや処理を区切る部分等
func( a, b ); for( a = 0; a < 20; a ++ ) {
コメントは、/* */
もしくは、//
で記述する。
ただし、どちらかで統一すること。共存は認めない。
本仕様書では、統一性を出すために/* */
で記述している。
変数に関する定義・宣言に関する規約を以下に示す。
単語は英語を主体とする。ローマ字は認めない。また、英字の略語は許可する。
変数名は「アッパーキャメルケース」で統一すること。
例)buttonState
単語は英語を主体とする。ローマ字は認めない。また、英字の略語は許可する。
グローバル変数名は「g_+ローワーキャメルケース」で統一すること。
例)int g_State = STATE_NONE
単語は英語を主体とする。ローマ字は認めない。また、英字の略語は許可する。 構造体型名は「全て大文字&スネークケース」で統一すること。 構造体メンバ名は全て意味のある英単語及び略語、また、全て小文字で表記を行う。
単語は英語を主体とする。ローマ字は認めない。また、英字の略語は許可する。
定数名は「全て大文字&スネークケース」で統一すること。
例)#define PIN_MODE 1
/*
includeファイル
*/
より
/* includeファイル */
のほうが個人的には見やすいと思うんだけど、上のようにした根拠はあるの?
また、/* */
と//
は統一すればどちらでもOKとしてるけど、ヘッダフォーマットの規約的に、/* */
に固定されないか。
どちらでも可とするならば、//
版のヘッダフォーマットも必要なのでは?
もしくは、条件付きで//
を許可するとか。( 処理コメントに限るなど)
グローバル変数名について、
スネークとキャメルが混合するのはあまり好ましくないので、
「g_+ローワーキャメルケース」ではなく「g+アッパーキャメルケース」がよいのでは?
int gState = STATE_NONE
定数・マクロ定義について
プログラム上での誤作動を避けるため定義値(式)を( )
で括る。
#define PIN_MODE ( 1 )
まず、ざっくり読んで気になったのは以上の点です。ご確認よろしくお願いします。 修正および修正報告後、クラス関連の規約を追加してください。 あと、Issueページが長くなるので、workフォルダにアップロード、コメントにパスを記載で対応してください。
背景
プログラミングにおけるファイル名、クラス名、メンバ名、メソッド名の規約を設けることでチーム内で困惑が起こらないようにする。
目的
対応内容
命名規約をまとめて文書化する。
期日
7/5