


Desmond Obisi
Aravind Putrevu
November 08, 2024
11 min read
November 08, 2024
11 min read

5 Code Review Anti-Patterns You Can Eliminate with AIの日本語訳です。
プルリクエストが大きすぎて十分にレビューできず、バグを見逃したことはありませんか。これは典型的なアンチパターンです。大量のコードを一度にレビューしようとすると、ミスを見落としやすくなります。小さく扱いやすい単位に分割すれば、後から問題に悩まされずに済みます。
コードレビューは、コードをクリーンで理解しやすく、保守しやすい状態に保つために行います。しかし、ときにはアンチパターンのような悪習慣が入り込むことがあります。一見役立ちそうな慣行でも、開発速度を落とし、コード品質を損ない、保守を難しくし、バグを生み、チームにストレスを与えます。
このガイドでは、コードレビューでよく見られるアンチパターンと、人工知能(AI)を使ってそれらに対処する方法を解説します。
アンチパターンはどのプログラミング言語にも存在します。ベストプラクティスとは対照的に、生産性を大きく損ない、貴重な時間を奪い、エラーの原因になります。ここでは、ソフトウェアエンジニアリングのコードレビューでよく見られるアンチパターンを紹介します。
God Class(God Object)
「God Class」は、一つのクラスに多すぎる責務を持たせたときに発生します。本来は小さく焦点を絞った複数のクラスに分けるべき処理を、一つのクラスに依存して実行する状態です。その結果、クラスが肥大化して保守しづらくなり、一箇所の変更が別の場所に意図しない影響を及ぼします。この構造は、バグ、コードの重複、技術的負債を生みやすくします。

スパゲッティコード
スパゲッティコードは、コード構造が複雑に絡み合い、ほとんど追跡できなくなった状態です。分岐が多すぎる、ループが深くネストしている、グローバル変数に依存しすぎているなどの理由から、レビューと保守が難しくなります。レビューサイクルが長引き、デバッグが困難になり、隠れた依存関係を通じて新たなバグが入り込む可能性もあります。
次は、構造が制御不能になっていく様子を示すGoコードベースのスパゲッティコードの例です。

細かな指摘とスタイルに関するフィードバック
コードレビューで発生しやすいもう一つのアンチパターンは、フォーマットや命名規則など、細かなスタイル上の問題に時間をかけすぎることです。一貫性は重要ですが、些細なスタイルの懸念に多くの時間を費やすと、レビューの本質から注意がそれ、全員の時間を無駄にします。レビューでは機能、アーキテクチャ、ロジックを優先し、フォーマットは自動化ツールや最後の調整に任せるべきです。
次は、JavaScriptコードベースでこのアンチパターンが発生する例です。

プリミティブ型への執着
プリミティブ型への執着は、文字列、整数、ブール値などの単純なデータ型で、より複雑な概念を表現したときに発生します。コードの読み取り、理解、拡張が難しくなり、値が本来持っている豊かな意味が失われるため、後から別の開発者が扱うのも困難になります。
型安全性と検証が不足して将来の変更が難しくなるだけでなく、技術的負債も増えます。いずれそのコードに戻り、リファクタリングする必要が生じるでしょう。
次は、Rustコードベースでこのアンチパターンが現れる例です。

ショットガン・サージェリー
ショットガン・サージェリーは、コードベースに一つの変更を加えるために、多数の異なる箇所を修正しなければならないアンチパターンです。多くの場合、システム全体で責務が適切に分散されていないことを示し、密結合で保守や拡張が難しいコードにつながります。
複数箇所の変更が必要になるため保守が複雑になり、バグのリスクが高まり、コードの再利用性とモジュール性が低下し、不整合が生じる可能性も高くなります。以下のコードスニペットは、Goコードベースでショットガン・サージェリーのアンチパターンが形成される様子を示しています。
この例でメール送信サービスにトラッキング機能を追加するには、Email構造体を更新する必要があります。

ロジック自体も更新する必要があります。

次に、タスクハンドラーを更新します。

最後に、デモ関数でメールサービスを使用します。小さな変更のために複数のファイルを巡って修正することが、ショットガン・サージェリーのアンチパターンを生みます。

次のセクションでは、CodeRabbitのようなAIツールが、コードレビューでこれらのアンチパターンを特定し、解消するうえでどう役立つかを説明します。
CodeRabbitは、反復作業を自動化し、潜在的な問題を特定して、的確な提案を行います。これにより、保守しやすいコードを書くことに集中できます。一般的なCI/CDツールやバージョン管理システムと統合できるため、既存のワークフローにも簡単に組み込めます。

上の図は、CodeRabbitがアンチパターンに対処し、デプロイ用のクリーンなコードを作れるようにすることで、コードレビュープロセスを効率化する流れを示しています。プロセスは、開発者が新機能を作成するかバグを修正し、非効率な処理やアンチパターンを含む可能性のあるプルリクエストを送信した時点から始まります。コードレビューの段階で、CodeRabbitがこれらのパターンを検出して解消し、通常ならレビューを遅らせる作業を自動化します。
それではCodeRabbitをセットアップし、ここまで説明したアンチパターンを解消してみましょう。
CodeRabbitのセットアップ
CodeRabbitのWebサイトに移動し、以下のように無料アカウントを登録します。

登録が完了するとダッシュボードが表示され、CodeRabbitと連携するリポジトリを追加できます。以下のようにAdd Repositoriesをクリックしてリポジトリを追加します。

次に、CodeRabbitとリポジトリの連携方法や動作をカスタマイズします。以下のようにOrganization Settingsメニューへ移動して、セットアップを完了します。

CodeRabbitの動作を確認するには、追加したリポジトリのいずれかでプルリクエストを作成します。CodeRabbitが、ソフトウェア開発体験を改善するためのコードレビューと提案を提供し始めます。リンターやCI/CDツールなど、既存のツールをコードレビューパイプラインに組み込む場合にも役立ちます。
CodeRabbitでGod ClassまたはGod Objectを解消する
CodeRabbitは、複雑で肥大化したクラスを特定し、スクリーンショットのように分割方法を提案します。クラスの複雑性を分析し、God Classを単一責任の原則に従う小さく焦点を絞ったコンポーネントへ分割することを推奨します。
コード行数やメソッド数が過剰な場合や、循環的複雑度が高い場合にも警告し、機能を扱いやすいクラスへ委譲できるようにします。

CodeRabbitでスパゲッティコードを解消する
CodeRabbitはロジックの流れを分析し、過度に複雑な部分を指摘することで、スパゲッティコードの整理を支援します。コード構造を改善するためのリファクタリング案も提示します。
大きな関数の分割、ネストした条件分岐のポリモーフィズムへの置き換え、反復ロジックの再利用可能なコンポーネントへの抽象化などを提案します。

細かな指摘とスタイルに関するフィードバックを解消する
スクリーンショットのように、CodeRabbitはスタイルとフォーマットのチェックを自動的に処理し、コードの一貫性を保ちます。その結果、コードのロジックや機能など、重要な部分に集中できます。スタイル上の問題も指摘するため、パフォーマンスとアーキテクチャに注力できます。

プリミティブ型への執着を解消する
CodeRabbitは、コードベース内のプリミティブ型への執着を検出し、プリミティブ型をドメイン固有の構造へ置き換えることを提案します。これにより、表現力と堅牢性に優れたコードになります。プリミティブ型の過剰使用を特定してリファクタリング案を提示し、ステータスコードへの列挙型の使用や、メールアドレス、通貨値といったドメイン概念へのカスタム型の使用など、型安全性を高める方法を推奨します。

ショットガン・サージェリーのアンチパターンを解消する
CodeRabbitは、結合に関する問題の修正案を提示します。依存関係を分析し、機能を一箇所に集約するためのリファクタリング戦略、システムを疎結合にするためのデザインパターン、コード構成の改善点、改善を実装するための自動リファクタリング方法を提案します。

ここまで説明したアンチパターン以外にも、コード品質やレビュープロセスの効率に影響する問題があります。
Lava Flow: 時間の経過とともに蓄積し、技術的負債を増やしてコードベースを散らかす、古く使用されていないコード。
Cargo Cult Programming: 理由を理解せずにパターンやツールを適用し、不必要な複雑性を生み出すこと。
Yo-Yo Problem: ロジックを理解するために複数のクラス間を行き来せざるを得ない、複雑な継承構造。
Magic Numbers: 定数を使わず、値をコードに直接ハードコードすることで、読み取りと保守が難しくなること。
CodeRabbitは、AIを活用した自動化とインテリジェントなリファクタリング提案によって、これらの問題を特定して解消できるように設計されています。コードレビューを効率化してこうしたミスを排除することで、技術的負債を減らし、コードをよりクリーンに保ち、全体的な保守性と拡張性を向上できます。
コードレビューにおけるアンチパターンは、開発を遅らせ、不必要な障害を生み、コード品質を損なう可能性があります。
人によるコードレビューだけでこれらのアンチパターンを特定する方法は、十分な効果を上げてきたとはいえません。しかし現在では、コードレビューツールに人工知能(AI)が導入され、アンチパターンを詳細に検出して排除できるようになっています。これにより、ソフトウェアアーキテクチャをより強固にできます。
CodeRabbitには、こうした問題を解決するための機能が揃っています。スタイルチェックの自動化から実行可能なフィードバックの提供まで、CodeRabbitはレビュープロセスを再構築し、クリーンで保守しやすいコードの提供に集中できるようにします。
CodeRabbitに登録して無料トライアルを開始し、AIをワークフローに組み込んでコードレビューを改善しましょう。