解答例
課題1
いきなりだがケースバイケースな問題である。
日本で、日本人のみが使うコードならいいが、温度の単位は摂氏・華氏がある。よくアメリカだと華氏表記が使われていると聞く。摂氏・華氏の双方を使う場合などに、わかりやすくしようとするなら、摂氏なのか華氏なのか書くと良いだろう。
湿度(humidity)に関しては、定義上、割合になるので問題ないだろう。強いて言えば、0 ~ 100なのか0 ~ 1なのかは分かれそうだが、普段の生活では0 ~ 100が一般的ではないだろうか。わかりにくいと思うなら、0~1の時は正規化された:normalizedなどをつけるのはどうだろうか?
weatherに関しては問題ないだろう。最近のIDEならstrなどの型情報はわかるので型の情報を詰める必要もない。強いて言えば、enumにすればタイポなどのミスがしにくくなる。
weather: str = “sunny”
temperature_celsius: int = 20 # or temperature_fahrenheit
humidity: int = 50
課題2
この問題では先の問題のように、国や地域の問題としてpriceの話も考えられるが、taxが入ったことによるわかりにくさに着目する。
priceプロパティが税込価格を返しているが、これは中身をみないとわからない。tax_inclueded_priceの方がいいだろう。また、taxだけでも税率なのか税額なのかわかりにくいので、tax_price にする。最後に細かいことを言うと、税率がマジックナンバーになっているので直しておく。
TAX_RATE: float = 0.1
class Product:
def __init__(self, name: str, price: float):
self._id: UUID = uuid4()
self._name: str = name
self._price: float = price
@property
def tax_included_price(self) -> float:
return self._price + self.tax_price
@property
def tax_price(self) -> float:
# 一律10%に簡略化
return self._price * TAX_RATE
課題3
bodyが一見どういうデータか分かりにくい。bodyという名前だと、バイナリか文字列に見える。しかし、ここではjson.load()しているのでdictionaryかlistのはずである。それを示すなら、json_decoded_bodyなどがある。一方で、usersというapiにアクセスしているので、そのことがわかる変数名にしてもよさそう。
import json
import urllib.request
url = 'https://example.com/api/users'
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as res:
users = json.load(res)
終わりに
リーダブルコードの「2.4 名前に情報を追加する」を題材に演習問題を作ってみた。
問題に関しては、やってみるとなかなか難しかった。間違っているとか、こう書いた方がいいのでは?などあったら是非コメントして欲しい。