分離しすぎた構造がチーム理解を阻害していないか
はじめに
責務分離、関心の分離、再利用性──。
Reactコンポーネントの設計でこれらを意識するのは良いことですが、分ければ分けるほどよくなるというわけではありません。
むしろ実務では「細かく分けすぎて、逆に読めなくなってる」構造が多く見受けられます。
この記事では、分離しすぎた構造が可読性やチーム理解を下げていないかをレビューアーの視点で判断し、再統合や整理を提案するための観点を解説します。
「分けすぎて読みにくい」構造の兆候
過剰分離とは
本来1つのまとまりで理解できるロジックや構造を、機械的に関数・Hook・ファイルへ分けすぎることで、かえって構造の把握が難しくなる状態を指します。
よくある兆候としては次のようなものがあります:
- Custom Hookが1行だけの処理をラップして複数存在
- Containerが極端に薄く、Viewと役割が曖昧
- Layout、Section、Contentなどの抽象名が多層に重なっている
- 構造を追うために5ファイル以上を開く必要がある
実例:分けすぎて構造が逆に不明瞭
DashboardContainer.tsx
const { user } = useUser();
const { chartData } = useChart();
return <DashboardView user={user} chartData={chartData} />;
DashboardView.tsx
return (
<Layout>
<UserSummary user={user} />
<ChartSection data={chartData} />
</Layout>
);
ChartSection.tsx
return (
<ChartWrapper>
<ChartBody data={data} />
</ChartWrapper>
);
一見整理されているように見えますが、中身を把握するためにはHook・View・Sectionと3階層以上を同時に読む必要があり、実装の意図がつかみにくくなっています。
レビューでチェックすべき観点
観点 | チェック内容 | 対応方針 |
---|---|---|
HookやComponentの数が多すぎないか? | 機械的にuseX が量産されていないか |
同一責務なら統合を検討 |
各層に明確な責務があるか? | Container/View/Sectionなどの役割が重複していないか | 責務整理 or 命名再考 |
抽象化がUI構造に合っているか? | 見た目と構造の粒度が一致しているか | Layoutを減らし役割を再考 |
コードリーディングに冗長なファイル横断が必要か? | 主要ロジックが分断されていないか | 重要な処理は1ファイルに集約可 |
改善例:再統合による構造の整理
統合後のDashboard.tsx
export function Dashboard() {
const [user, setUser] = useState(null);
const [chartData, setChartData] = useState([]);
useEffect(() => {
fetchUser().then(setUser);
fetchChart().then(setChartData);
}, []);
return (
<div className="dashboard">
<UserSummary user={user} />
<Chart data={chartData} />
</div>
);
}
すべてを1ファイルに書く必要はありませんが、「分離する理由が説明できない構造なら、統合を検討すべき」です。
UMLで比較(分離しすぎ構造 vs 統合構造)
構造が深くなりすぎると、見通しが悪くなるだけでなく、レビュー観点も散漫になります。
コメントテンプレート(レビュー用)
分離過剰の指摘
@Reviewer: 各Hookやコンポーネントが薄く分離されすぎており、構造の意図が逆に読みにくくなっています。機能ごとの統合や責務単位での再構成を検討すると、可読性が高まります。
改善提案
- const { user } = useUser();
- const { chartData } = useChart();
- return <DashboardView ... />
+ useEffect(() => {
+ fetchUser().then(setUser);
+ fetchChart().then(setChartData);
+ }, []);
+ return (
+ <div>
+ <UserSummary user={user} />
+ <Chart data={chartData} />
+ </div>
+ );
まとめ
Reactにおける責務分離は設計の基本ですが、「分けた理由が薄いまま」分離だけが進んでしまうと、
構造の本質が見えなくなり、逆に読み手やチームの認知コストを上げてしまいます。
レビューアーとしては「この分離、本当に読みやすさにつながっているか?」を常に問い、
分離と統合のバランスを取りながら、構造を支える判断をしていくことが求められます。