この記事のポイント

  • データ構造変更に伴う影響範囲調査責任をレビューアー視点で整理
  • 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で設計責任整理

UML Diagram

観点チェックリスト

実務レビューFAQ

Q1. 保持型露出はなぜ悪?
→ 内部構造交換不能になる。設計硬直最大要因。

Q2. 呼出側でfind_ifは問題?
→ 操作APIで昇格提供する方が設計文化的に良い。

Q3. 順序保証はどこまで契約化?
→ 保証不要なら「順序保証対象外」と明文化。

Q4. 性能特性変更は件数閾値で判断?
→ 目安は1,000〜10,000件超えで見直し検討。

Q5. 構造変更レビューは開発文化?
→ 保守設計文化そのもの。レビューの最重要観点。

まとめ

データ構造変更レビューは保守設計文化の核心教材である。
レビューアーは

  • API契約安定化責任
  • 呼出側影響波及評価責任
  • 順序保証整理責任
  • 性能特性変更影響評価責任

を読み解き、「変更に耐えられる文化」をレビュー技術として育成する必要がある。
レビューアーが構造変更影響整理レビューを体系化できると設計品質は飛躍的に向上する。