Solidity - Руководство по стилю
Руководство по стилю помогает поддерживать согласованность макета кода и делает код более читаемым. Ниже приведены рекомендации по написанию контрактов с Solidity.
Макет кода
Indentation- Используйте 4 пробела вместо табуляции для поддержания уровня отступа. Избегайте смешивания пробелов с табуляциями.
Two Blank Lines Rule - Используйте 2 пустые строки между двумя определениями контрактов.
pragma solidity ^0.5.0;
contract LedgerBalance {
//...
}
contract Updater {
//...
}
One Blank Line Rule- Используйте 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 {
// ...
}
}
Maximum Line Length - Одна строка не должна пересекать 79 символов, чтобы читатели могли легко разобрать код.
Wrapping rules- Первый аргумент должен быть в новой строке без открывающих скобок. Используйте один отступ для каждого аргумента. Завершающий элемент); должен быть последним.
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
);
Source Code Encoding - Предпочтительно использовать кодировку UTF-8 или ASCII.
Imports - Операторы импорта должны быть помещены в начало файла сразу после объявления прагмы.
Order of Functions - Функции должны быть сгруппированы по степени видимости.
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
// ...
}
Avoid extra whitespaces - Избегайте использования пробелов внутри скобок, скобок или фигурных скобок.
Control structures- Фигурные скобки должны открываться на той же строке, что и объявление. Закройте на своей строке с таким же отступом. Используйте пробел с открывающей скобкой.
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 Declaration- Используйте указанное выше правило для фигурных скобок. Всегда добавляйте метку видимости. Метка видимости должна быть первой перед любым настраиваемым модификатором.
function kill() public onlyowner {
selfdestruct(owner);
}
Mappings - Избегайте пробелов при объявлении переменных сопоставления.
mapping(uint => uint) map;
mapping(address => bool) registeredAddresses;
mapping(uint => mapping(bool => Data[])) public data;
mapping(uint => mapping(uint => s)) data;
Variable declaration - Избегайте пробелов при объявлении переменных массива.
uint[] x; // not unit [] x;
String declaration - Используйте двойные кавычки для объявления строки вместо одинарной кавычки.
str = "foo";
str = "Hamlet says, 'To be or not to be...'";
Порядок расположения
Элементы должны быть расположены в следующем порядке.
Заявления прагмы
Операторы импорта
Interfaces
Libraries
Contracts
В интерфейсах, библиотеках или контрактах порядок должен быть следующим:
Объявления типов
Переменные состояния
Events
Functions
Соглашения об именах
Контракт и Библиотека должны быть названы в стиле CapWords. Например, SmartContract, Owner и т. Д.
Имя контракта и библиотеки должно совпадать с именами файлов.
В случае, если в файле несколько контрактов / библиотек, используйте имя основного контракта / библиотеки.
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 {
//...
}
Имена структур
- Используйте стиль CapWords, например SmartCoin.Имена событий
- Используйте стиль CapWords, например "Депозит", "AfterTransfer".Имена функций
- Используйте стиль смешанного случая, например initiateSupply.Локальные и государственные переменные
- Используйте стиль mixedCase, например creatorAddress, supply.Константы
- Используйте все заглавные буквы с подчеркиванием для разделения таких слов, как MAX_BLOCKS.Имена модификаторов
- Используйте стиль mixCase, как onlyAfter.Enum Names
- Используйте стиль CapWords, например TokenGroup.