コードレビュー #3414
完了ND10070_開発_運賃契約区分情報 コードレビュー 第2段
0%
ファイル
渡邉 拓英 さんが約1年前に更新 · 編集済み
- ファイル clipboard-202509091010-o9qem.png を追加
リフレクションを多用しない!!!
「invoke」
→ ※配列の対応も合わせて対応する。
どうしてもの時で、今回は違う。
書けばいいだけ。

Java のリフレクションは非常に強力ですが、使い方を誤ると 保守性・安全性・パフォーマンス に悪影響を与えます。主な注意点をまとめます。
🔎 リフレクション利用時の注意点¶
1. カプセル化の破壊 ¶
- private フィールドやメソッドにアクセスできてしまう (
setAccessible(true))。 - 設計者の意図を無視してしまい、クラスの変更に弱くなる。
👉 本当に必要な場合以外は避ける。特にライブラリや外部クラスでは注意。
2. パフォーマンス低下 ¶
- 通常のメソッド呼び出しよりもオーバーヘッドが大きい。
- 頻繁に呼び出す処理(ループの中など)では顕著に遅くなる。
👉 キャッシュ(Method や Field オブジェクトの再利用)を行う、または MethodHandle や VarHandle を検討する。
3. 型安全性の欠如 ¶
- コンパイル時チェックが効かず、実行時に
ClassCastExceptionやNoSuchMethodExceptionが発生しやすい。 - ジェネリクスの情報も一部は消失しているため、誤用を検知できない。
👉 instanceof や null チェックを丁寧に行う。
4. セキュリティ制約 ¶
- セキュリティマネージャー(Java 17 で deprecated)やモジュールシステム(Java 9 以降)の制約により、アクセスが制限される場合がある。
- JDK 内部 API へリフレクションアクセスすると、Java 17+ では警告やエラーになるケースがある。
👉 公開 API で代替できないかを検討する。
5. モジュールシステムとの相性 ¶
- Java 9 以降、
--illegal-accessオプションなしでは内部パッケージにアクセスできない。 - 例えば
java.baseの非公開クラスにアクセスするとInaccessibleObjectException。
👉 opens 宣言や --add-opens オプションで対応が必要。
6. メンテナンス性の低下 ¶
- ソースコードを見ただけでは利用されているメソッドやフィールドが分からない。
- 将来のリファクタリング(メソッド名変更・シグネチャ変更)で簡単に壊れる。
👉 リフレクションは「最後の手段」として使う。
7. 代替手段の検討 ¶
-
ServiceLoaderやインターフェース + 実装クラスで代替できる場合が多い。 - フレームワークを使うなら、DI(Spring / CDI)を利用する方が安全。
✅ まとめ¶
リフレクションは便利ですが、
- 性能劣化
- 安全性低下
- メンテナンス性低下
といったリスクを伴います。
👉 「どうしても必要なケース(フレームワーク・ライブラリ内部処理など)」以外は極力避け、代替手段を検討するのがおすすめです。
ご希望なら、「安全にリフレクションを使うためのベストプラクティス(例:キャッシュ方法、例外処理のテンプレート)」 も整理できますが、見ますか?
渡邉 拓英 さんが約1年前に更新 · 編集済み
- ファイル clipboard-202509091334-vpdp5.png を追加
設計書に存在しない(且つ、使用しうる)IDを勝手に追加実装しない(設計・実装が合っていません。)
「ND1400065」以降の値全て
パターン1・・・実装したIDを全て設計書に記載する
パターン2・・・配列での実装にする
・項目が追加されたら、ND1400065を使用しますよね?
後から知って、最後のIDを調べる?PGを見る手間が必要がでますよね?NGです。
・明細に項目追加されたら、修正するのは、非常に大変ですよね?
・PG 各IDにコメントが無く、項目が不明です。→見てわからなくなりますよね?

そもそも、設計→実装で
どう書くべきか、不明(確信をもって実装できない)なら聞くべきです。
渡邉 拓英 さんが約1年前に更新 · 編集済み
- ファイル clipboard-202509241140-tyhfg.png を追加
- ファイル clipboard-202509241142-mts6m.png を追加
設計書と実装が異なる
設計書通りであれば、1~??までループする
実装では、0~??までループする
そもそも「プロパティ.契約方面データを読み込み、以下をループする。」で何回ループするか明記されていない。
→無理な拡大解釈 なぜhomenKosuまでのループと判断できたか???
PL/1 配列のインデックスは「1」から開始
Java 配列のインデックスは「0」から開始(現代的な言語はすべて。リビルド後の設計書はこれを基本とする)
→参照するインデックスを実装レベルで勝手に変えない
※N件目やXXXX[i]などについて、辻褄を合わせるのはよいが、
カウントアップの処理を改変するのはNG
設計書通りなら
0から始めてカウントアップする→照会する場合カウンタ-1でアクセスすべきでは??
その後の処理でカウンタを違う使い方をするかもしれない
・全体を読まないと合っていると判断できなくなる。可読性が悪い(NG)
・処理の辻褄が合わなくなる可能性が出る(NG)
・修正時の設計書通りに直せなくなる(NG)
実装を直すべきか?
設計書を直すべきか?


渡邉 拓英 さんが約1年前に更新 · 編集済み
- ファイル clipboard-202509241322-070ro.png を追加
下記の処理は設計書のどこの内容か?

これでダメなのか?
for (int i = 0; i < 20; i++) {
kousinArrayKosu[0] = toInt(getFormValue("ND1400012", form, 1));
}
記述が無駄に長い
画面レイアウトの処理の流れを追いにくい
→コーダーとして、工夫すべきポイント。
動けばいい・・・初心者
長々と記述する必要があるなら、メソッドに切り分けるべき。
コーディング初心者とベテランの違いは、単に「コードが書けるか書けないか」ではなく、考え方・習慣・質の差にあります。順に整理してみます。
1️⃣ コードの書き方¶
| 項目 | 初心者 | ベテラン |
|---|---|---|
| 変数・関数名 | 適当・短くて意味が分かりにくい(例: x, len) |
意味が明確で一目で役割がわかる(例: contractCount) |
| コメント | 少ない or 多すぎる | 必要な箇所に的確、読んで理解できる |
| 冗長さ | 同じ処理を繰り返し書く | 共通化して再利用、関数化 |
| ネスト | 深くなりがち | ネストを浅く保つ、早期リターンで整理 |
2️⃣ 設計・構造の理解¶
| 項目 | 初心者 | ベテラン |
|---|---|---|
| 処理の分離 | 1つのメソッドに全部書きがち | 関心ごとごとにクラス・メソッドを分離 |
| 依存関係 | 無計画に他のクラスを呼び出す | 依存注入・設計パターンで整理 |
| 再利用性 | 書き直すことが多い | 汎用的に使えるように設計 |
3️⃣ デバッグ・保守性¶
| 項目 | 初心者 | ベテラン |
|---|---|---|
| バグ発見 | 試行錯誤で探す | 想定される原因を順序立ててチェック |
| ログ・例外 | 最小限 or 過剰 | 適切に出力、障害時も原因特定しやすい |
| 将来対応 | 修正が大変 | 変更しやすい設計、テスト容易 |
4️⃣ 思考の違い¶
-
初心者
- 「とりあえず動くコード」を書く
- 実装重視で全体像はあまり考えない
-
ベテラン
- 「動かすだけでなく維持できるコード」を書く
- 仕様・性能・拡張性・テストを意識
💡 まとめ
- コーディングスキルは「コードを書く速さ」だけでなく、「読みやすさ・保守性・設計の深さ」に現れる
- ベテランほど「未来の自分や他人が読むこと」を意識して書く
もし希望なら、初心者がベテランっぽく見える 具体的コーディングの改善例 を短いサンプルで示すこともできます。
やってほしいですか?
渡邉 拓英 さんが約1年前に更新 · 編集済み
- ファイル clipboard-202509241520-trgf1.png を追加
- ファイル clipboard-202509241520-qv3vp.png を追加


コメントを消さない
「『DB更新仕様 運賃基本情報更新時(上限区分) 参照』」
メソッド名
「updateSTVKCUN1WJyougenKbn」
CommAreaを更新するニュアンスが入ってない
http://10.104.253.197/projects/3-dos/wiki/%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E5%90%8D
渡邉 拓英 さんが約1年前に更新 · 編集済み
- ファイル clipboard-202509241526-6nzyh.png を追加
- ファイル clipboard-202509241527-btagq.png を追加


テーブル名:「COMM_AREA明細.ND10050.COMM_VKCUN1W」とは?
存在しない
勝手に空気を読んで実装しない。→設計者にQA(設計書修正)すべき内容
そもそも「マッピング仕様」に書くべき
COMM_AREA明細.ND10050.COMM_VKCUN1W[顧客マスタ(運賃基本情報)_変更情報]を更新する。
『DB更新仕様 運賃基本情報更新時(上限区分) 参照』
マスタメンテ更新データを設定する 『マッピング仕様 運賃基本情報更新時(上限区分) 参照』
COMM_AREA明細.ND10050.COMM_VKCUN1W[顧客マスタ(運賃基本情報)_変更情報] ← マスタメンテ更新データ
下記も同じ
COMM_AREA明細.ND10050.COMM_VKCUN2W[顧客マスタ(運賃方面別情報)_変更情報]のデータ行数分、
COMM_AREA明細.ND10050.COMM_VKCUN2W[顧客マスタ(運賃方面別情報)_変更情報]を更新する。
『DB更新仕様 運賃方面別情報更新時(上限区分) 参照』
渡邉 拓英 さんが約1年前に更新 · 編集済み
- ファイル clipboard-202509241545-t3iuh.png を追加
- ファイル clipboard-202509241545-yfo9b.png を追加


「処理を終了する。」とは?
ルールでは、どのように実装するかわからないと思うが
なぜこの実装になったのか?
何度も言っているが、勝手に(仕様の妄想して)実装しない
「設計書→誰でも同様に動くように記載する」がルール
下記どこから出て来たのか????
// 画面の項目表示を更新
checkQuitReview(form, bindingResult, model, httpSession, stvkcun1w);
渡邉 拓英 さんが約1年前に更新 · 編集済み
- ファイル clipboard-202509241602-m7i80.png を追加
- ファイル clipboard-202509241603-dbf0g.png を追加
- ファイル clipboard-202509241604-ar1aj.png を追加
方面コード いろいろNG


「2次元配列」とは記載していない→実装と設計が合っていない

「更新FLG」とは?
勝手に2次元配列にしない
インデックスが具体的に指定されている。勝手に変えない
ちなみに「プロパティ.方面コード(変数.ループカウンタ).更新FLG ← "DEL"」と言う表現を尊重すると
new String[2][45];・・・×
new String[45][2];・・・せめてこっち
0・・・方面コード
1・・・更新FLG
勝手に決めない コメントが無い 自己満足で終わっていませんか?
構造体、Mapなどの配列では? 妄想しない!!!
何度も言うが勝手に実装しない
動くように作る・・・今回のゴールではない
設計書通り作る(設計書の辻褄も合っている)がゴール
渡邉 拓英 さんが約1年前に更新 · 編集済み
- ファイル clipboard-202510141504-8ptjj.png を追加
- ファイル clipboard-202510141504-ymfx7.png を追加
- ファイル clipboard-202510141505-goqnz.png を追加


結局、最終行が採用されるで合っているのでしょうか?

こちらは、先頭のようですが・・・
「画面.選択に"U" OR "R" OR "X" が入力されている行」が複数あった場合、どうなるのでしょうか?
設計書からは読み取れませんが。
「画面.選択の入力値で処理を分岐。」
からも、先頭行を使用する内容はありません。
ちなみにカンマ編集は
String[] arr = {"apple", "banana", "cherry"};
String result = String.join(",", arr);































