第5章.分かりやすいロジックを書こう

第5章.分かりやすいロジックを書こう
読 み や す い プ ロ グ ラ ム を 書 く に は 、明 快 か つ 自 然 な流 れ で 、 簡 潔 なロ ジ ッ ク を組 む こ とが 大 切 で す 。
目 先 の 処 理 だ けに とら わ れ ず 、 本 質 を 見 極 め て 、 シ ン プ ル で必 要 最 低 限 の コー ド を 書 く こ とを 意 識 す
る 必 要 が あ り ます 。
こ の 章 では 、 そ の よ うな 分 か り や す いロ ジ ッ ク を 記 述 す る 方 法 や テ ク ニ ッ ク を 説 明 し ます 。
5-1.制御文を適切に使い分けよう
Java には、分 岐 のための制 御 文 (if / switch)と、 繰 り返 しのための制 御 文 (for / while / do while)
があります。 これらの制 御 文 は、その場 面 に応 じて適 切 な文 を使 うようにしましょう。
分岐
◇ if 文
分 岐 の制 御 文 の基 本 。 どのような判 定 式 も if 文 で記 述 することができるが、必 要 に応 じて switch 文 を使
うことも考 えること。
◇ switch 文
多 分 岐 。 同 じ比 較 対 象 (値 )を複 数 のケースに分 岐 する場 合 は switch 文 で制 御 すると if 文 よりもシンプ
ルに記 述 することができる。 目 安 として、3 個 以 上 のケースに分 岐 する場 合 に switch 文 の使 用 を検 討 する
とよい。
繰り返し
◇ for 文
前 判 定 。 初 期 化 ・継 続 条 件 ・増 加 処 理 を一 文 で記 述 できる制 御 文 。 繰 り返 し回 数 が明 確 なループ、
特 にループカウンタによるループの場 合 は、for 文 で記 述 すると簡 潔 に記 述 することができる。
◇ while 文
前 判 定 。 繰 り返 しの回 数 が不 定 のループ に使 用 する。 例 えば、特 定 の値 が入 力 されるまで処 理 を繰 り返
す場 合 や、それ以 上 処 理 の続 行 が不 可 (不 要 )になるまで演 算 を繰 り返 す場 合 など。
◇ do while 文
後 判 定 。 1 回 以 上 のループ処 理 を記 述 したい場 合 に使 用 する。 for 文 や while 文 は前 判 定 のため、ルー
プに入 る前 に、継 続 条 件 の判 定 が最 初 に実 行 される。 それに対 して、do while 文 は、最 初 にループ内 の
処 理 を一 度 実 行 してから、継 続 条 件 の判 定 を行 う。 特 に、1 回 以 上 処 理 を実 行 した上 で初 めて継 続 条
件 の判 定 を行 うことができるといったような、特 殊 な状 況 で重 宝 する。 「ここぞ」という場 面 でバシッと使 える
と格 好 良 い。
Copyright (C) 2015 株式会社 JOBSUPPORT All Rights Reserved.
Copyright (C) 2015 株式会社 JOBSUPPORT All Rights Reserved.
Copyright (C) 2015 株式会社 JOBSUPPORT All Rights Reserved.
5-2.思考の順序に沿った自然な流れのロジックを組み立てよう
プログラムは、ソースコードの上 から下 へ、順 序 よく実 行 されます。
このとき、処 理 が「自 然 な流 れ」の順 に実 行 されるようにしましょう。
例 えば、「引 数 に渡 された int の配 列 の内 容 を1行 10 個 ずつ、順 番 に画 面 に出 力 する」 という処 理 を行
うとき、以 下 のような処 理 手 順 が考 えられます。
1.
画 面 にデータを1つ出 力
2.
1つ出 力 したことをカウントする
3.
現 在 の行 に 10 個 出 力 したかを判 定 し、10 個 出 力 していた場 合 は改 行 する
4.
次 の出 力 へ (1. へ戻 る)
これをプログラムとして記 述 する際 、そのまま上 記 のような順 序 でコードを記 述 す れば、 流 れが自 然 で読
みやすいプログラムになります。
それに対 して、もし前 後 の処 理 に脈 絡 がなく、ただつじつま合 わせのために処 理 が並 んでいたとしたら、
一 連 の処 理 の流 れが追 いづらくなり、読 みにくく感 じてしまいます。
関 連 のある処 理 はなるべく近 くに記 述 するよう心 掛 けましょう。 処 理 が飛 びとびになったり、全 体 の処 理
の 流
れ を 乱
し た り し な い よ う 、 記
述
す る 順
番
に 注
意
し ま し ょ う 。
Copyright (C) 2015 株式会社 JOBSUPPORT All Rights Reserved.
5-3.無駄な処理をなくそう
処 理 結 果 は正 しくても、ロジックに「無 駄 がある」ということがあります。
例 えば、不 必 要 な型 変 換 をして比 較 処 理 を行 なっていたり、 冗 長 な if 文 の判 定 を行 なっていたりという
ようなプログラムを見 かけることがあります。
もちろん、そうしなければならない理 由 があるのなら話 は別 ですが、 それが明 らかに無 駄 であるならきち
んとその無 駄 を排 除 する必 要 があります。 無 駄 な処 理 をわざわざ行 なっていて、それに対 する説 明 コメン
トも特 に記 述 されていなかった場 合 、 読 み手 は 「これは何 のための処 理 なのか」 といったことを考 えなけ
ればなりません。 たとえわずかな調 査 時 間 で済 むにしても、思 考 の邪 魔 になってい ることは間 違 いありま
せん。
ひとつひとつの処 理 が、きちんと明 確 な意 味 を持 っていることに注 意 しましょう。
また、当 初 は必 要 な処 理 であったものが、コードの付 け足 しを行 なっていった結 果 、無 駄 な処 理 になってし
まうこともあります。 プログラムをひと通 り書 いた後 は、全 体 の流 れを読 み直 して、無 駄 がないか、無 理 やり
つじつまを合 わせている処 理 がないかをチェックするようにしましょう。
Copyright (C) 2015 株式会社 JOBSUPPORT All Rights Reserved.
Copyright (C) 2015 株式会社 JOBSUPPORT All Rights Reserved.
5-4.複数の作業をいっぺんに行わず、まとまりごとに分割しよう
プログラムが複 雑 になってくると、読 みにくいのはもちろんですが、その複 雑 さゆえにバグも発 生 しやすくな
ります。 当 たり前 のことですが、シンプルで短 いプログラムほどバグは発 生 しにくく、 複 雑 で長 いプログラ
ムほどバグが発 生 しやすくなります。
プログラムは可 能 な限 りシンプルに記 述 するように心 掛 けましょう。
一 度 にあれこれと複 数 の処 理 を行 うと、処 理 が長 くなったり、 if 文 のネストにより処 理 構 造 がごちゃごち
ゃして複 雑 になったりすることがあります。
例 として、カンマ区 切 りで入 力 された数 値 の合 計 を表 示 することを繰 り返 すプログラムを考 えます。 以 下
のプログラムでは、「合 計 値 算 出 ループ」 の中 で 「算 出 結 果 の表 示 」 や 「プログラムの継 続 確 認 処 理 」
まで行 なっており、if 文 がネストして少 し複 雑 な処 理 になっています。
Copyright (C) 2015 株式会社 JOBSUPPORT All Rights Reserved.
Copyright (C) 2015 株式会社 JOBSUPPORT All Rights Reserved.
このプログラムを、「合 計 値 算 出 ループ」 ではあくまで合 計 値 の算 出 だけを行 い、 ループを抜 けてから
「算 出 結 果 の表 示 」 と 「プログラムの継 続 確 認 処 理 」 を行 うようにします。 そうすることにより、if 文 の
ネストが抑 えられ、処 理 構 造 がすっきりします。
修 正 後 のプログラム例 を以 下 に示 します。
修 正 後 のプログラムでは、合 計 値 算 出 ループと算 出 結 果 表 示 や継 続 確 認 処 理 が制 御 構 造 としてはっ
きり分 割 されることにより、 「まず合 計 値 を算 出 して、その次 に算 出 結 果 を表 示 し、継 続 確 認 を行 う。」 と
いう意 図 が読 み取 りやすくなります。
Copyright (C) 2015 株式会社 JOBSUPPORT All Rights Reserved.
目 先 の処 理 だけを考 えていると、ついつい色 んな処 理 をいっぺんに記 述 してしまったりすることがありま
す。 一 部 分 だけに気 を取 られず、全 体 の処 理 の流 れを意 識 するようにしましょう。 「ここで○○の処 理 を
して、その次 に△△の処 理 を行 う」 というように、 ひとつひとつの処 理 のまとまりを見 つけて、そのまとまり
で処 理 を分 割 して記 述 することができないかを考 えるようにしましょう。
5-5.長い処理は、メソッドへの分割を考えよう
ひとつのメソッド内 の処 理 が長 くなった場 合 は、別 のメソッドへの分 割 を考 えましょう。
ひとつのメソッド内 の処 理 が何 百 行 と続 くと、どこで何 を行 なっているのかを把 握 するのが難 しくなります。
そのような場 合 は、処 理 のまとまりを見 つけて、そのひとまとまりをひとつのメソッドに切 り出 すとよいです。
より詳 細 で具 体 的 な処 理 をメソッドに切 り出 すことで、呼 び出 し元 の処 理 が簡 潔 になり、 大 まかな処 理
の流 れが把 握 しやすくなります。 また、メソッドには名 前 があるので、処 理 のひとまとまりに名 前 が付 くとい
う効 果 もあります。 メソッドに適 切 な名 前 を付 けることによって、そこで何 の処 理 が行 われるのかが明 確 に
なります。
下 記 のプログラムは、前 述 5-4. の合 計 値 を求 めるループ処 理 部 分 をひとまとまりとしてメソッドに切
り出 しています。
Copyright (C) 2015 株式会社 JOBSUPPORT All Rights Reserved.
Copyright (C) 2015 株式会社 JOBSUPPORT All Rights Reserved.
5-6.処理の除外パターンは、先にスキップしよう
return やループの break、continue 文 をうまく使 うと、処 理 構 造 を簡 潔 にすることができます。
例 えば入 力 されたデータに対 するチェック処 理 を記 述 する場 合 、 if 文 を使 ってさまざまなチェックを記 述
していると if 文 のネストがどんどん深 くなってしまうことがあります。
以 下 は、1桁 の数 字 とその計 算 内 容 (加 減 乗 除 )を入 力 させ、計 算 を繰 り返 すプログラムです。 入 力 さ
れた数 字 や計 算 の記 号 のチェックを行 なっていますが、 if 文 がネストしており、構 造 が複 雑 になっています。
Copyright (C) 2015 株式会社 JOBSUPPORT All Rights Reserved.
Copyright (C) 2015 株式会社 JOBSUPPORT All Rights Reserved.
上 記 のようなプログラムは、continue 文 を使 うと if 文 のネストを抑 えることができます。 入 力 チェックを行 な
った結 果 、入 力 エラーと分 かったらその時 点 で contiue して処 理 をスキップするようにします。 そうすること
により、if 文 のネストが抑 えられ、処 理 構 造 がすっきりします。
修 正 後 のプログラム例 を以 下 に示 します。
Copyright (C) 2015 株式会社 JOBSUPPORT All Rights Reserved.
Copyright (C) 2015 株式会社 JOBSUPPORT All Rights Reserved.
上 記 のプログラムは、ループ内 での break や continue 文 を使 った制 御 の例 でしたが、 同 様 の制 御 で、
メソッドの始 めで先 にチェックを行 い、エラーと分 かった時 点 でメソッドを return するという制 御 も有 効 です。
if 文 のチェックのブロックを閉 じた後 は else 文 を記 述 する必 要 もなく、 ネストなしで正 常 処 理 (本 来 行 い
たい処 理 )を記 述 することができます。
ネストが深 くなった時 、あるいは深 くなりそうな時 にこれらのテクニックを使 ってみるとよいでしょう。
5-7.ネストが深くなりすぎないようにしよう
前 節 (5-6)でも説 明 した通 り、for や while のループ文 や if 文 のネスト(入 れ子 )が深 くなると、 波 括 弧
で作 られるブロックの対 応 関 係 が把 握 しづらくなり、とても読 みにくいプログラムになってしまいます。
ネストが深 くなった場 合 は、以 下 のような対 応 を検 討 しましょう。
1.メソッド化する
ネストする部 分 を、ひとつの処 理 のまとまりとしてメソッドに切 り出 すと、 ネストが抑 えられてすっきりしたプ
ログラムになります。
(※前 述 の 「5-5.長 い処 理 は、メソッドへの分 割 を考 えよう」 を参 照 。)
特 にループの中 で別 のループを実 行 している箇 所 は要 注 意 です。 ソートや探 索 といったような特 定 のア
ルゴリズムは別 ですが、 通 常 は 2 重 のループが現 れた時 点 で、内 側 のループ部 分 のメソッド化 を検 討 す
るとよいです。 ループは、そのループのブロック自 体 で明 確 な処 理 の目 的 を持 っていることが多 いです。
その処 理 のひとまとまりに適 切 な名 前 (メソッド名 )をつけて、メソッドとして定 義 すると、 そのループで実 現
しようとしている繰 り返 し処 理 の目 的 が明 確 になり、処 理 構 造 を把 握 しやすくなります。
2.処理をスキップする (return、break/continue)
return 文 や break 文 、continue 文 で処 理 を中 止 したりスキップしたりすれば、 それ以 降 の処 理 をネスト
することなく記 述 することができます。 特 にチェック処 理 を先 に実 行 し、エラーと分 かった時 点 でさっさと処
理 をスキップするように制 御 すると効 果 的 です。
(※前 述 の 「5-6.処 理 の除 外 パターンは、先 にスキップしよう」 を参 照 。)
ただし、break や continue は、乱 用 するのは NG です。 continue、break は、「処 理 のスキップ」 「ループ
の脱 出 」 に使 いますが、 それはできるだけループの最 初 のほうで済 ませるようにしてください。 厄 介 なチ
ェック・判 定 を先 に済 ませておき、その後 で本 来 の行 うべき正 常 処 理 をネストなしで記 述 する、 という目 的
のために使 用 するのが望 ましいです。 この目 的 ・タイミング以 外 でループ処 理 の動 きを制 御 するためにあ
ちこちで continue 文 を記 述 したりしてしまうと、 たちまちループ処 理 が追 いにくくなり、ロジックが難 解 にな
ってしまいます。
Copyright (C) 2015 株式会社 JOBSUPPORT All Rights Reserved.
3.判定やループ構造を見直す
if 文 でチェックする順 番 などが不 自 然 になっていて、 そのつじつま合 わせのために制 御 構 造 が必 要 以 上
に複 雑 になってしまうことがあります。 そのような場 合 は、if 文 でチェックする内 容 や順 番 、更 にループの回
し方 の見 直 しを行 いましょう。 より自 然 で無 駄 がなく、簡 潔 なロジックになるよう意 識 する必 要 があります。

プログラムの書 き始 めに、何 となく書 いたコードに引 きずられている制 御 ロジックはないか?

各 チェック処 理 の順 番 は適 切 か? 何 を真 っ先 にはじくべきか?

チェックの内 容 は適 切 か? 無 駄 な判 定 式 を記 述 していないか?

そのループは、何 をもとに繰 り返 しを制 御 するのが適 切 か? 何 を繰 り返 し条 件 にするか?
まずは上 記 のような、「目 的 の処 理 の本 質 を見 極 める」 ということがとても重 要 です。 何 となく思 いつき
でロジックを組 み立 てるのではなく、きちんと必 要 なチェック処 理 やその優 先 順 位 、 最 適 なループの制 御
方 法 を検 討 するようにしてください。 ときにはちょっと立 ち止 まって、一 歩 引 いた視 点 でロジックを見 直 して
みることも必 要 です
5-8.変に凝ったロジックを組むのはやめよう
プログラムを記 述 する際 は、処 理 の効 率 や速 度 、かっこいいテクニックや、 あるいはコード量 の削 減 とい
ったことに固 執 しすぎないようにしましょう。
処 理 効 率 や速 度 、コード量 削 減 といったことを追 い求 めるあまり、トリッキーなテクニックを多 用 し、 ソー
スコードの可 読 性 がおろそかになってしまうことがあります。 このように変 に凝 ったプログラムを作 ってしまう
と、後 々のメンテナンスで苦 労 することが多 いです。 作 成 した本 人 は読 めるかもしれませんが、標 準 的 なプ
ログラミング能 力 の担 当 者 がそのソースコードを読 んだ時 、 恐 らく最 初 はプログラムコードの動 作 結 果 や
ロジックの意 図 を読 み取 るのに時 間 がかかってしまうでしょう。 また、そのようなプログラムに手 を加 える際
も一 苦 労 です。 もし、修 正 を加 えた結 果 、想 定 外 の動 作 結 果 になった場 合 、また難 解 なロジックを解 析
するために格 闘 しなければならなくなります。
プログラムは、読 みやすさや保 守 のしやすさを第 一 に考 え、素 直 で簡 潔 なロジックを記 述 することを心 掛
けましょう。
Copyright (C) 2015 株式会社 JOBSUPPORT All Rights Reserved.