状態管理が複雑化する構造:見えない依存がプロダクトを静かに重くする
状態管理は、立ち上げ期ほど「問題として見えない」領域です。状態の種類も更新経路も少なく、どこで値が変わり、どこでUIに反映されるかを頭の中で追えます。少数の画面・少数のデータで動いている間は、多少の密結合や一時的なフラグの混在があっても、影響範囲が狭いので吸収できてしまう。だからこそ「増えたら整理すればよい」という判断が成立し、実装は自然に“目の前の便利さ”へ寄ります。ここで起きているのは怠慢というより、初期条件が素直すぎて、構造的なリスクが表に出ないことです。
ところが機能が増えるにつれて、増えるのは状態の数だけではありません。状態同士の依存、更新の起点、副作用の発火条件、寿命の違いが少しずつ混ざり、変更のたびに「どこまで影響するか」を読まなければならなくなります。重さとして感じる正体は、データ構造の肥大化そのものというより、「接続の増殖」と「可視性の低下」です。更新が一方向に流れていたはずなのに、イベントや監視ロジックが横断し始め、更新順序や整合性が暗黙の前提として散らばる。設計意図がコードから復元できなくなると、理解は設計ではなく探索に変わり、開発者は“実装する前に調べる時間”を払い続けることになります。
本記事では、この「あとから重くなる」現象を、ツール選定や個別のベストプラクティスの話に回収せず、構造の観点から分解します。依存方向、責務と境界、ライフサイクルとスコープという三つの軸で見ると、似た症状でも原因が違うこと、そして対処のレバーがどこにあるかが整理できます。重要なのは、状態を単に減らすことではなく、状態が増えても破綻しない配置と接続を作ることです。状態管理を「実装の工夫」ではなく「変更の影響を制御する設計」として捉え直すと、日々の小さな判断が将来の重さへ変換されるメカニズムが見えやすくなります。
1. なぜ状態管理は「あとから」重くなるのか
状態管理の問題は、最初から複雑であることはほとんどありません。むしろ立ち上げ段階では、状態は少なく、責務も比較的明確で、「どこに何があるか」は直感的に把握できます。状態の更新経路も短く、UIの反映も追いやすいので、「増えたら整理すればいい」と思えてしまいます。ところが機能追加、仕様変更、UI改善といった小さな積み重ねが続くうちに、状態は徐々に増え、その配置も拡散していきます。そしてある時点で、「なぜこんなに把握しづらいのか」という違和感が表面化します。この違和感は、状態の総数そのものよりも、状態同士の結びつきと更新経路が見えなくなったことから生まれます。
状態管理が重くなるのは、特定の誰かが「間違った設計」をしたからではありません。日々の実装判断は多くが合理的で、短期的には正解に見えます。しかしその合理が連鎖し、接続が増え、境界が溶け、寿命が混ざり、やがて構造が「説明できない形」に変化していきます。重さは突然やってくるように見えて、実際には「見直されなかった接続」が静かに利息を積み上げた結果として現れます。
1.1 局所最適の積み重ねが全体最適を壊す
日々の開発では、目の前の課題を最短距離で解決する判断が優先されます。新しい画面に必要なフラグを追加する、既存コンポーネントから値を参照できるようにする、イベントに応じて状態を書き換える――いずれも合理的な判断です。しかもその瞬間は「動く」し、レビューも通りやすく、リリースにも間に合う。局所の最適化は、短期の速度を守るための自然な行動として発生します。
問題は、それらの判断が「全体の状態構造」にどのような影響を与えるかが意識されないまま蓄積されることにあります。ある状態が別の状態に依存し、その依存がさらに別のロジックに波及していくと、依存関係は木構造ではなく網目状になります。この段階に入ると、変更の影響範囲は直感で追えなくなります。状態の数が増えたこと自体よりも、「接続」が増えたことが重さの正体です。接続が増えるほど、更新順序・整合性・副作用の発火条件が絡み合い、設計意図がコードの外に残っていなければ、理解は探索へ変質します。
1.2 「共有すれば楽」という錯覚
複数の画面や機能で同じデータを扱う必要が出てきたとき、状態を共有領域に引き上げる判断は自然です。確かに短期的には参照が容易になり、データの受け渡しも簡潔になります。propsのバケツリレーが消え、同じ値を複数箇所に持たなくて済むように見えるため、設計として前進した感触も得られます。そのため共有は、実務の圧力下で「最も勝ちやすい」選択肢として採用されがちです。
しかし共有範囲が広がるほど、その状態は「公共財」になります。公共化した状態は、どこからでも読み書きされる可能性を持ちます。結果として、変更のたびに「他に影響はないか」を確認する必要が生まれます。最初は二つの画面だけだった依存が、気づけば五つ、十へと広がっていることも珍しくありません。共有は利便性をもたらしますが、同時に責任範囲を曖昧にします。誰が守るべき状態なのかが不明確になった瞬間から、管理コストは上昇し始めます。ここでのコストは実装量ではなく、影響調査と安心のための確認作業として現れます。
1.3 成功体験が構造を固定化する
初期設計でうまくいった構造は、そのまま拡張されやすい傾向があります。「このやり方で問題なかった」という成功体験は、再検討の機会を奪います。成功体験は「同じ型を繰り返すほど安全」という学習を生み、設計の問いを減らします。立ち上げ期は状態が少ないため、多少の歪みがあっても表面化しにくく、そのままの型が「標準」になっていきます。
しかしプロダクトが成長すれば、前提条件は必ず変わります。ユーザー数、画面数、データ量、チーム人数。これらが増加すれば、本来は状態の配置や責務の分離も見直されるべきです。それでも構造が更新されない場合、拡張は既存の枠組みに無理やり押し込まれます。その結果、本来分離されるべき状態が同じコンテナに残り続けたり、役割の異なるロジックが同一レイヤーに共存したりします。過去の合理性が、現在の足かせになる瞬間です。状態管理が「あとから」重くなるのは、小さな正解が積み重なり、再設計の機会が失われた結果として、構造が静かに肥大化するからです。
2. 複雑化を生む三つの構造要因
状態管理が重くなる背景には、単なる実装ミスではなく、構造レベルでの歪みがあります。状態の数そのものよりも、どのように配置され、どの方向に依存し、どの境界で管理されているかが問題の核心です。つまり「何があるか」より「どう繋がっているか」「誰が持つべきか」「いつまで生きるべきか」が未定義なまま拡張されると、複雑さは自然に増幅します。ここでは、実務で繰り返し観察される三つの構造要因を整理します。
まず全体像を一枚で押さえると、議論が散らかりにくくなります。下の表は、三要因が何を壊し、どんな症状として現れやすいかを対応づけたものです。
| 構造要因 | 壊れるもの | 現れやすい症状 |
|---|---|---|
| 依存方向が未定義 | 影響範囲の予測可能性 | 小修正が広範囲に波及、循環・副作用が増える |
| 責務と境界が曖昧 | 「誰の状態か」の説明可能性 | 重複状態・同期ロジック・例外分岐が増える |
| ライフサイクルとスコープ不整合 | 状態の寿命の一貫性 | 初期化タイミング不明、古い値・競合・順序バグが出る |
2.1 依存方向が定義されていない
健全な構造では、依存の流れが明確です。たとえば「上位が下位を参照する」「入力から出力へ一方向に流れる」といった原則が保たれています。しかし状態管理が複雑化しているプロジェクトでは、この依存方向が曖昧になりがちです。画面都合で近道を作り、便利な参照が増え、イベントや副作用が横断するほど、依存の流れは見えなくなります。依存方向が曖昧な状態は、拡張とともに必ず「どこからでも触れる」状態へ近づきます。
あるコンポーネントがグローバル状態を参照し、その更新結果を別のモジュールが監視し、さらにその副作用が元のコンポーネントの挙動に影響する、といった循環が生まれます。このとき依存は直線ではなくループになります。ループ構造では、変更の影響が予測できません。ひとつの修正がどこまで波及するのかを、コードを読まずに判断することが不可能になります。依存方向を定義しないということは、設計上の重力が存在しないということです。重力がない構造は、拡張が進むほど接続が増え、必然的に不安定になります。
2.2 責務と状態の境界が曖昧
「この状態は誰のものか」という問いに即答できない場合、構造はすでに揺らいでいます。画面固有の一時的なフラグがアプリ全体のストアに置かれていたり、逆に複数画面で使うべきデータがローカルに閉じ込められていたりすると、整合性維持のための処理が増えます。境界が曖昧だと、状態の置き場所が「便利さ」で決まり、結果として責務がコードのあちこちに散りやすくなります。
境界が曖昧なまま拡張が続くと、同じ意味を持つ状態が複数箇所に分散します。たとえば「ログイン済みかどうか」という情報が、APIレスポンス、セッション管理、UI表示制御の三箇所で別々に保持されると、どれか一つが更新されなかっただけで不整合が発生します。その不整合を補正するための条件分岐が追加され、ロジックはさらに肥大化します。状態の境界とは、責務の境界です。責務が曖昧であれば、状態もまた曖昧に拡散します。そして拡散は、必ず同期と例外処理の増加としてコスト化されます。
2.3 ライフサイクルとスコープの不整合
状態には寿命があります。画面表示中だけ必要なものもあれば、セッション全体で維持すべきものもあります。にもかかわらず、そのライフサイクルを意識せずに配置すると、不要な再利用や過剰な保持が発生します。寿命が合っていない状態は、消えるべきときに消えず、残るべきときに残らず、結果として「今この値は正しいのか」という疑いを常に生みます。
短命な状態が長寿命のコンテナに置かれると、削除タイミングが曖昧になります。結果として「いつ初期化されるのか分からない状態」が残り続けます。一方、本来共有すべき状態をローカルに置いた場合、各所で同期処理が必要になり、更新順序のバグが生まれます。スコープとライフサイクルが一致していない構造では、状態は必要以上に広く、あるいは長く存在します。それはメモリ消費の問題だけではなく、認知負荷の問題です。開発者は常に「この値は今も有効か」「どこで作られ、どこで捨てられるか」を考え続けなければなりません。
これら三つの要因に共通しているのは、状態そのものではなく「構造の曖昧さ」です。依存方向が曖昧で、責務の境界が曖昧で、寿命の定義も曖昧であれば、状態管理は自然に複雑化します。複雑さは偶発的に発生するのではなく、構造の未定義な部分から静かに増幅していくのです。
3. フレームワークは解決してくれるのか
状態管理が複雑になり始めたとき、多くのチームが最初に検討するのは「より強力なツール」の導入です。新しい状態管理ライブラリ、より洗練されたアーキテクチャパターン、厳格な型システム。確かにこれらは一定の整理効果を持ちます。特に、更新方法や購読方法が統一されるだけでも、混乱が一時的に減ったように見えます。しかし、ツールの導入そのものが構造問題を解決するわけではありません。
むしろ構造が曖昧なままツールを重ねると、問題は抽象化の奥に隠れます。見えなくなった複雑さは、消えたのではなく、把握しづらくなっただけです。表面上は整っていても、責務が混ざり、依存が循環し、寿命が合わない状態が残っていれば、変更コストは下がりません。結果として「ライブラリを変えたのに重い」という体感が残り、次のツール探しへ進んでしまいます。
3.1 ツールは構造を代替しない
状態管理ライブラリは、「どう更新するか」「どう購読するか」という操作の仕組みを提供します。しかし「どこに置くべきか」「誰が所有すべきか」「どこまで共有すべきか」という設計判断までは決めてくれません。つまりツールは手段を整えてくれますが、責務境界や依存方向の決定という「問い」自体は残り続けます。問いを放置したまま手段だけ強化すると、強い手段で迷うことになります。
たとえば、グローバルストアを導入すれば状態の集約はできます。しかし責務が整理されていなければ、単に「巨大な箱」ができあがるだけです。箱の中に何が入り、誰が触れるのかが定義されていなければ、依存関係は依然として拡散します。設計が曖昧な状態でツールを導入すると、整然と並んだインターフェースの裏で、論理的な結合が増え続けます。コードはきれいに見えても、変更コストは下がりません。「箱を整える」より先に「箱に入れるべき責務」を決めなければ、根本は変わりません。
3.2 抽象化が可視性を下げることもある
抽象化は本来、複雑さを局所化するための手段です。しかし抽象化の層が増えると、状態更新の経路は見えにくくなります。どこで値が書き換えられ、どのコンポーネントが再評価され、どの副作用が発火するのか。その流れが追えなくなったとき、デバッグは困難になります。抽象化が「境界の固定」ではなく「経路の隠蔽」として機能し始めると、理解は探索へ落ちていきます。
とくにイベント駆動やリアクティブな仕組みでは、更新のトリガーが分散します。「直接呼び出していないのに値が変わる」という状況は、開発者の認知負荷を高めます。これはツールの問題ではなく、抽象化と依存の設計が噛み合っていないことが原因です。抽象化は境界を明確にするために使うべきものであり、境界が曖昧なまま積み上げれば、かえって不透明さを増幅させます。見えない複雑さは、解決されたのではなく、追跡コストに変換された複雑さです。
3.3 パターン導入が思考停止を生む瞬間
Flux、Redux的な一方向データフロー、MVVM、クリーンアーキテクチャなど、さまざまなパターンが存在します。これらは有効な指針ですが、「採用した」という事実が安心材料になった瞬間、設計の再検討は止まります。パターンは思考の型であって、思考の代替ではありません。型を入れたことで「もう大丈夫」と感じると、接続や責務の歪みが残っていても見逃されやすくなります。
パターンは前提条件のもとで機能します。チーム規模、アプリケーションの性質、変更頻度。それらが変化すれば、適切な構造も変わります。しかし形式だけを守り、中身の接続設計を見直さなければ、パターンは形骸化します。結果として、状態は「パターンに従って」管理されているにもかかわらず、依存は複雑なまま残ります。フレームワークやライブラリは、構造を整えるための道具です。しかし構造そのものを定義するのは、設計判断です。道具を変える前に問うべきなのは、「この状態はなぜここにあるのか」という一点です。その問いに答えられない限り、どんなフレームワークを導入しても、重さの本質は変わりません。
4. 兆候として現れるサイン
状態管理の複雑化は、ある日突然「崩壊」という形で現れるわけではありません。むしろ、日常の違和感として静かに現れます。開発は一応進んでいる。機能も動いている。しかしどこか手触りが重い。その感覚は偶然ではなく、構造が発しているサインです。違和感を「気のせい」で片づけると、接続はさらに増え、後からの立て直しが重くなります。早期にサインを言語化できるほど、修正は小さく済みます。
ここでは、現場で特に出やすい兆候を「何が起きているか」と「構造的に何を示しているか」に分けて整理します。レビューや障害対応の会話を、感覚から構造へ引き上げるための補助線として使えます。
| サイン | その場の現象 | 構造が示していること |
|---|---|---|
| 小修正で複数ファイルが揺れる | 影響範囲の調査が広い | 依存半径が膨張している |
| テストが書きづらい/壊れやすい | 単体で立ち上がらない | 境界がなく結合している |
| バグ修正が新たなバグを生む | 別画面で副作用が出る | 整合性管理が分散している |
| レビューが影響範囲確認に偏る | 価値よりリスク議論 | 予測可能性が低下している |
4.1 小さな修正で複数ファイルが揺れる
ボタンの挙動を少し変えたいだけなのに、関連する状態、セレクタ、API呼び出し、別画面の表示ロジックまで確認が必要になる。こうした状況が増えているなら、依存半径が広がっています。表面上は「丁寧に確認している」ように見えても、実態は「どこまで波及するか分からない」不安の裏返しです。変更に必要な作業が実装より探索に寄っているなら、構造が変化に耐えられていない可能性が高いです。
本来、局所的な変更は局所に閉じるべきです。しかし状態が広域に共有され、複数のレイヤーから参照されている場合、変更は必然的に横断的になります。影響範囲の見積もりに時間がかかるという事実そのものが、接続数の多さを示しています。変更に対する予測可能性が低下しているなら、それは設計の問題です。予測可能性は「慎重さ」で回復しません。境界と依存方向の整備によってのみ回復します。
4.2 テストが書きづらい、あるいは壊れやすい
テストが増えない理由は、単に工数不足とは限りません。状態が暗黙的に共有されていると、単体で検証できる境界が存在しません。ある機能をテストするために、複数のモジュールを同時に初期化しなければならないなら、構造はすでに結合しています。結合が強いほど、テストは「環境の再現」に引っ張られ、テストが仕様の検証ではなくセットアップの儀式になります。
さらに、あるテストの修正が別のテストを壊す場合、状態の分離が不十分です。テストが壊れやすいという現象は、内部の依存が絡み合っていることの反映です。テストは構造の健全性を映す鏡です。書きにくさは、設計の歪みを示しています。逆に言えば「テストしやすい境界」を作ることは、そのまま状態管理の接続を減らす方向に働きます。テストの問題は、品質の問題であると同時に、状態配置の問題です。
4.3 バグ修正が新たなバグを生む
バグを修正したはずなのに、別の画面で予期しない挙動が発生する。こうした連鎖が起きる場合、状態の整合性が複数箇所で管理されています。一箇所で直したつもりでも、別の場所で同じ意味の状態が独立して動いていると、整合性が崩れて副作用として表に出ます。ここでは「直す」こと自体が、別の不整合を作る操作になってしまっています。
一つの不整合を条件分岐で補正すると、その条件が別の文脈では過剰に働きます。結果として「例外的な処理」が増え続けます。例外が増えるほど、ロジックは読みづらくなり、さらにバグを呼び込みます。これは個々の実装者の問題ではなく、整合性管理が分散している構造の問題です。整合性を一箇所に寄せ、派生状態を増やさず、寿命と責務を揃えるほど、この連鎖は止まりやすくなります。
4.4 レビューで議論が「仕様」ではなく「影響範囲」に集中する
コードレビューが仕様の妥当性ではなく、「ここを変えると他は大丈夫か」という確認作業に終始しているなら、構造は防御的になっています。議論の中心が価値ではなくリスク管理になっている状態は、変更耐性の低下を示します。確認が悪いのではありません。確認が主役になっていることが問題です。構造が健全なら、確認は短く、焦点は仕様と設計判断に向きます。
本来、設計が明確であれば、変更の影響はある程度予測できます。予測できないからこそ、慎重さが増し、スピードが落ちます。これらのサインは些細に見えます。しかし積み重なれば、開発速度の低下、心理的負荷の増大、改善の停滞へとつながります。状態管理の複雑化は、派手な障害ではなく、日常の摩擦として現れます。摩擦が増えているのに「まだ動いているから大丈夫」と放置すると、次に必要な変更が来たときに一気に詰まります。
5. 構造から立て直すための視点
状態管理の複雑さは、個別のテクニックで部分的に抑え込むこともできます。しかし根本的に軽くしたいのであれば、コードの書き方ではなく、構造そのものを見直す必要があります。重要なのは「どう実装するか」よりも、「どこに置き、どう接続するか」という設計の視点です。状態の置き場所と接続の設計は、変更の影響範囲、テストのしやすさ、レビューの予測可能性に直結します。
ここでは、立て直しのための観点を「日々の判断に落ちる形」で整理します。大規模なリライトを前提にせず、接続の削減と責務の固定で徐々に軽くすることを狙います。特に、状態の「所有」「依存方向」「スコープ」「派生」「テスト境界」は、改善の効果が見えやすく、チームで合意しやすいレバーです。
まず、状態を配置する判断に使える簡易チェックを置くと、会話が「好み」から「理由」へ寄ります。
| 問い | YESなら | NOなら |
|---|---|---|
| この状態の所有者(更新主体)は一つか | 更新経路が予測しやすい | 所有を決める/更新を絞る |
| この状態の寿命は明確か | 初期化と破棄が説明できる | スコープを見直す |
| 同じ意味の状態が複数ないか | 整合性が単純になる | 真実源を一つに寄せる |
| これは保存すべき一次情報か | 同期コストが増えにくい | 派生として導出する |
| 単体でテストできる境界か | 依存が整理されている | 依存を切る/境界を作る |
5.1 状態の「所有者」を明確にする
まず行うべきは、すべての状態に対して「誰が責任を持つのか」を定義することです。状態には必ずオーナーを置きます。更新権限を持つ主体を一箇所に限定するだけで、波及範囲は劇的に縮小します。参照は広くてもかまいませんが、更新は絞る。この一文をチームの共通語彙にできるだけで、状態は「公共財」から「契約された資産」へ変わります。
複数箇所から直接書き換えられる状態は、整合性を保てません。参照は広くてもかまいませんが、更新は絞る。この原則があるだけで、設計は安定します。所有者が明確であれば、「なぜここにあるのか」という問いにも答えられます。さらに、障害やバグが起きたときの責務の所在が構造として定まり、原因分析も速くなります。所有者の明確化は、状態の更新経路を短くし、レビューとテストを軽くします。
5.2 依存方向を固定する
依存は自然に広がります。意識しなければ双方向になります。だからこそ、依存方向を明示的に固定します。上位レイヤーから下位レイヤーへ、あるいは入力から出力へ。一方向の流れを守るだけで、循環は断ち切られます。循環は「何が原因で何が起きたか」を曖昧にし、デバッグと変更を不安にします。依存方向は、設計の予測可能性を作る最小のルールです。
循環依存がなくなれば、変更の影響は片方向に限定されます。影響範囲を予測できる構造は、修正の心理的コストも下げます。依存方向は、構造の重力です。重力が定まれば、拡張しても崩れにくくなります。逆に重力がないと、便利な参照が増えるたびに接続が増え、状態更新の経路が網目化します。依存方向の固定は、速度を上げるというより「速度が落ちるのを防ぐ」ための防波堤です。
5.3 スコープを最小化する
共有は便利ですが、最後の手段です。まずはローカルに閉じ込められないかを検討します。画面単位で完結する状態を、安易にグローバルへ引き上げない。短命な状態を長寿命のコンテナに置かない。スコープを小さく保つことは、状態管理の複雑さを増やす最も強い要因(接続の増殖)にブレーキをかけます。
スコープが小さければ、影響範囲も小さくなります。状態は広く持つほど管理コストが増えます。必要な範囲だけに存在させるという発想が、構造を軽く保ちます。共有を選ぶときは「共有しないと成立しない理由」が言語化できるかを基準にすると、安易な公共化を防げます。共有が必要なら、所有者と更新経路をより厳密にし、境界で翻訳して責務を固定することで、公共化の副作用を抑えられます。
5.4 「派生状態」を増やしすぎない
計算によって導ける値を、そのまま保存していないかを確認します。保存状態が増えるほど、同期処理も増えます。本来は一つの真実源から導出できる値を複数保持すると、整合性維持のためのコードが膨らみます。派生状態は便利に見えますが、「更新のたびに整合させる」義務を発生させるため、長期的には負債になりやすい領域です。
保存するのは最小限の一次情報に絞り、その他は必要なときに導出する。この原則を守るだけで、状態の数は自然に減ります。減るのは変数の数ではなく、管理すべき整合性の数です。整合性が減ると、条件分岐や例外処理も減り、レビューとテストが軽くなります。さらに、派生を関数やセレクタとして集約できれば、導出ロジックが一箇所に寄り、変更時の影響範囲も読みやすくなります。
5.5 境界ごとにテスト可能にする
健全な構造は、境界単位で検証できます。ある状態やロジックが、他の多数の状態に依存せず単独で振る舞いを確認できるなら、依存は整理されています。逆に、単体テストが成立しない状態は「境界がない」ことを示しており、状態管理の複雑さが構造として固定化されているサインです。テストのしやすさは、品質の話であると同時に、状態配置の正しさの話でもあります。
テストしやすい構造を目指すことは、副次的に状態管理を健全化します。テストを書く過程で、「なぜこれがここにあるのか」「なぜこれをモックしなければならないのか」という問いが浮かびます。その問いに答えられない部分が、再設計の対象です。状態管理の立て直しは、大規模なリライトを意味しません。不要な接続を減らし、責務を明確にし、依存方向を揃える。その積み重ねが、構造を静かに軽くします。複雑さを消すのではなく、複雑さの発生源を断つ。状態は増えてもかまいません。制御できる構造の中に置かれている限り、重さにはなりません。
おわりに
状態管理の複雑化は、ある日突然「崩壊」として現れるよりも、日々の摩擦として先に現れます。小さな修正なのに複数ファイルが揺れる、影響範囲の説明に時間がかかる、テストが立ち上がらずセットアップが儀式化する、レビューが仕様よりも「他に波及しないか」の確認に偏る。これらは単なる忙しさの副作用ではなく、構造が予測可能性を失い始めている兆候です。摩擦を「慎重さ」で乗り切ろうとすると、確認作業が増えて速度が落ち、速度が落ちると近道が増え、近道がさらに接続を増やす、という自己増幅ループに入りやすくなります。
状態管理ライブラリやフレームワークは、更新や購読のメカニズムを統一し、表面上の混乱を抑えるのに役立ちます。しかし「どこに置くべきか」「誰が所有するか」「どの寿命で扱うか」といった設計判断そのものを代替するわけではありません。責務が曖昧なまま道具を強くすると、複雑さは抽象化の奥に隠れ、経路の可視性が下がり、追跡コストとして支払う形になります。ツールが悪いのではなく、構造が未定義な部分を残したままスケールすると、どの道具でも重さは再発する、というのが本記事の立場です。
立て直しは、全面リライトよりも「接続の削減」と「境界の固定」を積み上げる方が成功しやすいです。更新主体を一箇所に寄せて所有者を明確にし、依存方向を一方向に揃え、スコープと寿命が合わない状態を移し、導出できる値は保存せずに派生として集約する。さらに境界ごとにテスト可能な形へ寄せることで、構造が健全化しているかを継続的に観測できます。状態は増えてもかまいません。依存が循環せず、責務が説明でき、寿命が揃っている限り、増加は「重さ」ではなく「拡張」として扱えます。
EN
JP
KR