Solidity-style-guide
提供:Dev Guides
Solidity-スタイルガイド
スタイルガイドは、コードレイアウトの一貫性を維持し、コードを読みやすくするのに役立ちます。 Solidityと契約書を作成する際のベストプラクティスは次のとおりです。
コードレイアウト
- インデント-インデントレベルを維持するには、タブの代わりに4つのスペースを使用します。 タブとスペースを混在させないでください。
- * 2つの空行ルール*-2つの契約定義の間に2つの空行を使用します。
pragma solidity ^0.5.0;
contract LedgerBalance {
//...
}
contract Updater {
//...
}
- * 1つの空行ルール*-2つの関数の間に1つの空行を使用します。 宣言のみの場合、空白行は必要ありません。
pragma solidity ^0.5.0;
contract A {
function balance() public pure;
function account() public pure;
}
contract B is A {
function balance() public pure {
//...
}
function account() public pure {
//...
}
}
- 最大行長-読者がコードを簡単に解析できるように、1行が79文字を超えてはなりません。
- ラッピングルール-最初の引数は、カッコを開けずに改行で入力します。 引数ごとに単一のインデントを使用します。 終了要素);最後でなければなりません。
function_with_a_long_name(
longArgument1,
longArgument2,
longArgument3
);
variable = function_with_a_long_name(
longArgument1,
longArgument2,
longArgument3
);
event multipleArguments(
address sender,
address recipient,
uint256 publicKey,
uint256 amount,
bytes32[] options
);
MultipleArguments(
sender,
recipient,
publicKey,
amount,
options
);
- ソースコードエンコーディング-できればUTF-8またはASCIIエンコーディングを使用してください。
- Imports -インポートステートメントは、プラグマ宣言の直後のファイルの先頭に配置する必要があります。
- 関数の順序-関数は、可視性に従ってグループ化する必要があります。
pragma solidity ^0.5.0;
contract A {
constructor() public {
//...
}
function() external {
//...
}
//External functions
//...
//External view functions
//...
//External pure functions
//...
//Public functions
//...
//Internal functions
//...
//Private functions
//...
}
- 余分な空白を避ける-括弧、括弧、または中括弧のすぐ内側の空白を避けます。
- 制御構造-中括弧は宣言と同じ行で開く必要があります。 同じインデントを維持しながら、独自の行で閉じます。 開きブレースのあるスペースを使用します。
pragma solidity ^0.5.0;
contract Coin {
struct Bank {
address owner;
uint balance;
}
}
if (x < 3) {
x += 1;
} else if (x > 7) {
x -= 1;
} else {
x = 5;
}
if (x < 3)
x += 1;
else
x -= 1;
- 関数宣言-中括弧には上記の規則を使用します。 常に可視性ラベルを追加してください。 可視性ラベルは、カスタム修飾子の前に最初に来る必要があります。
function kill() public onlyowner {
selfdestruct(owner);
}
- マッピング-マッピング変数を宣言する際に空白を避けます。
mapping(uint => uint) map;
mapping(address => bool) registeredAddresses;
mapping(uint => mapping(bool => Data[])) public data;
mapping(uint => mapping(uint => s)) data;
- 変数宣言-配列変数の宣言中に空白を避けます。
uint[] x; //not unit [] x;
- 文字列宣言-二重引用符を使用して、単一引用符の代わりに文字列を宣言します。
str = "foo";
str = "Hamlet says, 'To be or not to be...'";
レイアウトの順序
要素は次の順序でレイアウトする必要があります。
- プラグマステートメント
- インポートステートメント
- インターフェース
- 図書館
- 契約
インターフェイス、ライブラリ、または契約内では、順序は次のようになります-
- 型宣言
- 状態変数
- イベント
- 関数
命名規則
- 契約およびライブラリは、CapWordsスタイルを使用して名前を付ける必要があります。 たとえば、SmartContract、所有者など。
- 契約名とライブラリ名はファイル名と一致する必要があります。
- 1つのファイルに複数の契約/ライブラリがある場合、コア契約/ライブラリの名前を使用します。
Owned.sol
pragma solidity ^0.5.0;
//Owned.sol
contract Owned {
address public owner;
constructor() public {
owner = msg.sender;
}
modifier onlyOwner {
//....
}
function transferOwnership(address newOwner) public onlyOwner {
//...
}
}
Congress.sol
pragma solidity ^0.5.0;
//Congress.sol
import "./Owned.sol";
contract Congress is Owned, TokenRecipient {
//...
}
- 構造体名 + − SmartCoinのようなCapWordsスタイルを使用します。
- イベント名 + − Deposit、AfterTransferなどのCapWordsスタイルを使用します。
- 関数名 +-initializeSupplyのようなmixedCaseスタイルを使用します。
- ローカル変数と状態変数 +-creatorAddressのようなmixedCaseスタイルを使用します。
- 定数 +-下線付きのすべての大文字を使用して、MAX_BLOCKSなどの単語を区切ります。
- 修飾子名 + − onlyAfterのようなmixCaseスタイルを使用します。
- 列挙名 + − TokenGroupのようなCapWordsスタイルを使用します。