Pureline

Pureline Crystal

Eigene Identität, expliziter Kontrollfluss.

Crystal behält seine eigene Sprachidentität und folgt dabei den Pureline-Prinzipien. Kurze Postfix-Guards bleiben erlaubt, komplexer Kontrollfluss wird zum expliziten Block, nil wird sichtbar behandelt und Macros bleiben die Ausnahme.

Idiomatic Postfix GuardsExplicit Blocks for Complex FlowNil GuardsType Inference
8Profilregeln
16automatisiert
Crystal-Code prüfen

Profilregeln

PL-CR-001 Checker

Idiomatische Postfix-Guards sind erlaubt

Crystal-Postfix-Bedingungen sind Pureline-konform, wenn sie einen kurzen, offensichtlichen Guard ausdrücken. Sie halten Guard-Logik kompakt und den Happy Path linear.

Wird die Bedingung oder die geschützte Aktion komplexer, kommt ein expliziter Block. Die Regel lautet nicht „keine Postfix-Bedingungen“, sondern: die Form wählen, bei der die Absicht sofort klar ist.

Avoid
Zusammengesetzte Bedingung
return unless session && session.valid? && !session.expired? && limiter.allow?(user)
Keine Guard-Aktion
logger.info("Session #{session.id} closed") if session.closed?
Doppelte Verneinung
return unless !closed
Pureline
Kurzer Guard
return unless valid
return if closed
Komplex: expliziter Block
if session.closed? || session.expired?
  logger.info("Session is no longer usable")
  return
end
PL-CR-002 Checker

else vermeiden

Wie in allen Pureline-Profilen: Sonderfall zuerst, früh verlassen, dann linear weiter.

Avoid
if valid
  execute
else
  reject
end
elsif-Kette
if admin?
  grant_all
elsif member?
  grant_default
else
  deny
end
Pureline
if !valid
  reject
  return
end

execute
Echte Zustandsverzweigung
case role
when .admin?  then grant_all
when .member? then grant_default
end
PL-CR-003 Checker

Idiomatische Namen

Variablen und Methoden in snake_case, Typen in PascalCase.

Avoid
class Session_Service
  def loadUser(userId)
    packetRegistry = PacketRegistry.new
  end
end
Pureline
Methoden & Variablen
session_service
packet_registry
load_user
create_session
Typen
SessionService
PacketRegistry
UserStorage
PL-CR-004 Checker

Typinferenz bevorzugen

Crystal inferiert lokale Typen zuverlässig. Redundante Annotationen sind Lärm.

Avoid
session : Session = create_session(user)
Pureline
session = create_session(user)
PL-CR-005 Checker

Explizite nil-Guards

Erwartete nil-Fälle werden sichtbar behandelt, statt sie in tief verschachtelten Ketten oder mit not_nil! zu vergraben.

Avoid
nil weggedrückt
session = create_session(users.find(id).not_nil!)
nil in Ketten vergraben
name = users.find(id).try &.profile.try &.display_name.try &.strip
Pureline
user = users.find(id)

if user.nil?
  return
end

session = create_session(user)
Als kurzer Postfix-Guard
user = users.find(id)
return if user.nil?

session = create_session(user)
PL-CR-006 Checker

Exceptions für Ausnahmezustände

Erwartete Ergebnisse werden über normale Domain-Modellierung abgebildet: nil, Union Types, Result-artige Strukturen oder Enums. Exceptions stehen für echtes Versagen, nicht für gewöhnliche Verzweigung.

Avoid
Exception als Verzweigung
def find_user(id)
  users.fetch(id)
rescue KeyError
  nil
end
Alles fangen
begin
  connect
rescue
  retry_later
end
Pureline
def find_user(id) : User?
  users[id]?
end
PL-CR-007 Checker

Keine Macro-Cleverness ohne Not

Macros sind mächtig. Pureline versteckt gewöhnliches Verhalten aber nicht hinter Metaprogrammierung, außer die Abstraktion bringt einen klaren architektonischen Vorteil. Generiertes Verhalten bleibt vorhersehbar und auffindbar.

Avoid
macro delegate_all(target)
  {% for method in @type.methods %}
    def {{method.name}}
      @{{target}}.{{method.name}}
    end
  {% end %}
end
Pureline
Standard-Macro, explizit benannt
delegate open, close, to: @connection
PL-CR-008

Folder Density

Ein Crystal-Quell- oder Namespace-Ordner enthält standardmäßig höchstens **10 produktive .cr-Dateien**.

Specs, generierte Dateien, Bindings und reine Metadaten-Dateien zählen nicht mit.

Wird das Limit überschritten, wird der Namespace nach Verantwortung geteilt, unter Beibehaltung idiomatischer Crystal-Struktur.

Core-Regeln im Crystal-Checker

Zusätzlich zu den Profilregeln prüft der Checker für Crystal diese Regeln aus dem Pureline Core: