コンテンツへスキップ

コーディングスタイル

このスタイルは標準ライブラリで使用されています。他の開発者にとって使い慣れたものにするために、独自のプロジェクトでも使用できます。

ネーミング

**型名**はパスカルケースです。例:

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

**メソッド名**はスネークケースです。例:

class Person
  def first_name
  end

  def date_of_birth
  end

  def homepage_url
  end
end

**変数名**はスネークケースです。例:

class Greeting
  @@default_greeting = "Hello world"

  def initialize(@custom_greeting = nil)
  end

  def print_greeting
    greeting = @custom_greeting || @@default_greeting
    puts greeting
  end
end

**定数**は大文字のスネークケースです。例:

LUCKY_NUMBERS     = [3, 7, 11]
DOCUMENTATION_URL = "https://crystal.dokyumento.jp/docs"

**例外メッセージ**はセンテンスケースです。ただし、コードまたは頭字語はメッセージの先頭で小文字で始まる場合があります。例:

raise ArgumentError.new("Cannot create a string with a null pointer")
raise RuntimeError.new("getpeername failed")
{% raise "Expected size to be an integer literal" %}

頭字語

クラス名では、頭字語はすべて大文字です。例:HTTPLibXML

メソッド名では、頭字語はすべて小文字です。例:#from_json#to_io

ライブラリ

Lib名はLibで接頭辞が付けられます。例:LibCLibEvent2

ディレクトリとファイル名

プロジェクト内

  • /にはREADME、プロジェクト設定(例:CIやエディター設定)、その他のプロジェクトレベルのドキュメント(例:変更ログや貢献ガイド)が含まれています。
  • src/にはプロジェクトのソースコードが含まれています。
  • spec/にはプロジェクトのスペックが含まれており、crystal specで実行できます。
  • bin/には実行ファイルが含まれています。

ファイルパスは、その内容の名前空間と一致します。ファイルは、定義するクラスまたは名前空間にちなんで命名され、スネークケースを使用します。

例:HTTP::WebSocketsrc/http/web_socket.crに定義されています。

インデント

名前空間、メソッド、ブロック、またはその他のネストされたコンテキスト内のコードをインデントするには、**スペース2つ**を使用します。例:

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

クラス内では、メソッド定義、定数、内部クラス定義を**改行1つ**で区切ります。例:

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