Spec-Zone.ru › Crystal

Стиль кодирования

Этот стиль используется в стандартной библиотеке. Вы можете применять его в своих проектах, чтобы другим разработчикам было проще с ними работать.

Именование

Имена типов записываются в 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API