共通化が必ずしも正義と思うなよ（過激派）

## はじめに

「共通化」という言葉を聞くとどういうイメージを抱くでしょうか？

* 絶対すべきもの
* 絶対正義
* え？なんでここ共通化してないの？
* 俺は共通化するけどお前は共通化しないの？

と思ってる人がいたら今すぐそんな考えは肥溜めにポイしてください。
正しくない「共通化」は悪にすらなります。

## 例1

例えば以下のようなものがあったとしましょう。
上司「サイトの各画面に`ようこそ！`の文言を置きたいんだよねー」
（※コードはイメージです。私が書きやすいので`PHP`で書いてます）

```php
function indexAction(){
    echo('私の記事へようこそ！ゆっくりしていってね！');
}

function newAction(){
    echo('私の記事へようこそ！ゆっくりしていってね！');
}

function editAction(){
    echo('私の記事へようこそ！ゆっくりしていってね！');
}

function deleteAction(){
    echo('私の記事へようこそ！ゆっくりしていってね！');
}
```

これはイケてないですね。
仮に`ようこそ！`の文言を変えたくなった時に4箇所変えなければなりません。
それでは共通化していきましょう。

### 良くない共通化

```php
function allAction(){
    echo('私の記事へようこそ！ゆっくりしていってね！');
}
```

### 良い共通化

```php
const WELCOME = '私の記事へようこそ！ゆっくりしていってね！';
function indexAction(){
    echo(WELCOME);
}

function newAction(){
    echo(WELCOME);
}

function editAction(){
    echo(WELCOME);
}

function deleteAction(){
    echo(WELCOME);
}
```

今の時点ではどちらも文言を修正したくなった時に「1箇所直せば解決する」ので共通化できています。
これらの違いはどこにあるでしょう？
更に要件を加えていってみましょう。

## 例2

上司「各画面がそれぞれ何の画面か分かりやすくしたいから説明の文言を置きたいんだよねー」

### 良くない共通化をしていた場合


```php
function allAction(){
    $action = $_POST['action'];
    echo('私の記事へようこそ！ゆっくりしていってね！');
    if($action === 'index'){
        echo('ここは一覧画面だよ！');
    } else if($action === 'new') {
        echo('ここは作成画面だよ！');
    } else if($action === 'edit') {
        echo('ここは編集画面だよ！');
    } else if($action === 'delete') {
        echo('ここは削除画面だよ！');
    }
}
```

### 良い共通化をしていた場合

```php
const WELCOME = '私の記事へようこそ！ゆっくりしていってね！';
function indexAction(){
    echo(WELCOME);
    echo('ここは一覧画面だよ！');
}

function newAction(){
    echo(WELCOME);
    echo('ここは作成画面だよ！');
}

function editAction(){
    echo(WELCOME);
    echo('ここは編集画面だよ！');
}

function deleteAction(){
    echo(WELCOME);
    echo('ここは削除画面だよ！');
}
```

良くない方はif文が登場しました。また、新しく`$aciton`という変数が登場しました。
どのアクションなのかを知ってそれをif文で分岐させています。
「ネストしてるだけでやってること対して変わってねぇじゃねーか！どこが悪いんだよ！」という方、更に要件を加えていってみましょう。

## 例3

上司「やっぱりさ、`ようこそ！`の文言は一覧画面と削除画面だけでいいと思うんだよねー。あとさ、削除画面は`ようこそ！`の文言より前に`削除したら戻せないよ`っていう注意文言が欲しいんだよねー」

### 良くない共通化をしていた場合

```php
function allAction(){
    $action = $_POST['action'];

    if($action === 'delete'){
        echo('削除したデータは復元できません！ご注意ください！');
    }

    if($action === 'index' || $action === 'delete'){
        echo('私の記事へようこそ！ゆっくりしていってね！');
    }

    if($action === 'index'){
        echo('ここは一覧画面だよ！');
    } else if($action === 'new') {
        echo('ここは作成画面だよ！');
    } else if($action === 'edit') {
        echo('ここは編集画面だよ！');
    } else if($action === 'delete') {
        echo('ここは削除画面だよ！');
    }
}
```

### 良い共通化をしていた場合

```php
const WELCOME = '私の記事へようこそ！ゆっくりしていってね！';
function indexAction(){
    echo(WELCOME);
    echo('ここは一覧画面だよ！');
}

function newAction(){
    echo('ここは作成画面だよ！');
}

function editAction(){
    echo('ここは編集画面だよ！');
}

function deleteAction(){
    echo('削除したデータは復元できません！ご注意ください！');
    echo(WELCOME);
    echo('ここは削除画面だよ！');
}
```

ね？段々つらくなってきたでしょう？
良くない共通化をしていると要件が追加された時・変更したい時ににっちもさっちもいかなくなります。
逆に変更したいのに思うようにいかない時は、あなたのやっている共通化が正しくないことを疑いましょう。

## まとめ

上で挙げた例でも例えば`ようこそ！`の文言を各アクションで出し分けたいってなった時に詰みます。
要は「ここは変わらない普遍のもの」「ここは必ず`共通`の処理」というのを共通化するのが正しい共通化です。
見た目が同じだからといって共通化するのは間違っています。
コードのやりたいこと、今後発生しうることを考えた上で行いましょう。
「共通化」は用法・用量を守って正しく使いましょう。

## 巻末

この記事は[Hamee](http://more.hamee.co.jp/)の[技術記事バトンリレー](http://me.hamee.me/)の最終記事でした。
ここまで繋いでくれたメンバーの皆さん、本当にありがとうございました！
長いようで短い半年でした！
またすぐ2週目をやろうと思っているのでお楽しみに〜*\(^o^)/*