第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.
© Copyright 2024 ExpyDoc