問題解説)格言「Complex is better than complicated.」に関する説明について、間違っているものを次の選択肢の中から選びなさい。

当コラムでは、PythonZen & PEP 8 検定試験(こちらでオンライン受験できます)で出題されている問題の解説を行なっています。当コラムシリーズを読んで自信がついたら、ぜひ試験に挑戦してみてくださいね。

今回のコラムで解説する試験問題はこちらです。

問題

格言「Complex is better than complicated.」に関する説明について、間違っているものを次の選択肢の中から選びなさい。

  1. スパゲッティコードになってしまっても仕方がない場合がある。
  2. 難しい処理を書く場合は、コードの行数が増えてしまうこともある。
  3. 難しいアルゴリズムを書く場合でも、読みやすいコードを目指すべきである。
  4. 条件分岐が多いという理由だけでは、コードがcomplexであるとは限らない。

解答のヒント

「complex」の方が「complicated」よりも良いというのは、どういう意図なのでしょうか。「complex」と「complicated」はどちらも日本語では「複雑な」と訳せる単語ですが、実はニュアンスに違いがあります。

「complex」はニュートラルな使い方をされます。たくさんの要素があって複雑になっている、手間がかかっている、ただそういう状態なのだ、というようなニュアンスです。

一方の「complicated」はネガティブな使い方をされます。複雑で交錯している、理解しにくい、ややこしい、面倒だ、というようなニュアンスです。

そこで試しに、「誕生日の曜日を求める」処理をcomplexなコードとcomplicatedなコードで書いて比べてみましょう。

Complexなコード:

このコードでは datetime のメソッドを使って誕生日の曜日を取得しています。「誕生日の曜日を求める」処理として適切な複雑さになっています。

import datetime

def get_weekday_of_birthday(year, month, day):
    birthday = datetime.date(year, month, day)
    return birthday.strftime("%A")

year, month, day = 1990, 5, 15  # 例: 1990年5月15日
weekday = get_weekday_of_birthday(year, month, day)
print(f"あなたの生まれた日は {weekday} でした。")

Complicatedなコード:

このコードは日付を自前で計算しているため、必要以上に複雑で、読みにくく、メンテナンスしにくく、おそらくパフォーマンスも劣っています。もしかしたらどこかにバグがあるかもしれませんが、それもすぐには判明できません。

def get_weekday_of_birthday(year, month, day):
    if month < 3:
        month += 12
        year -= 1
    k = year % 100
    j = year // 100
    f = day + ((13 * (month + 1)) // 5) + k + (k // 4) + (j // 4) - (2 * j)
    weekday_number = f % 7
    days_of_week = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
    return days_of_week[weekday_number]

year, month, day = 1990, 5, 15  # 例: 1990年5月15日
weekday = get_weekday_of_birthday(year, month, day)
print(f"あなたの生まれた日は {weekday} でした。")

以上のように、複雑な問題を解決するために複雑な(complex)コードが必要になることもありますが、それは不必要に複雑な(complicated)コードを正当化するわけではありません。

場合によっては、行数をたくさん書いたり、条件分岐をたくさん加えることが適切かもしれませんが、最終的にはいつでも読みやすく、理解しやすいコードを目指すべきです。

正解について

ここまで正解のヒントをご紹介しましたが、いかがでしょうか? この問題はPythonZen & PEP 8 検定試験で出題されています。

自信がついたら、PythonZen & PEP 8 検定試験 で実際に試験を受けてみましょう。

PAGE TOP