概要
プログラミングの良い概念を理解するとプログラマーレベルが上がると考えています。
良い概念は特定のプログラミング言語に縛られないので、様々なプログラミング言語で役に立ちます。
今回紹介する良い概念は「OAOO原則」です。
OAOO原則とは
OAOOは「Once And Only Once」の略で、要約すると「同じコードを何度も書くな」となります。
同じようなコードを2か所以上(重複したコード)で見られたら、1か所にまとめることを考えると良いプログラミングになります。
OAOO原則に従うとコードに変更が必要になった場合、1か所だけの変更で済みます。
「重複したコード」はプログラミングにおいて最も起こりやすい(コードのコピペなど)ですが、最もやっていはいけないことでもあります。
DRY原則(Don't Repeat Yourself)がありますが、DRY原則はシステム全体として使われることが多いです。
本記事はプログラミングにスコープを当てているのでOAOO原則として紹介します。
サンプルコード
重複したコードと発生例とその除去方法をサンプルコードで見ていきます。
1.マジックナンバーを定数定義する
マジックナンバーとはコード上に書かれた「何らかの意味を持つ具体的な数値」です。
マジックナンバーは以下の問題点があります。
・数値の意味がわかりにくい(同じ数値で別の意味を持つ場合、判断が難しい)
・コードに変更が必要になった場合、複数箇所の変更が必要
マジックナンバーを使用したコートは以下になります。
// 1:午前, 2:午後
if (ampm === 1) {
// 午前の処理
} else if (ampm === 2) {
// 午後の処理
} else {
// その他の処理
}
// ...
if (ampm === 1) {
// 午前だけの特別な処理
}
// 午前とは違う意味の「1」です
count += 1;
マジックナンバーを定数定義したコードは以下になります。
// 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.同じ処理を関数定義する
同じ処理をしているコード群がある場合、そのコード群を関数として定義します。
関数定義をしたことのないプログラマーはいないと思いますが、その利点についてあらためて確認してみましょう。
関数定義されていないコードは以下になります。
// pre => main => postの順番で実行(1回目)
preProcessing();
mainProcessing();
postProcessing();
// ...
// pre => main => postの順番で実行(2回目)
preProcessing();
mainProcessing();
postProcessing();
関数定義したコードは以下になります。
// pre => main => postの順番で実行
function doProcessing() {
preProcessing();
mainProcessing();
postProcessing();
}
// 処理実行(1回目)
doProcessing();
// ...
// 処理実行(2回目)
doProcessing();
同じ処理を関数定義することで以下の利点があります。
・関数定義した関数を使用することで何度も同じ処理を実行できる
・コードに変更が必要になった場合、関数内の処理を変更すればよい
まとめ
今回はOAOO原則を紹介しました。
OAOO原則に従い「重複したコード」がなくなると以下の利点があります。
・コードに変更が必要になった場合、変更箇所が1か所になる
・コードの可読性が良くなる
プログラミングにおける様々な概念やテクニックは
「OAOO原則を達成するために存在する」と言っても過言ではないくらい重要な概念と考えています。
OAOO原則を理解してプログラマーレベルが上がったと感じていただければ幸いです。
最後まで読んでいただきありがとうございます。