はじめに
「Javaの計算ロジックを直したけど、JSP側のJavaScriptも合わせて変えたっけ?」
業務システムの保守をしていると、こういう不安が頭をよぎる場面があります。特にJavaのBigDecimalで端数処理を変更したような場合、同じ計算式がJavaScript側にも存在していることがあり、両方を確認しないと本番環境で計算結果がずれてしまいます。
本記事では、複数ファイルのdiffをAIに読み込ませて「Java/JavaScript間の変更が整合しているか」を表形式で即座に確認するワークフローを紹介します。実際に受発注システムの割引計算ロジック変更で使ったアプローチです。
課題:言語を跨ぐ変更レビューの難しさ
二重管理が生む不整合リスク
JavaのサーバーサイドとJSPのJavaScriptが「同じ計算式」を持つ構造は、レガシーな業務システムでよく見られます。たとえば割引単価の計算を例にすると、次のような二重管理になっています。
// Java側(サーバーで最終金額を確定)
public BigDecimal getDiscountUnitPrice(BigDecimal retailPrice, BigDecimal discountRate) {
return retailPrice
.multiply(BigDecimal.ONE.subtract(discountRate.divide(HUNDRED, 2, ROUND_DOWN)))
.setScale(0, BigDecimal.ROUND_UP); // ← ここが端数処理
}
// JavaScript側(入力フォームのリアルタイム表示用)
function calcDiscountUnitPrice(retailPrice, discountRate) {
return Math.ceil(retailPrice * (1 - discountRate / 100)); // ← Java側と合わせているつもり
}
このケースで「Javaの端数処理を切り上げ→切り捨てに変更する」という修正が入ると、Javaは直したがJavaScriptは直し忘れるという事故が起きやすくなります。
目視確認のつらさ
ファイル数が増えると「変更を確認した/していない」の管理が属人化します。また、JavaのRounding Modeの定数名(ROUND_DOWN)とJavaScriptの関数名(Math.floor)は書き方が違うため、「同じ意図の変更が両側にある」を読み取るのに脳内変換が必要です。
アプローチ:diffをそのままAIに投げる
ポイント:「意図の整合性」を問う
単純に「何が変わりましたか?」と聞くだけなら、差分ビューアでも分かります。AIに任せる価値は言語をまたいだ意図の解釈にあります。
プロンプトの設計は次のように考えました。
以下のdiffを確認し、金額計算がどのように修正されたか分かりやすくまとめてください。
特に端数処理の変更について、Java側とJavaScript側で整合が取れているかを表形式で整理してください。
シンプルに見えますが、「Java側とJavaScript側の整合」という観点を明示しているのがポイントです。AIはコード意味を理解した上で、言語の書き方の差異を吸収しながら比較してくれます。
diffの渡し方
git diffの出力をそのままコピーして渡すだけです。事前の整形は不要です。
git diff HEAD~1 HEAD -- src/main/java/service/OrderService.java \
src/main/java/entity/Product.java \
src/main/webapp/WEB-INF/view/order/returnOrder.jsp
複数ファイルを一度に渡すことで、AIがファイル間の関係を文脈として理解した上で回答してくれます。
実践:プロンプトとAIの回答例
今回のdiff(サンプル)
実際に起きた変更を一般化したサンプルです。割引計算の端数処理が3箇所に渡って変更されていました。
--- a/src/main/java/entity/Product.java
+++ b/src/main/java/entity/Product.java
@@ -42,7 +42,7 @@
public BigDecimal getDiscountUnitPrice(BigDecimal retailPrice, BigDecimal discountRate) {
return retailPrice
.multiply(BigDecimal.ONE.subtract(discountRate.divide(HUNDRED, 2, ROUND_DOWN)))
- .setScale(0, BigDecimal.ROUND_UP);
+ .setScale(0, BigDecimal.ROUND_DOWN);
}
@@ -58,7 +58,7 @@
public BigDecimal getDiscountUnitPrice(BigDecimal retailPrice, BigDecimal discountRate, BigDecimal typDiscount) {
return retailPrice
.multiply(BigDecimal.ONE.subtract(discountRate.add(typDiscount).divide(HUNDRED, 2, ROUND_DOWN)))
- .setScale(0, BigDecimal.ROUND_UP);
+ .setScale(0, BigDecimal.ROUND_DOWN);
}
--- a/src/main/webapp/WEB-INF/view/order/returnOrder.jsp
+++ b/src/main/webapp/WEB-INF/view/order/returnOrder.jsp
@@ -215,7 +215,7 @@
-var discountUnitPrice = Math.ceil(salesPrice * (1 - (sRate + typRate) / 100));
+var discountUnitPrice = Math.floor(salesPrice * (1 - (sRate + typRate) / 100));
AIが返した比較表
上記のdiffを渡したところ、AIは次のような比較表を即座に生成しました。
| 変更箇所 | ファイル | 変更前 | 変更後 | 整合性 |
|---|---|---|---|---|
| 割引単価の端数処理(引数2つ版) | Product.java |
ROUND_UP(切り上げ) |
ROUND_DOWN(切り捨て) |
✅ JS側と一致 |
| 割引単価の端数処理(引数3つ版) | Product.java |
ROUND_UP(切り上げ) |
ROUND_DOWN(切り捨て) |
✅ JS側と一致 |
| 返品計算の端数処理 | returnOrder.jsp |
Math.ceil(切り上げ) |
Math.floor(切り捨て) |
✅ Java側と一致 |
さらにAIはこう付け加えました。
Java側の計算ロジックを切り捨てに統一したことで、後述のJavaScript側との整合を取る意図があると思われます。
getDiscountUnitPrice()の2つのオーバーロードで同じ修正が行われており、漏れはありません。
**「整合性の判断」と「意図の読み取り」**が一度の問いかけで得られています。これが単純なdiff比較との違いです。
得られた表の見方・活用
レビュアーへの説明が一瞬で終わる
「何を変えたか」の説明をこの表で済ませられます。コードを読まなくても変更の全体像が分かるため、レビュー依頼のコメントや社内チケットの説明文にそのまま貼れます。
✅/⚠️ で整合性を一目判断
整合が取れていない場合、AIは「⚠️ JavaScript側に同等の変更が見当たりません」と返してくれます。今回は全箇所で✅でしたが、仮に返品計算のJavaScript修正が漏れていたら、ここで検出できます。
応用:ソースファイルを渡して顧客向け仕様書を生成する
今回の作業ではもう一歩進んで、「変更後のソースから顧客向けの計算式説明資料を作る」にも活用しました。
プロンプト
添付のソースコードから、以下の金額を算出するための計算式と説明を作成してください。
顧客への説明が目的です。
1. 割引後商品単価
2. 割引後明細額合計
3. 返品額単価
AIの出力例
1. 割引後商品単価
計算式:
割引後単価 = 小売価格 × (1 − 割引率 ÷ 100) ※端数切り捨て(円未満)
例)小売価格 1,000円、割引率 15% の場合:
1,000 × 0.85 = 850円
設計者がコードを読み解いて言語化する工程が丸ごとAIに移ります。ロジックが修正されるたびに仕様書を手で直す必要もなくなります。
まとめ
今回のワークフローをまとめると次のとおりです。
-
git diffで複数ファイルの差分を一括取得する - 「Java側とJavaScript側の整合性を確認して」という観点を添えてAIに渡す
- AIが言語の差異を吸収しながら比較表を生成する
- 必要に応じてソースをそのまま渡して仕様説明資料も生成する
特別なツールは不要です。diffをコピペして貼るだけで、言語を跨いだ意図の整合確認が数十秒で終わります。
コードレビューの本質は「変更が正しいか」ではなく「変更の意図がシステム全体で一貫しているか」にあります。その判断をAIに一部委ねることで、レビュアーはより高度な設計判断に集中できるようになります。
言語を跨いだロジック変更の確認で悩んでいる方は、ぜひ一度試してみてください。