C++レビュー|データ構造変更による影響範囲調査と設計責任整理レビュー技術
この記事のポイント
- データ構造変更に伴う影響範囲調査責任をレビューアー視点で整理
- API契約整理、依存性分離、スケーラビリティ保証、呼出側影響分析のレビュー観点を体系化
- 保守性文化形成のレビュー技術を育成
そもそもデータ構造変更の影響とは
データ構造を変更する設計変更には必ず副作用が伴います。
- 内部保持構造の違い → vector → map → unordered_map
- APIの表面型への波及
- アルゴリズム適用可能性の変化
- スケーラビリティ特性の変動
- メモリ消費・順序性・探索速度特性の変化
- 「型を変えただけ」では済まない
- 影響範囲調査は構造責任整理の訓練場
なぜこれをレビューするのか
レビューアー視点
データ構造変更レビューは以下の責任整理が問われます。
-
API契約影響整理責任
→ 呼出側への型露出の有無確認 -
依存性波及評価責任
→ 保持構造に依存したロジック有無確認 -
性能特性変動整理責任
→ O(N)→O(logN)→O(1)変化に伴う設計確認 -
スケーラビリティ保証責任
→ 今後の件数成長特性評価 -
テスト保証責任
→ 既存テストケース妥当性確認 -
文化形成責任
→ 構造隠蔽文化が育成されているか確認
開発者視点
- 内部型をそのままAPI契約型にしてしまう
- vectorからmapに切り替えて呼出側大混乱
- find_if → map::find書き換え文化衝突
- 順序保証変化をレビューで見逃す
- スケール特性評価せず採用
レビューアーはこれら「構造安直変更文化」をレビュー段階で教育・是正します。
良い実装例(構造隠蔽型設計)
ユースケース:APIログ検索最適化でmap導入
良い実装例:API契約安定型設計
#include <map>
#include <string>
struct ApiRequestLog {
std::string requestId;
int responseCode;
};
class ApiRequestLogRepository {
public:
void add(const ApiRequestLog& log) {
logsById_[log.requestId] = log;
}
const ApiRequestLog* findById(const std::string& id) const {
auto it = logsById_.find(id);
return (it != logsById_.end()) ? &it->second : nullptr;
}
private:
std::map<std::string, ApiRequestLog> logsById_;
};- 呼出側は保持構造変更を全く意識不要
- API契約安定性が極めて高い
- 内部構造変更は影響範囲最小化可能
レビュー観点
- 保持構造変更がAPI契約に波及していないか
- find_if等を呼出側に委譲していないか
- 性能特性変更が件数規模に合致しているか
- 順序保証の要否がレビューで整理されているか
良くない実装例: ケース1
以下は保持型そのままAPI契約に露出している例。
型露出契約例
const std::vector<ApiRequestLog>& getLogs() const { return logs_; }
@Reviewer保持型がAPI契約化すると将来map等への構造変更が不可能になります。構造隠蔽型設計へ切替えてください。
問題点
- vector型依存が呼出側に定着
- 保守不能API契約
改善例
修正例:操作抽象化
const ApiRequestLog* findById(const std::string& id) const;良くない実装例: ケース2
次は保持構造を変えたが検索APIを呼出側に委譲している例。
呼出責任委譲例
const std::map<std::string, ApiRequestLog>& getLogMap() const;
@Reviewer呼出側にfind責任が露出しています。検索APIを操作提供で整理してください。
問題点
- 呼出側がmap特性に依存
- 保持構造に引きずられたロジック増殖
改善例
修正例:検索操作昇格
const ApiRequestLog* findById(const std::string& id) const;良くない実装例: ケース3
次は構造変更に伴い順序保証責任が崩壊している例。
順序保証消滅例
// 以前はvectorで投入順序保証されていた
// mapに変更しソート順序に変更された
@Reviewer呼出側が順序保証依存していないかレビュー確認が必要です。
問題点
- 順序保証変更をレビュー不感知で通過
- 呼出側設計が事後破壊されるリスク
改善例
修正例:順序保証文化明文化
「順序保証は契約外」とAPI設計文化で明文化構造変更影響整理フレームワーク
① 契約型依存評価
| 項目 | 影響有無 |
|---|---|
| API型に保持型露出 | 重大 |
| 操作API提供型 | 軽微 |
② 性能特性変更評価
| 処理 | 特性 |
|---|---|
| vector | O(N) |
| map | O(logN) |
| unordered_map | O(1)(理想) |
③ 順序保証評価
- vector: 挿入順保持
- map: ソート順
- unordered_map: 順不同
PlantUMLで設計責任整理
観点チェックリスト
実務レビューFAQ
Q1. 保持型露出はなぜ悪?
→ 内部構造交換不能になる。設計硬直最大要因。
Q2. 呼出側でfind_ifは問題?
→ 操作APIで昇格提供する方が設計文化的に良い。
Q3. 順序保証はどこまで契約化?
→ 保証不要なら「順序保証対象外」と明文化。
Q4. 性能特性変更は件数閾値で判断?
→ 目安は1,000〜10,000件超えで見直し検討。
Q5. 構造変更レビューは開発文化?
→ 保守設計文化そのもの。レビューの最重要観点。
まとめ
データ構造変更レビューは保守設計文化の核心教材である。
レビューアーは
- API契約安定化責任
- 呼出側影響波及評価責任
- 順序保証整理責任
- 性能特性変更影響評価責任
を読み解き、「変更に耐えられる文化」をレビュー技術として育成する必要がある。
レビューアーが構造変更影響整理レビューを体系化できると設計品質は飛躍的に向上する。
