跳到內容

程式碼風格

此風格用於標準函式庫。您可以在自己的專案中使用它,讓其他開發人員更容易熟悉。

命名

類型名稱使用 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_CASED 命名法。例如

LUCKY_NUMBERS     = [3, 7, 11]
DOCUMENTATION_URL = "https://crystal.dev.org.tw/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/ 包含任何可執行檔。

檔案路徑與其內容的命名空間相符。檔案以它們定義的類別或命名空間命名,使用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