Skip to content

Onion の実用的品質基準

「実用的品質」は意図的に曖昧な表現なので、このファイルではそれを客観的に測定可能な指標のセットに固定します。各行には実行可能な測定方法と閾値があり、すべての行が通過したときに言語は基準に達したとみなされます。

ベースライン数値は、2026-06-26 時点(develop @ 6a2d0e4)の真の値です。

# 次元 測定方法 現在値(2026-06-26) 合格閾値
1 テストスイート SBT_OPTS="-Xmx2g" sbt -batch test 1193 pass / 0 fail 0 failed, 0 skipped
2 サンプルの健全性 SampleProgramsSpec(すべての run/*.on をコンパイル) 36 / 36 compile すべてコンパイル、rot なし
3 大規模プログラム 100行以上の run/*.on をそのまま end-to-end で実行できる数 5(OrderReport、StatsApp、TodoManager、ShapeProcessor、TextAnalyzer) ≥ 5
4 機能網羅性 下記のチェックリストが大規模サンプル内で実証されている 完了 すべての項目 ✓
5 既知の使い勝手バグ 実装済みだが到達不能/壊れた機能として未解決のもの 0 0
6 ドキュメントの対等性 docs/guidedocs/ja/guide の数 + すべてのコードブロックがコンパイル可能 12 / 12 対等性 + すべてのブロックを検証
7 診断メッセージ 英語と日本語の E00xx コード ~24 よくあるエラーごとに専用コード

実用的品質は、行1〜7がすべて合格したときに達成されます。 これにより、「実用的品質に到達する」という漠然とした目標を検証可能な状態に変換します。

行4 — 機能網羅性チェックリスト

機能は、大規模サンプル(run/)の少なくとも1つで動作したときに網羅されたとカウントされます。マイクロテストだけでは不十分です。

  • records(単純)とデータを持つ enum
  • 単純 enum
  • コンストラクタとメソッドを持つクラス
  • インターフェース + 多態ディスパッチ(ExprEval)
  • トップレベルの def(ブロック本体と式本体)
  • 再帰(末尾位置も含む)
  • コレクションパイプライン: map / filter / fold / reduce / sortedBy / groupBy / find / distinct / partition / zip / flatten
  • select / パターンマッチング
  • if / else if
  • while、範囲に対する foreach、Map に対する foreach(k, v)
  • null チェック付き nullable 型
  • val に格納されたクロージャ
  • 文字列補間 #{}
  • try / catch
  • 大規模サンプルで非自明に使われるジェネリクス(StatsAppSafeBox[T]Pair[A,B]、汎用 countMatches
  • 大規模サンプルで使われる拡張メソッド(StatsAppShapeProcessorTextAnalyzerTodoManager

行5 — 現在の未解決使い勝手バグ(追跡中)

なし。以前追跡していた2つの問題は解決済みです。

  1. プリミティブ型の拡張メソッド — 修正済み。extension Int { def double(): Int = self * 2 }(5).double() が動作します。プリミティブ受信側の拡張メソッドはボックス化されたクラス名で登録され、呼び出し時にターゲットをアンボックスしてから静的メソッドを呼び出します。
  2. クラスメソッドから呼ばれるトップレベル関数 — 修正済み。トップレベルの val/var と関数は合成トップレベルクラスの static メンバーとして出力され、クラスメソッド内の裸識別子/修飾なし呼び出しはこれらの static メンバーにフォールバックします。