0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaScriptにおけるロジックとUIの責務分離:関数設計によるドメインと表示の分解戦略

Posted at

概要

UIコードにロジックを詰め込むとは、「すぐ動くコード」にはなるが「壊れやすいコード」にもなる。
それを避けるためには**“ドメインロジックとUI表現を明確に分離し、責務単位で関数を設計する”**という戦略が必要である。

JavaScript(特にフロントエンド)はしばしば「イベントハンドラの中に処理が詰まっている」「UIコンポーネントの中でデータ加工が走っている」といった実装に陥りやすい。

本稿では、関数設計によるロジック分離・再利用性の担保・UIからの切り離しという観点で、責務を意識した設計方法を解説する。


1. UIとロジックが混在した例(アンチパターン)

button.addEventListener("click", () => {
  const price = parseFloat(input.value);
  const tax = price * 0.1;
  const total = price + tax;
  result.textContent = `合計: ${total}円`;
});
  • ❌ DOMイベントの中に取得・計算・表示の全てが混在
  • ❌ 再利用不可 / テスト困難 / 保守性ゼロ

2. ドメインロジックを関数として切り出す

function calculateTotal(price) {
  const tax = price * 0.1;
  return price + tax;
}
  • 計算に専念する関数
  • テスト可能 / UIに依存しない

3. UI側は「取得」と「表示」に専念する

button.addEventListener("click", () => {
  const price = parseFloat(input.value);
  const total = calculateTotal(price);
  result.textContent = formatTotal(total);
});

function formatTotal(total) {
  return `合計: ${total}円`;
}
  • ✅ UI側は「入力→ロジック呼び出し→出力表示」のみ
  • ✅ 処理の意味が分かれ、責務が明確化

4. 複雑な構造にも応用できる(例:ユーザーの表示名生成)

function getDisplayName(user) {
  if (user.nickname) return user.nickname;
  return `${user.lastName} ${user.firstName}`;
}

// UIコンポーネント側
usernameElement.textContent = getDisplayName(currentUser);
  • ✅ ロジックはドメインに関係し、UIと切り離せる
  • ✅ 表示形式が変わってもロジックだけ変更すればよい

5. UIロジックも「UI専用関数」として整理

function renderError(message) {
  errorBox.textContent = message;
  errorBox.classList.remove("hidden");
}

function hideError() {
  errorBox.classList.add("hidden");
}
  • ✅ UI制御も直接書かず、構造化することで再利用・保守が容易に
  • ✅ テストも renderError("エラー発生") として可能になる

設計判断フロー

① UIイベントの中にロジックや加工処理が混在していないか?

② ドメインロジックは「UIとは無関係」に抽出できないか?

③ 表示のロジック(format, decorate)は関数に分離されているか?

④ UI制御(show/hide)も関数で整理されているか?

⑤ テストすべき処理がUIに依存しないよう分離されているか?

よくあるミスと対策

❌ UIイベントの中に「取得 → 計算 → 加工 → 表示」が全て書かれている

→ ✅ 関数で分離 / テスト可能に / 保守しやすい構造に分ける


❌ ユーザー名の表示フォーマットが複数箇所にベタ書きされている

→ ✅ getDisplayName() のように1箇所に抽出して一元化


❌ UI更新のたびに直接 DOM を触っていてロジックが分散

→ ✅ renderXXX() などUI制御も構造としてまとめる


結語

ロジックとUIの責務分離とは、「キレイに分ける」ことではない。
それは**“意味ごとに処理を分類し、再利用性・可読性・保守性を支える構造を設計する”**ことである。

  • ドメイン処理とUI処理を分け
  • UIは「状態の反映」のみに徹し
  • すべての処理は「意味のある名前」で構造的に表現する

JavaScriptにおけるロジックとUIの分離とは、
“動作の意味と視覚の責任を切り離し、設計によって両立させるための構造戦略”である。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?