当コラムでは、PythonZen & PEP 8 検定試験(こちらでオンライン受験できます)で出題されている問題の解説を行なっています。当コラムシリーズを読んで自信がついたら、ぜひ試験に挑戦してみてくださいね。
今回のコラムで解説する試験問題はこちらです。
問題
格言「Complex is better than complicated.」に関する説明について、間違っているものを次の選択肢の中から選びなさい。
- スパゲッティコードになってしまっても仕方がない場合がある。
- 難しい処理を書く場合は、コードの行数が増えてしまうこともある。
- 難しいアルゴリズムを書く場合でも、読みやすいコードを目指すべきである。
- 条件分岐が多いという理由だけでは、コードが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 検定試験 で実際に試験を受けてみましょう。