📜  Solidity-样式指南

📅  最后修改于: 2020-11-04 04:25:25             🧑  作者: Mango


 

样式指南有助于保持代码布局的一致性,并使代码更具可读性。以下是与Solidity签订合同时遵循的最佳实践。

代码布局

  • 缩进-使用4个空格而不是制表符来保持缩进级别。避免将空格与制表符混在一起。
  • 两个空白行规则-在两个合同定义之间使用2个空白行。
pragma solidity ^0.5.0;

contract LedgerBalance {
   //...
}
contract Updater {
   //...
}
  • 一个空行规则-在两个函数之间使用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 {
      // ...
   }
}
  • 最大行长-一行不应超过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编码。
  • 导入-导入语句应在编译指示声明之后放置在文件的顶部。
  • 功能顺序-功能应根据其可见性分组。
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,所有者等。
  • 合同名称和库名称应与它们的文件名匹配。
  • 如果文件中有多个合同/库,请使用核心合同/库的名称。

拥有的

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 {
      //...
   }
}

国会

pragma solidity ^0.5.0;

// Congress.sol
import "./Owned.sol";

contract Congress is Owned, TokenRecipient {
   //...
}
  • 结构名称

    −使用CapWords样式,如SmartCoin。

  • 活动名称

    −使用CapWords样式,例如存款,AfterTransfer。

  • 功能名称

    −使用“ mixedCase样式”,如“ initiateSupply”。

  • 本地和州变量

    −使用mixedCase样式,例如creatorAddress,供应。

  • 常数

    −使用所有带有下划线的大写字母分隔单词,例如MAX_BLOCKS。

  • 修饰符名称

    −像onlyAfter一样使用mixCase Style。

  • 枚举名称

    −使用CapWords样式,例如TokenGroup。