この記事では、ソースコードの記述テクニックをご紹介します。
プログラマとして、良いソースコードを記述するのに必須のテクニックです。
このテクニックを習得すると、バグが少なく可読性の高い、良いソースコードが書けるようになります。
ここで紹介するテクニックは、実はきちんと理解して扱えるプログラマはそう多くないものも含まれます。
そのため、きちんと習得し実践することで、周りと一段レベルの違うプログラミングが出来るようになります。
必ず良い評価を得られるようになるので、是非習得して周りとスキルの差をつけましょう!
※Javaのソースコードを例として用いていますが、Stream以外は他の言語でも考え方は同じです。
読みやすく綺麗なソースコードを記述する方法についても紹介しています。今回の内容よりも易しい内容ですが必須のスキルなので、まだ習得していない人は合わせて読みましょう。

if文の入れ子を避ける
初心者にありがちなのが、if文の中にif文を書いてしまい、条件分岐が複雑になってしまうパターンです。
複雑にならない書き方をご紹介します。
if文を切り出す
例えば、複数の商品のうち本が1000円以上だと200円引きした値を返す関数があるとします。ただし、値段が設定されていない場合はnullが入るとします。
// 商品クラス public class Product { private String name; private int price; public String getName() { return name; } public int getPrice() { return price; } } // 割引関数 (引数に商品情報を持つ) public int discountPrice(Product product) { if (product != null) { // 1. nullかどうか if (product.getName() == "BOOK") { // 2. 商品が本かどうか if (product.getPrice() >= 1000) { // 3. 1000円以上かどうか return product.getPrice() - 200; } else { return product.getPrice(); } } else { return product.getPrice(); } } else { return 0; } }
少し強引ですが、一つの商品に対して3つの条件分岐を行っています。
- 1. nullかどうか
- 2. 商品が本かどうか
- 3. 1000円以上かどうか
このままでは、パッと見た感じ何がしたいのかがわかりにくいですよね?
簡単な例ですが、本来はもっと複雑な処理であったり、ここにfor文が絡んだりしてくると間違いなく混乱を招きます。
そこで、2重以上のif文は出来るだけ切り出します。
// 割引関数 (引数に商品情報を持つ) public int discountPrice(Product product) { if (product != null) { // 1. nullかどうか return 0; } if (product.getName() != "BOOK") { // 2. 商品が本以外かどうか return product.getPrice(); } if (product.getPrice() >= 1000) { // 3. 1000円以上かどうか return product.getPrice() - 200; } return product.getPrice(); }
今回の例では、商品が1000円以上の本ではない場合にすぐにreturnして結果を返しています。
重要なポイントとしては、必要な結果がわかった段階でそれ以降の不要な処理は行わないようにif文を切り出すことです。
switch文を使う
こちらは単純ですが、3つ以上の条件分岐は必要に応じてswitch文を使いましょう。
当たり前のルールですが、たまに忘れてしまうとそれだけで複雑なif文のコードが生まれてしまいますので、注意しましょう。
条件式は関数で記述する
上記の割引関数の例では、if文の条件に直接条件式を記述しています。
しかし実際には、出来るだけ条件式を直接書かずに関数を記述しましょう。
そうすることで、複数個所に同じ条件式を量産してしまうのを防ぐことができます。
また、関数名から条件の意味が推測できるようになり、可読性が上がります。
// 割引関数 (引数に商品情報を持つ) public int discountPrice(Product product) { if (StringUtils.isEmpty()) { // 1. nullかどうか return 0; } if (!isBook(product.getName())) { // 2. 商品が本以外かどうか return product.getPrice(); } if (isDiscount(product.getPrice())) { // 3. 1000円以上かどうか return product.getPrice() - 200; } return product.getPrice(); } // 商品が本かどうか (本場合はtrue、それ以外はfalse) public boolean isBook(String name) { return name == "BOOK"; } // 1000円以上で割引対象かどうか(割引対象の場合はtrue、対象外の場合はfalse) public boolean isDiscount(int price){ return price >= 1000; }
ここではnullチェックに外部ライブラリであるStringUtils.isEmpty()を用いています。
例以外にも、List型はlist.isEmpty()を用いることができます。
条件がandやorを繋げて複雑になった場合でも、関数を定義することでスッキリ見せることができるのでオススメです。
Enumを使う
Enumはご存知でしょうか?
Enumは列挙型と呼ばれており、定数の定義を列挙して記述できる型になります。
上記の割引関数の例では、商品が本であるかどうかを”BOOK”という文字列かどうかで判断しています。
実はこのように、プログラム中に直接文字列や定数を記述することはあまり良いコードとは言えません。
なぜなら、複数個所に”BOOK”を直接記述してしまうと、それを別の商品に修正する際は全ての箇所を修正する必要が出てくるため、手間になってしまうからです。
Enumを用いることで、Enumで定義された定数を必要な箇所で呼び出して扱うことが出来るようになるため、定数の一元管理を行うことができます。
また、他にもEnumにはフィールドやメソッドを定義することができるので、上記のisBook()関数などをEnumに記述して様々な箇所から呼び出して扱うことが出来るようになります。
Enumは処理の共通化に便利な手法なので、うまく扱えることができると、自ずと綺麗なソースコードに近づいていきます。
Enumの書き方や使い方についてはこちらで詳しくご紹介しています。

for文はStreamで記述する
StreamはJava SE 8から登場した新しい機能です。
ここまでは他の言語でも有効な手法でしたが、この章だけはJava言語に対する章になります。
簡単に言うと、List型のデータの加工や操作を楽に記述させる方法です。
今までList型のデータはfor文の中で、データを加工したりしていましたがそれが不要になります。
さらに、データに対する操作を順序建てて記述できるため、コードから処理の内容がわかりやすくなります。
実はこのStream、今更と言えば今更なのですが、実は習得出来ているプログラマはそれほど多くはありません。
特に、古い書き方が身についている人ほど、for文からstreamになかなか移行出来ていなかったりします。
さらに、情報系の大学などでもまずは普通のfor文を教えますし、for文が理解出来た人には次に拡張for文が待っています。
そこが理解出来た人がやっと、Streamへと到達するのです。
今後、必須の技術になりますので今のうちに習得しておきましょう。
Streamの使い方などの詳細については、長くなるので別の記事でまとめています。

まとめ
今回の記事では、良いソースコードを記述するための手法をご紹介しました。
特に、if文やfor文などプログラムの主軸になる処理を書くテクニックをご紹介しました。
また、処理の共通化のためにEnumという列挙型についてもご紹介しています。
これらの、手法を是非習得して自身のプログラミングスキルをアップさせましょう!
早い段階から習得すると、周りからの評価もアップするので一石二鳥です!
今回紹介したテクニック以外に、読みやすいソースコードを記述する方法についてもご紹介しています。
重要な内容ですので、必ず今回の内容と合わせて習得しましょう。
