Стиль кодирования
Этот стиль используется в стандартной библиотеке. Вы можете применять его в своих проектах, чтобы другим разработчикам было проще с ними работать.
Именование
Имена типов записываются в PascalCase. Например:
class ParseError < Exception
end
module HTTP
class RequestHandler
end
end
alias NumericValue = Float32 | Float64 | Int32 | Int64
lib LibYAML
end
struct TagDirective
end
enum Time::DayOfWeek
end
Имена методов записываются в snake_case. Например:
class Person
def first_name
end
def date_of_birth
end
def homepage_url
end
end
Имена переменных записываются в snake_case. Например:
class Greeting
@@default_greeting = "Hello world"
def initialize(@custom_greeting = nil)
end
def print_greeting
greeting = @custom_greeting || @@default_greeting
puts greeting
end
end
Константы записываются в SCREAMING_SNAKE_CASE. Например:
LUCKY_NUMBERS = [3, 7, 11]
DOCUMENTATION_URL = "http://crystal-lang.org/docs"
Акронимы
В именах классов акронимы записываются заглавными буквами. Например, HTTP и LibXML.
В именах методов акронимы записываются строчными буквами. Например, #from_json и #to_io.
Библиотеки
Имена Lib получают префикс Lib. Например: LibC, LibEvent2.
Имена каталогов и файлов
В проекте:
-
/содержит файл readme, различные конфигурации проекта (например, конфигурации CI или редактора), а также другую документацию на уровне проекта (например, журнал изменений или руководство по внесению изменений). -
src/содержит исходный код проекта. -
spec/содержит спецификации проекта, которые можно запустить с помощьюcrystal spec. -
bin/содержит исполняемые файлы.
Пути к файлам соответствуют пространству имен их содержимого. Файлы называются по имени определяемого ими класса или пространства имен, используя snake_case.
Например, HTTP::WebSocket определён в src/http/web_socket.cr.
Отступы
Используйте два пробела для отступов кода внутри пространств имён, методов, блоков и других вложенных контекстов. Например:
module Scorecard
class Parser
def parse(score_text)
begin
score_text.scan(SCORE_PATTERN) do |match|
handle_match(match)
end
rescue err : ParseError
# handle error ...
end
end
end
end
Внутри класса разделяйте определения методов, константы и определения вложенных классов одной пустой строкой. Например:
module Money
CURRENCIES = {
"EUR" => 1.0,
"ARS" => 10.55,
"USD" => 1.12,
"JPY" => 134.15,
}
class Amount
getter :currency, :value
def initialize(@currency, @value)
end
end
class CurrencyConversion
def initialize(@amount, @target_currency)
end
def amount
# implement conversion ...
end
end
end
To the extent possible under law, the persons who contributed to this workhave waived
all copyright and related or neighboring rights to this workby associating CC0 with it.
https://crystal-lang.org/reference/1.2/conventions/coding_style.html