派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

エンジニアへの挑戦状 #01 プログラム修正問題【解説】

f:id:itstaffing:20220208131524p:plain

この記事は、2022年1月28日に配信した「エンジニアへの挑戦状 プログラム修正問題#01」の解説となります。まだ問題を解いていない方は、こちらからご覧ください。
https://www.r-staffing.co.jp/engineer/entry/20220128_1

あなたのプログラマとしての力を測る問題でした。所要時間は3~5分としましたが、何を聞かれているのか理解できたら、1分ほどで解けたかもしれません。一方で、プログラマでない方には、さっぱりわからなかったでしょう。あなたは解けましたか?

では、早速解説していきます。

問題を解くための考え方

ソースコードの保守性などを考えるとき、人によって読みやすさなどは違います。そこで、誰もが同じ認識を得るために数値化する方法として「静的解析」がよく使われます。プログラムを実行して結果を確認するのではなく、ソースコードの段階でその品質を定量的に評価するのです。

この静的解析で使われる指標として、ソフトウェアメトリクスがあります。その指標の1つが、今回の問題で取り上げた「循環的複雑度」です。循環的複雑度は、ある処理の内部での分岐の数を表す指標のことです。条件による分岐が増えると、それだけ処理が複雑になり、テストパターンも増えるとともにバグも発生しやすくなります。そこで、循環的複雑度が大きい場合は処理を分割するなどの工夫が求められるのです。

循環的複雑度はその処理の中での経路の数と考えられるため、分岐やループがない場合は「1」です。そして、ifなどによって分岐が1つ増えるごとに、その値が1つずつ増えていきます。

たとえば、次のソースコードはifによる分岐が2つあるため、循環的複雑度は3です。

if (条件1) {
       処理1
} else {
       処理2
}

if (条件2) {
       処理3
} else {
       処理4
}

なお、ifは1つでも、条件が増えると、それだけ条件の判定が増えます。このため、andやorといった条件が追加されると、それだけ循環的複雑度も増えます。たとえば、次のソースコードはifの中に条件が3つあるため、循環的複雑度は4です。

if ((条件1) || (条件2) || (条件3)) {
       処理1
} else {
       処理2
}

解説

これらを踏まえて、今回の問題を見てみましょう。

問題文にあるソースコードでは、last_dayという関数の中で、if文がたくさん登場します。そして、その中に複数の条件が指定されているものもあります。これを数えてみます。

    f:id:itstaffing:20220316144444p:plain

このように、条件が全部で15個あるため、問題文のソースコードは循環的複雑度が16であることがわかります。

一般的に、循環的複雑度からソースコードの状態を判断するときは、次の表のように考えられています。

    f:id:itstaffing:20220316144453p:plain

そこで、選択肢のソースコードを見てみます。

【選択肢1】

不適切な月が引数として渡されたときの処理を先頭に移動し、うるう年の判定を2月の場合だけ実施しています。条件を数えてみると、次のようになります。つまり、循環的複雑度が9となりました。

    f:id:itstaffing:20220316144501p:plain

【選択肢2】

ifではなくswitchを使っています。複数の条件がある場合によく使われる書き方で、条件がわかりやすくなりますが、循環的複雑度は変わりません。初期値をセットしておくことで、elseを使わずに書いていますが、これも循環的複雑度には影響しません。つまり、この場合も選択肢1と同じく循環的複雑度は9です。

【選択肢3】

ifでの条件分岐ではなく、配列を使って月末日を取得しています。この場合、ifによる条件の判定が最初と最後だけになっています。配列から取得する部分は循環的複雑度に影響しないので、循環的複雑度は5です。

このため、正解は【選択肢3】となります。

実際に「保守しやすい」と判断する基準は他にもあるため、総合的に判断する必要がありますが、静的解析のツールが多くのプログラミング言語に提供されていますので、ぜひ使ってみてください。

エンジニアスタイルでは、今後もあなたのスキルの振り返りになるような問題を出題予定です。問題のレベルや出題範囲は随時拡大予定ですので、今後もぜひ解いてみてくださいね。

【出題・解説者】
増井 敏克さん
増井技術士事務所代表。技術士(情報工学部門)。情報処理技術者試験にも多数合格。ビジネス数学検定1級。「ビジネス」×「数学」×「IT」を組み合わせ、コンピューターを「正しく」「効率よく」使うためのスキルアップ支援や、各種ソフトウェアの開発、データ分析などを行う。著書に『プログラマを育てる脳トレパズル 遊んでおぼえるPythonプログラミング&アルゴリズム』『もっとプログラマ脳を鍛える数学パズル アルゴリズムが脳にしみ込む70問』『プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問』『図解まるわかり アルゴリズムのしくみ』(以上、翔泳社)などがある。