AI時代にクリーンコードを保つために知っておきたい「単一責任原則」
1.この記事の概要
AI利用の拡大によって、あらゆる人の可能性を肯定できる時代になったことはとても良いことです。ただし、その可能性と背中合わせのように、未習熟者に数々の落とし穴が用意されているのも事実です。
そこで、今回はコーディングを行う際に最低限押さえておきたい単一責任原則の考え方について取り上げ解説していきます。
多くの人にとっては当たり前に感じるかもしれませんが、基本のキということでご容赦ください。
2.そもそもクリーンなコードとは
自身もAIを利用してコーディングを行うことがあります。その中で、なぜかAIが理想的なコードを書いてくれない。エラーが解決しない。などの壁に当たることがあります。
これはプロンプトの質、会話量が膨大になっている、など様々な要因がありますが、大きな要因としてコードがクリーンな状態を保てていないことがあります。つまり以下のクリーンなコードを記述するための3原則が守られていないのです。
- 可読性
- 人間が読みづらいと感じる時、AIもまたそのコードを理解することが難しいと考えられます
- 保守性
- 完成物に新たな変更を加える時、修正箇所が限定されていればいるほど、AIはそれを容易に行うことができます。
- 効率性
- 不必要なコードやロジックを省くことで、AIは惑わされずに修正を実行することができます。
ある論文でAIは人間のデータを元にしていることが起因して、人間が持つような「認知バイアス」を持つ傾向が示唆されています。
すなわち、AIとうまく付き合うことを考えるということは、人間とうまく付き合う、という側面を持つわけです。(極論ですが)
よって、これまで人間の間で培われてきた、継続性、効率性、安定性を担保するための原理原則を押さえ、その上でAIと対峙することは重要だと認識しておきましょう。
3.単一責任原則とは
単一責任原則(SRP)は、オブジェクト指向設計における有名な「SOLID原則」の一つで、Robert C. Martin(“Uncle Bob”)によって提唱されました。
「クラス(またはモジュール)は、たった一つの責任(役割)だけを持つべきであり、その責任を果たす理由(変更の理由)は一つだけである」 という考え方がその中心です。
単一責任原則をが守られていない状態とは?
例:レストランのキッチン
SRP違反のキッチン
- 1人のシェフが「仕込み・調理・盛り付け・配膳・会計」すべてを担当。
盛り付けに変更を加えたい時、この1人のシェフがどのような手順で何を実行しているのか?を把握し、必要に応じて関係する手順の修正が必要になります。
SRP準拠のキッチン
- 下ごしらえ担当 → 食材のカット・下処理だけ
- 調理担当 → レシピ通りに火を通すだけ
- 盛り付け担当 → 美しく皿に盛るだけ
- 配膳担当 → お客様に運ぶだけ
- 会計担当 → お会計を処理するだけ
盛り付けに変更を加えたいとき、盛り付け手順だけ追加する。その時下ごしらえ・調理・配膳・会計 各担当は何も変更せず、普段どおり作業を行うことができます。
この例だと1人のシェフでさほど変わらないのでは?と感じる人もいるかもしれません。しかし、実際のコードが数百行の及んだ場合、AIは1人のシェフが持つ役割全体を理解できずに、誤った箇所に修正を加えることになるでしょう。
4.単一責任原則を守らないことで発生しうる問題
では単一責任原則を守らない場合、どのような問題が発生しうるのか?
実際にAIを用いたコーディング時に、「あれなんでここも修正されてしまったのだろう」と感じる場面に出くわすことも少なくないと思います。
この不本意な意図しない修正は主に生成AIの技術的仕様を背景に、単一責任原則が守られていない場合に発生しています。
1. 誤った機能の編集
-
例
「注文処理だけ直してほしい」と依頼したのに、同じクラス内のメール送信や税計算まですべて書き換えられてしまう。 -
原因
クラスが複数機能を抱え込んでいるため、AIが「修正対象の境界」を見失う。 -
技術的背景
生成AIはコード全体を埋め込みベクトルとして扱い、類似度の高い部分をまとめて操作する。責任が混在すると、どの処理が主目的か区別できず、関連機能まで一括で変更してしまう。
2. 冗長・不要コードの残存
-
例
「不要な部分を削除して」と頼んだのに、関係のないロジックを残しつつ、逆に必要な処理を消して動作がおかしくなる。 -
原因
役割が曖昧で、AIが「何が不要か」を正しく判断できない。 -
技術的背景
トランスフォーマーモデルは学習データの頻出パターンを優先しやすい。範囲が不明瞭だと「安全策」として見慣れたコードを残したり、逆に重要部分を誤って削除したりしてしまう。
3. コンテキスト喪失による誤実装
-
例
大きなクラス全体を一度にプロンプトに投げたため、重要な指示がコンテキストウィンドウから漏れ、意図しないコードが生成される。 -
原因
単一責任原則を無視してコードが肥大化し、AIの扱える情報量を超過してしまう。 -
技術的背景
生成AIには「コンテキストウィンドウ」と呼ばれるトークン数の上限があり、超過すると先頭から情報が切り捨てられる。attention機構で参照できない情報を自己補完しようとして、意図と異なる実装を出力してしまう。
5.単一責任原則を守る実践的な手法
単一責任原則を守るために、という文脈で様々な情報がすでに存在している。それ自体は添付のリンクに飛んでもらえれば良いと思います。
実際には最低限下記の手順を実行することで防ぐことができるものが多いと思います。
- 機能構築時:ある機能に関して作成するとき、プロンプトの最後に明示的に「単一責任原則に留意しながら構築して」と含める
- 機能構築完了時①:問題なく動くことが確認できたあとに、作成・編集されたファイルを対象に「単一責任原則に違反している箇所を洗い出し、修正して」と加える
- 機能構築完了時②:1つのファイルに含まれるコードの行数が150行以上(目安)になっていないかを都度確認する。
表面的な対応にはなりますが、これらを実施する中で、「もっとより良くするには?」「これであっているのだろうか?」と考え出すと思います。その際には改めてより良い文献などを調べてみてください。
6.最後に
生成AIによってあらゆる人にあらゆる可能性が与えられたこと自体は褒められるべきです。ただし、それが、努力を伴わず楽に何かを実現する手法として、また、無知であるが故に思わぬ過ち生む装置として、働いてしまうことは悲しいです。
せっかくの時代の変わり目に、その波にうまく乗れる人が増えてくれれば嬉しい限りですし、それを私も楽しみにしています。
Discussion