29
17

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 1 year has passed since last update.

概要

プログラミングの良い概念を理解するとプログラマーレベルが上がると考えています。
良い概念は特定のプログラミング言語に縛られないので、様々なプログラミング言語で役に立ちます。
今回紹介する良い概念は「OAOO原則」です。

OAOO原則とは

OAOOは「Once And Only Once」の略で、要約すると「同じコードを何度も書くな」となります。
同じようなコードを2か所以上(重複したコード)で見られたら、1か所にまとめることを考えると良いプログラミングになります。
OAOO原則に従うとコードに変更が必要になった場合、1か所だけの変更で済みます。
「重複したコード」はプログラミングにおいて最も起こりやすい(コードのコピペなど)ですが、最もやっていはいけないことでもあります。

DRY原則(Don't Repeat Yourself)がありますが、DRY原則はシステム全体として使われることが多いです。
本記事はプログラミングにスコープを当てているのでOAOO原則として紹介します。

サンプルコード

重複したコードと発生例とその除去方法をサンプルコードで見ていきます。

1.マジックナンバーを定数定義する

マジックナンバーとはコード上に書かれた「何らかの意味を持つ具体的な数値」です。
マジックナンバーは以下の問題点があります。
・数値の意味がわかりにくい(同じ数値で別の意味を持つ場合、判断が難しい)
・コードに変更が必要になった場合、複数箇所の変更が必要

マジックナンバーを使用したコートは以下になります。

ampm_not_oaoo.js
// 1:午前, 2:午後
if (ampm === 1) {
    // 午前の処理
} else if (ampm === 2) {
    // 午後の処理
} else {
    // その他の処理
}

// ...
if (ampm === 1) {
    // 午前だけの特別な処理
}

// 午前とは違う意味の「1」です
count += 1;

マジックナンバーを定数定義したコードは以下になります。

ampm_oaoo.js
// 1:午前
const AM = 1;
// 2:午後
const PM = 2;
// 1:増加数
const Increment = 1;

if (ampm === AM) {
    // 午前の処理
} else if (ampm === PM) {
    // 午後の処理
} else {
    // その他の処理
}

// ...
if (ampm === AM) {
    // 午前だけの特別な処理
}

// 午前と違うことを判断できる
count += Increment;

マジックナンバーを定数定義することで数値の意味を判断できるようになりました。

2.同じ処理を関数定義する

同じ処理をしているコード群がある場合、そのコード群を関数として定義します。
関数定義をしたことのないプログラマーはいないと思いますが、その利点についてあらためて確認してみましょう。

関数定義されていないコードは以下になります。

function_not_oaoo.js
// pre => main => postの順番で実行(1回目)
preProcessing();
mainProcessing();
postProcessing();

// ...

// pre => main => postの順番で実行(2回目)
preProcessing();
mainProcessing();
postProcessing();

関数定義したコードは以下になります。

function_oaoo.js
// pre => main => postの順番で実行
function doProcessing() {
    preProcessing();
    mainProcessing();
    postProcessing();
}

// 処理実行(1回目)
doProcessing();

// ...

// 処理実行(2回目)
doProcessing();

同じ処理を関数定義することで以下の利点があります。
・関数定義した関数を使用することで何度も同じ処理を実行できる
・コードに変更が必要になった場合、関数内の処理を変更すればよい

まとめ

今回はOAOO原則を紹介しました。
OAOO原則に従い「重複したコード」がなくなると以下の利点があります。
・コードに変更が必要になった場合、変更箇所が1か所になる
・コードの可読性が良くなる

プログラミングにおける様々な概念やテクニックは
「OAOO原則を達成するために存在する」と言っても過言ではないくらい重要な概念と考えています。
OAOO原則を理解してプログラマーレベルが上がったと感じていただければ幸いです。

最後まで読んでいただきありがとうございます。

29
17
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
29
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?