第 5 章: パッケージ管理と静的解析¶
5.1 はじめに¶
前章では Conventional Commits によるコミットメッセージの規約を学びました。この章では、パッケージ管理 と 静的コード解析 を導入し、コードの品質を自動でチェックできるようにします。
5.2 Bundler によるパッケージ管理¶
RubyGems と Bundler¶
RubyGems は Ruby のパッケージ管理システムで、ライブラリ(gem)の配布とインストールを行います。Bundler は Gemfile でプロジェクトの依存関係を管理し、バージョンの一貫性を保証します。
第 1 部で Minitest と SimpleCov はすでに導入しています。ここでは、品質管理ツールのための依存関係を含めた Gemfile の全体像を確認します。
Gemfile¶
# Gemfile
# frozen_string_literal: true
source 'https://rubygems.org'
group :development, :test do
gem 'guard', '~> 2.18'
gem 'guard-minitest', '~> 2.4'
gem 'guard-rubocop', '~> 1.5'
gem 'guard-shell', '~> 0.7'
gem 'minitest', '~> 5.25'
gem 'minitest-reporters', '~> 1.7'
gem 'rake', '~> 13.2'
gem 'rubocop', '~> 1.68'
gem 'simplecov', '~> 0.22'
end
依存関係をインストールします。
$ bundle install
gem の解説¶
| gem | 用途 |
|---|---|
minitest |
テスティングフレームワーク |
minitest-reporters |
テスト結果のフォーマット表示 |
rake |
タスクランナー |
rubocop |
静的コード解析 + フォーマッター |
simplecov |
コードカバレッジ |
guard |
ファイル監視によるタスク自動実行 |
guard-minitest |
Guard の Minitest プラグイン |
guard-rubocop |
Guard の RuboCop プラグイン |
guard-shell |
Guard のシェルコマンドプラグイン |
Java の Gradle、Node の npm、Python の uv に相当するのが Bundler です。Gemfile.lock により、チームメンバー全員が同じバージョンの gem を使用できます。
5.3 静的コード解析(RuboCop)¶
RuboCop とは¶
RuboCop は Ruby の静的コード解析ツールです。コーディングスタイルの違反を検出し、一部は自動修正できます。解析とフォーマットの両方の機能を持っています。
Java の Checkstyle + PMD、TypeScript の ESLint、Python の Ruff に相当するツールです。
.rubocop.yml の設定¶
# .rubocop.yml
AllCops:
TargetRubyVersion: 3.3
NewCops: enable
SuggestExtensions: false
Style/Documentation:
Enabled: false
Style/FrozenStringLiteralComment:
Enabled: true
Metrics/MethodLength:
Max: 20
Metrics/CyclomaticComplexity:
Max: 7
Metrics/PerceivedComplexity:
Max: 7
Metrics/BlockLength:
Exclude:
- 'test/**/*'
- 'Rakefile'
Naming/MethodName:
Enabled: false
Naming/AsciiIdentifiers:
Exclude:
- 'test/**/*'
主要なルールの解説¶
| ルール | 設定 | 説明 |
|---|---|---|
TargetRubyVersion |
3.3 | 対象 Ruby バージョン |
NewCops: enable |
- | 新しいルールを自動有効化 |
Style/FrozenStringLiteralComment |
true | frozen_string_literal: true を必須に |
Metrics/MethodLength |
Max: 20 | メソッドの最大行数 |
Metrics/CyclomaticComplexity |
Max: 7 | 循環的複雑度の上限 |
Metrics/PerceivedComplexity |
Max: 7 | 認知的複雑度の上限 |
Naming/MethodName |
false | 日本語テストメソッド名を許可 |
Naming/AsciiIdentifiers |
除外 | テストファイルで日本語識別子を許可 |
RuboCop の実行¶
# 解析の実行
$ bundle exec rubocop
# 自動修正
$ bundle exec rubocop --auto-correct
実行結果の例:
$ bundle exec rubocop
Inspecting 6 files
......
6 files inspected, no offenses detected
5.4 コードフォーマッター¶
RuboCop は静的解析とコードフォーマットの両方の機能を持っています。TypeScript では ESLint(解析)と Prettier(フォーマット)が別ツールですが、Ruby では RuboCop が両方を担います。
フォーマットの実行¶
# フォーマットチェック(Layout 系ルールのみ)
$ bundle exec rubocop --only Layout
# 自動フォーマット
$ bundle exec rubocop --auto-correct
Java の Checkstyle + Spotless、Python の Ruff(フォーマッター機能)に相当します。
5.5 コードカバレッジ(SimpleCov)¶
SimpleCov とは¶
SimpleCov は Ruby のコードカバレッジツールです。テスト実行時にどの行が実行されたかを計測し、HTML レポートを生成します。
Java の JaCoCo、TypeScript の @vitest/coverage-v8、Python の pytest-cov に相当します。
test_helper.rb の設定¶
# test/test_helper.rb
# frozen_string_literal: true
require 'simplecov'
SimpleCov.start do
add_filter '/test/'
enable_coverage :branch
end
require 'minitest/autorun'
require 'minitest/reporters'
Minitest::Reporters.use!
add_filter '/test/'— テストファイル自体をカバレッジ対象から除外enable_coverage :branch— ブランチカバレッジを有効化
カバレッジの確認¶
テスト実行時に自動でカバレッジが計測されます。
$ bundle exec rake test
6 tests, 12 assertions, 0 failures, 0 errors, 0 skips
Coverage report generated for Unit Tests to apps/ruby/coverage.
Line Coverage: 100.0% (8 / 8)
Branch Coverage: 100.0% (6 / 6)
HTML レポートは coverage/index.html で確認できます。
5.6 コード複雑度のチェック¶
静的コード解析では、コーディング規約だけでなく、コードの複雑度 もチェックできます。RuboCop の Metrics 系ルールを使って、メソッドの複雑度を制限しましょう。
循環的複雑度(Cyclomatic Complexity)¶
循環的複雑度(サイクロマティック複雑度)とは、ソフトウェア測定法の一つであり、コードがどれぐらい複雑であるかをメソッド単位で数値にして表す指標。
本プロジェクトでは、循環的複雑度を 7 以下 に制限しています。
| 複雑度の範囲 | 意味 |
|---|---|
| 1〜10 | 低複雑度:管理しやすく、問題なし |
| 11〜20 | 中程度の複雑度:リファクタリングを検討 |
| 21〜50 | 高複雑度:リファクタリングが強く推奨される |
| 51 以上 | 非常に高い複雑度:コードを分割する必要がある |
認知的複雑度(Perceived Complexity)¶
RuboCop では Metrics/PerceivedComplexity が認知的複雑度に相当します。コードの構造が「どれだけ頭を使う必要があるか」を定量的に評価します。Java の PMD における CognitiveComplexity や TypeScript の ESLint における complexity ルールに相当します。
本プロジェクトでは、認知的複雑度を 7 以下 に制限しています。
.rubocop.yml への設定¶
# .rubocop.yml(複雑度関連の抜粋)
Metrics/CyclomaticComplexity:
Max: 7
Metrics/PerceivedComplexity:
Max: 7
Metrics/MethodLength:
Max: 20
複雑度チェックの実行¶
RuboCop の通常実行で複雑度もチェックされます。
$ bundle exec rubocop
Inspecting 6 files
......
6 files inspected, no offenses detected
複雑度チェックの効果¶
コード複雑度の制限により、以下の効果が得られます。
- 可読性向上 — 小さなメソッドは理解しやすい
- 保守性向上 — 変更の影響範囲が限定される
- テスト容易性 — 個別機能のテストが簡単
- 自動品質管理 — 複雑なコードの混入を自動防止
現在の FizzBuzz の generate メソッドは循環的複雑度が 4 で、制限値 7 以内に収まっています。第 3 部でオブジェクト指向設計を進める際も、この制限を意識してコードを書いていきます。
5.7 品質チェックの一括実行¶
すべての品質チェックを一括で実行する check タスクを Rakefile に定義しています。
$ bundle exec rake check
このコマンドは以下を順番に実行します。
rubocop— RuboCop の静的解析 + フォーマットチェックtest— Minitest のテスト実行(+ SimpleCov カバレッジ)
各言語の品質ツール比較¶
| 用途 | Ruby | Java | TypeScript | Python |
|---|---|---|---|---|
| パッケージ管理 | Bundler | Gradle | npm | uv |
| テスト | Minitest | JUnit 5 | Vitest | pytest |
| 静的解析 | RuboCop | Checkstyle + PMD | ESLint | Ruff |
| フォーマッター | RuboCop | Checkstyle | Prettier | Ruff |
| カバレッジ | SimpleCov | JaCoCo | @vitest/coverage-v8 | pytest-cov |
| 複雑度チェック | RuboCop Metrics | PMD | ESLint complexity | Ruff McCabe |
5.8 まとめ¶
この章では、以下の品質管理ツールを導入しました。
- Bundler — パッケージ管理と依存関係の管理(Gemfile + Gemfile.lock)
- RuboCop — 静的コード解析 + コードフォーマット(
.rubocop.ymlで設定) - SimpleCov — コードカバレッジの計測(ライン + ブランチカバレッジ)
次の章では、タスクランナーを導入してこれらの品質チェックを自動化し、CI/CD パイプラインを構築します。