solidity編程規範

編程規範

概述

本指南用於提供編寫Solidity的編碼規範,本指南會隨着後續需求不斷修改演進,可能會增長新的更合適的規範,舊的不適合的規範會被廢棄。node

固然,不少項目可能有本身的編碼規範,若是存在衝突,請參考項目的編碼規範。python

本指南的結構及規範建議大都來自於python的pep8編碼規範編程

本指南不是說必須徹底按照指南的要求進行solidity編碼,而是提供一個整體的一致性要求,這個和pep8的理念類似(譯註:pep8的理念大概是:強制的一致性是很是愚蠢的行爲,參見:pep8)。api

本指南是爲了提供編碼風格的一致性,所以一致性這一理念是很重要的,在項目中編碼風格的一致性更加劇要,而在同一個函數或模塊中風格的一致性是最重要的。而最最最重要的是:你要知道何時須要保持一致性,何時不須要保持一致性,由於有時候本指南不必定適用,你須要根據本身的須要進行權衡。能夠參考下邊的例子決定哪種對你來講是最合適的。數組

代碼佈局

縮進函數

每行使用4個空格縮進佈局

tab或空格學習

空格是首選縮進方式區塊鏈

禁止tab和空格混合使用字體

回車(空行)

兩個合約之間增長兩行空行

規範的方式:

contract A {

    ...}

contract B {

    ...}

contract C {

    ...}

不規範的方式:

contract A {

    ...}contract B {

    ...}

contract C {

    ...}

合約內部函數之間須要回車,若是是函數聲明和函數實現一塊兒則須要兩個回車

規範的方式:

contract A {

    function spam();

    function ham();

}

contract B is A {

    function spam() {

        ...

    }

    function ham() {

        ...

    }

}

不規範的方式:

contract A {

    function spam() {

        ...

    }

    function ham() {

        ...

    }}

源文件編碼方式

首選UTF-8或者ASCII編碼

引入

通常在代碼開始進行引入聲明

規範的方式:

import "owned";

contract A {

    ...}

contract B is owned {

    ...}

不規範的方式:

contract A {

    ...}

import "owned";

contract B is owned {

    ...}

表達式中的空格使用方法

如下場景避免使用空格

  • 括號、中括號,花括號以後避免使用空格

Yes規範的方式: spam(ham[1], Coin({name: 「ham」}));

No不規範的方式: spam( ham[ 1 ], Coin( { name: 「ham」 } ) );

  • 逗號和分號以前避免使用空格

Yes規範的方式: function spam(uint i, Coin coin);

No不規範的方式: function spam(uint i , Coin coin) ;

  • 賦值符先後避免多個空格

規範的方式:

x = 1;

y = 2;

long_variable = 3;

不規範的方式:

x             = 1;

y             = 2;

long_variable = 3;

控制結構

合約、庫。函數、結構體的花括號使用方法:

  • 左花括號和聲明同一行

  • 右括號和左括號聲明保持相同縮進位置。

  • 左括號後應回車

規範的方式:

contract Coin {

    struct Bank {

        address owner;

        uint balance;

    }

}

不規範的方式:

contract Coin

{

    struct Bank {

        address owner;

        uint balance;

    }

}

以上建議也一樣適用於if、else、while、for。

此外,if、while、for條件語句之間必須空行

規範的方式:

if (...) {

    ...

}

for (...) {

    ...

}

不規範的方式:

if (...)

{

    ...

}

while(...)

{

}

for (...)

 {

    ...;

}

對於控制結構內部若是隻有單條語句能夠不須要使用括號。

規範的方式:

if (x < 10)

    x += 1;

不規範的方式:

if (x < 10)

    someArray.push(Coin({

        name: 'spam',

        value: 42

    }));

對於if語句若是包含else或者else if語句,則else語句要新起一行。else和else if的內部規範和if相同。

規範的方式:

if (x < 3) {

    x += 1;

}

else {

    x -= 1;

}

if (x < 3)

    x += 1;

else

    x -= 1;

不規範的方式:

if (x < 3) {

    x += 1;} 

else {

    x -= 1;}

函數聲明

對於簡短函數聲明,建議將函數體的左括號和函數名放在同一行。

右括號和函數聲明保持相同的縮進。

左括號和函數名之間要增長一個空格。

規範的方式:

function increment(uint x) returns (uint) {

    return x + 1;

}

function increment(uint x) public onlyowner returns (uint) {

    return x + 1;

}

不規範的方式:

function increment(uint x) returns (uint)

{

    return x + 1;

}

function increment(uint x) returns (uint)

{

    return x + 1;

}

function increment(uint x) returns (uint)

 {

    return x + 1;

}

function increment(uint x) returns (uint) 

{

    return x + 1;

}

默認修飾符應該放在其餘自定義修飾符以前。

規範的方式:

function kill() public onlyowner {

    selfdestruct(owner);

}

不規範的方式:

function kill() onlyowner public {

    selfdestruct(owner);

}

對於參數較多的函數聲明可將全部參數逐行顯示,並保持相同的縮進。函數聲明的右括號和函數體左括號放在同一行,並和函數聲明保持相同的縮進。

規範的方式:

function thisFunctionHasLotsOfArguments(

    address a,

    address b,

    address c,

    address d,

    address e,

    address f,

) {

    do_something;

}

不規範的方式:

function thisFunctionHasLotsOfArguments(address a, address b, address c,

    address d, address e, address f) {

    do_something;

}

function thisFunctionHasLotsOfArguments(address a,

                                        address b,

                                        address c,

                                        address d,

                                        address e,

                                        address f) {

    do_something;

}

function thisFunctionHasLotsOfArguments(

    address a,

    address b,

    address c,

    address d,

    address e,

    address f) {

    do_something;

}

若是函數包括多個修飾符,則須要將修飾符分行並逐行縮進顯示。函數體左括號也要分行。

規範的方式:

function thisFunctionNameIsReallyLong(address x, address y, address z)

    public

    onlyowner

    priced

    returns (address)

{

    do_something;

}

function thisFunctionNameIsReallyLong(

    address x,

    address y,

    address z,)

    public

    onlyowner

    priced

    returns (address)

{

    do_something;

}

不規範的方式:

function thisFunctionNameIsReallyLong(address x, address y, address z)

                                      public

                                      onlyowner

                                      priced

                                      returns (address) {

    do_something;

}

function thisFunctionNameIsReallyLong(address x, address y, address z)

    public onlyowner priced returns (address){

    do_something;

}

function thisFunctionNameIsReallyLong(address x, address y, address z)

    public

    onlyowner

    priced

    returns (address) {

    do_something;

}

對於須要參數做爲構造函數的派生合約,若是函數聲明太長或者難於閱讀,建議將其構造函數中涉及基類的構造函數分行獨立顯示。

規範的方式:

contract A is B, C, D {

    function A(uint param1, uint param2, uint param3, uint param4, uint param5)

        B(param1)

        C(param2, param3)

        D(param4)

    {

        // do something with param5

    }

}

不規範的方式:

contract A is B, C, D {

    function A(uint param1, uint param2, uint param3, uint param4, uint param5)

    B(param1)

    C(param2, param3)

    D(param4)

    {

        // do something with param5

    }

}

contract A is B, C, D {

    function A(uint param1, uint param2, uint param3, uint param4, uint param5)

        B(param1)

        C(param2, param3)

        D(param4) {

        // do something with param5

    }

}

對於函數聲明的編程規範主要用於提高可讀性,本指南不可能囊括全部編程規範,對於不涉及的地方,程序猿可發揮本身的主觀能動性。

映射 待完成

變量聲明

對於數組變量聲明,類型和數組中括號直接不能有空格。

規範的方式: uint[] x; 不規範的方式: uint [] x;

其餘建議

  • 賦值運算符兩邊要有一個空格

規範的方式:

x = 3;x = 100 / 10;x += 3 + 4;x |= y && z;

不規範的方式:

x=3;x = 100/10;x += 3+4;x |= y&&z;
  • 爲了顯示優先級,優先級運算符和低優先級運算符之間要有空格,這也是爲了提高複雜聲明的可讀性。對於運算符兩側的空格數目必須保持一致。

規範的方式:

x = 2**3 + 5;x = 2***y + 3*z;x = (a+b) * (a-**b);

不規範的方式:

x = 2** 3 + 5;x = y+z;x +=1;

命名規範

命名規範是強大且普遍使用的,使用不一樣的命名規範能夠傳遞不一樣的信息。

如下建議是用來提高代碼的可讀性,所以被規範不是規則而是用於幫助更好的解釋相關代碼。

最後,編碼風格的一致性是最重要的。

命名方式

爲了防止混淆,如下命名用於說明(描述)不一樣的命名方式。

  • b(單個小寫字母)

  • B(單個大寫字母)

  • 小寫

  • 有下劃線的小寫

  • 大寫

  • 有下劃線的大寫

  • CapWords規範(首字母大寫)

  • 混合方式(與CapitalizedWords的不一樣在於首字母小寫!)

  • 有下劃線的首字母大寫(譯註:對於python來講不建議這種方式)

注意

當使用CapWords規範(首字母大寫)的縮略語時,縮略語所有大寫,好比HTTPServerError 比HttpServerError就好理解一點。

避免的命名方式

  • l - Lowercase letter el 小寫的l

  • O - Uppercase letter oh 大寫的o

  • I - Uppercase letter eye 大寫的i

永遠不要用字符‘l'(小寫字母el(就是讀音,下同)),‘O'(大寫字母oh),或‘I'(大寫字母eye)做爲單字符的變量名。在某些字體中這些字符不能與數字1和0分辨。試着在使用‘l'時用‘L'代替。

合約及庫的命名

合約應該使用CapWords規範命名(首字母大寫)。

事件

事件應該使用CapWords規範命名(首字母大寫)。

函數命名

函數名使用大小寫混合

函數參數命名

當定義一個在自定義結構體上的庫函數時,結構體的名稱必須具備自解釋能力。

局部變量命名

大小寫混合

常量命名

常量所有使用大寫字母並用下劃線分隔。

修飾符命名

功能修飾符使用小寫字符並用下劃線分隔。

避免衝突

  • 單個下劃線結尾

當和內置或者保留名稱衝突時建議使用本規範。

通用建議

待完成

轉自: https://blog.csdn.net/mongo_node/article/details/80152114

若是你但願高效的學習以太坊DApp開發,能夠訪問匯智網提供的最熱門在線互動教程:

其餘更多內容也能夠訪問這個以太坊博客

相關文章
相關標籤/搜索