#0139（2025/05/17）構造化プログラミングと代表的なプログラミングパラダイム

# 代表的なプログラミングパラダイム


## 1. そもそも “パラダイム” とは？

プログラミング・パラダイムとは、**「プログラムをどう構成し、世界をどう切り取るか」という思考スタイル**のことです。言語仕様・ライブラリ・設計手法を超えて“ものの見方”を縛るルールブックのような存在とも言えます。モダン言語は複数のパラダイムを併用できるため、**状況に応じて使い分ける**のが実務のコツです。

---

## 2. 構造化プログラミング

### 2‑1. 核心

| 制御構造               | 説明                       |
| ------------------ | ------------------------ |
| **順次 (sequence)**  | 上から下へ命令を並べる。             |
| **選択 (selection)** | `if` / `switch` による分岐。   |
| **反復 (iteration)** | `for` / `while` による繰り返し。 |

この 3 つ**だけ**で制御フローを構築し、自由跳躍 `goto` を排除して **“人間に優しい”** コードを目指す手法（E. Dijkstra が 1960 年代に提唱）。

### 2‑2. 非構造化の制御方法例

| 制御方法                 | 概要                          | 読みにくさの理由                 |
| -------------------- | --------------------------- | ------------------------ |
| **GOTO**             | 任意ラベルへジャンプ                  | 流れが非線形。スタックや前提条件を把握しづらい。 |
| **無限ループ＋フラグ**        | `while (1)… if(done) break` | 本来のループ条件が隠れ、出口が複数。       |
| **setjmp / longjmp** | C の疑似例外ジャンプ                 | 関数境界を越えて復帰、スタック追跡が難解。    |
| **例外の乱用**            | 本来のロジック分岐を `throw` で実現      | 成功・失敗の境界が不明瞭、catch が分散。  |

> 📝 **ポイント**：`return` やガード節は “関数を明示的に閉じる” ため許容されます。

### 2‑3. ミニコード

```c
// 非構造化 (GOTO)
int sum(int n){int i=1,s=0;start: if(i>n)goto end; s+=i++; goto start; end:return s;}
```

```c
// 構造化
int sum(int n){int s=0; for(int i=1;i<=n;i++) s+=i; return s;}
```

---

## 3. 代表的な他パラダイム

構造化に加えて、以下の 7 つを押さえると、日常開発のほとんどが説明できます。

### 3‑1. 手続き型 (Procedural)

**考え方**：状態を変える“手続き”を順番に呼び出す。C / Go / 低レベル組込みで主流。

```python
def sum_n(n):
    s = 0
    for i in range(1, n + 1):
        s += i
    return s
```

### 3‑2. オブジェクト指向 (OOP)

**考え方**：データ＋振る舞いを**オブジェクト**にまとめ、「継承」「ポリモーフィズム」で拡張。UI/ゲーム/業務システムに強い。

```java
class BankAccount {
  private int balance;
  BankAccount(int b){ balance = b; }
  void deposit(int a){ balance += a; }
  int  getBalance(){ return balance; }
}
```

### 3‑3. 関数型 (Functional)

**考え方**：副作用を避け、**関数＝第一級値** として合成。並列計算や数理変換に向く。

```haskell
sumN n = foldl (+) 0 [1..n]  -- 純粋関数で合計
```

* 副作用なし → 同じ入力で常に同じ出力。
* 不変データ → 共有メモリ競合を回避。

### 3‑4. ロジック型 (Logic)

**考え方**：“事実” と “規則” を列挙し、充足可能性 (真/偽) をエンジンに委ねる。

```prolog
parent(alice, bob).                      % ❶ 事実 (fact)

ancestor(X, Y) :- parent(X, Y).          % ❷ 規則 (rule) ── ベースケース
ancestor(X, Y) :- parent(X, Z),          % ❸ 規則 (rule) ── 再帰ステップ
                    ancestor(Z, Y).
```

検索・AI の知識表現（エキスパートしすて）、パズル解、ルールエンジンで活躍。

### 3‑5. データフロー / リアクティブ

**考え方**：データの流れを“ストリーム”として宣言し、非同期に変換を重ねる。

```javascript
// RxJS
fromEvent(btn, 'click')
  .pipe(map(() => Date.now()))
  .subscribe(t => console.log('Clicked', t));
```

表計算・UI バインディング・ETL に適合。

### 3‑6. イベント駆動

**考え方**：外部イベント（I/O 完了・ユーザ操作）にコールバックで応答。Node.js、GUI フレームワークで常套。

```javascript
server.on('request', (req, res) => res.end('Hi'));
```

### 3‑7. アスペクト指向 (AOP)

**考え方**：ロギングやトランザクション等“横断的関心事”をビジネスロジックに後付け注入。

```java
@Around("execution(* Service.*(..))")
public Object log(ProceedingJoinPoint pjp) throws Throwable {
  System.out.println("▶ " + pjp.getSignature());
  Object r = pjp.proceed();
  System.out.println("◀ done");
  return r;
}
```

Spring / AspectJ で採用率高。

---

## 4. パラダイム比較早見表

| # | パラダイム  | キーワード     | 代表用途             | 向き・不向き         |
| ------ | ------ | --------- | ---------------- | -------------- |
|1 | 構造化    | 順次・選択・反復  | 制御フローが複雑過ぎない C 系 | 巨大業務ロジック単体では不足 |
|2 | 手続き型   | 状態更新手続き   | OS/組込み/高速処理      | データ肥大でスパゲッティ化  |
|3 | OOP    | オブジェクト・継承 | GUI/ドメイン駆動       | 過多設計でクラス爆発しがち  |
|4 | 関数型    | 不変・高階関数   | 並列/金融/検証容易       | 状態管理が多い UI は冗長 |
|5 | ロジック   | 規則と推論     | ルールエンジン/AI       | 性能チューニング難      |
|6 | データフロー | ストリーム・宣言的 | UI/ETL/IoT       | デバッグが抽象的       |
|7 | イベント駆動 | 非同期 I/O   | Websocket/サーバ    | コールバック地獄注意     |
|8 | AOP    | 横断的関心事    | ログ/監査/Tx         | 動的挿入で追跡困難      |

---

## 5. まとめと実務 Tips

1. **構造化は“可読性の筋トレ”**。制御フローをシンプルに保つ基本姿勢。
2. **OOP × 関数型の折衷**が現代バックエンドの定番。状態は OOP、純粋計算は関数型で切り分け。
3. **データフロー / リアクティブ**を UI 層に導入すると、宣言的記述で状態同期が容易。
4. **パラダイムを盲信しない**。問題特性とチーム文化で選択を。

> 複数パラダイムを“多刀流”で扱えるエンジニアは、設計の引き出しが格段に増えます。まずは構造化と OOP を土台に、関数型やリアクティブで**思考のレンズ**を増やしましょう。