86
73

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-06-07

はじめに

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

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

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

例1

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

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

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

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

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

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

良くない共通化

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

良い共通化

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

function newAction(){
    echo(WELCOME);
}

function editAction(){
    echo(WELCOME);
}

function deleteAction(){
    echo(WELCOME);
}

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

例2

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

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

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('ここは削除画面だよ!');
    }
}

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

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

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

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

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('ここは削除画面だよ!');
    }
}

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

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

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

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

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

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

まとめ

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

巻末

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

86
73
1

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
86
73

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?