解答例
課題1
check
だと曖昧で何を確認したいのかわからない。追加してもよいかのバリデーションチェックかもしれないし、要素として持っていないことの確認かもしれない。
ここでは、引数で渡したインスタンスを要素として持っているかを確認している。なので、has_item()
, contains()
, include()
などが考えられる。has_item()
は、hasという接頭語でbool値が返ってくると予想できる点は良いた、itemが少し冗長にみえる。containsはC#, includeはrubyなど他言語で用いられる表現なので、他言語を扱った経験がある人にはなじみ深くていいだろう。
類似例として、find()
も考えられるが、返り値としては、探した結果が返るのが望ましくboolを返すのは不適切だろう。そうなると、要素を持っているかどうかをユーザー側が判断しなければならなくなってしまう。
class Item:
pass
class Items:
def __init__(self, items: list[Item]):
self._items = items
# checkだと何を確認したいのかわからない。
#def check(self, item: Item) -> bool:
# return items in self._items
def contains(self, item: Item) -> bool:
return items in self._items
課題2
compare()
だと何を比較しているのかわからない。年齢?身長?体重?etc。さらに高いとき低いときどちらの時がtrueなのかわからない。
ここでは、年齢を比較して年齢が高い時にtrueとしている。older
や bool値を強調するなら is_old
などが考えられる。
class Human:
def __init__(self, name: str, age: int, height: int):
self._id: UUID = uuid4()
self._name: str = name
self._age: int = age
self._height: int = height
@property
def name(self) -> str:
return self._name
@peroperty
def age(self) -> int:
return self._age
@property
def height(self) -> int:
return self._height
#def compare(self, other: Human) -> bool:
# return self.age > other. age
def older(self, other: Human) -> bool:
return self.age > other. age
課題3
これは、書籍で記載されていたとおり、Max, Minを使おう。あと、名前が抽象的過ぎて、何の要素に影響するかがみえない。
# UPPER_LIMIT: int = 50
# LOWER_LIMIT: int = 0
MAX_ITEMS: int = 50
MIN_ITEMS: int = 0
class Item:
pass
class Items:
class ItemsLenghError(Exception):
pass
def __init__(self, items: list[Item]):
self._items = items
def append(self, item: Item):
if len(self._items > MAX_ITEMS):
raise ItemsLengthError("アイテム数の上限を超えています")
self._items.append(item)
def remove(self, item: Item):
if len(self._items < MIN_ITEMS):
raise ItemsLengthError("アイテム数の下限を超えています")
self._items.remove(item)
課題4
reload()
だと再読み込みを実行するように見えるし、実際Widgetではそうなっており混乱する。should_reload()
あたりであれば、「リロードすべきか?」と伝わってくる、
class Widget:
def reload(self):
pass
widget: Widget = Widget()
# 一定期間ごとに呼ばれるとする
def update():
if self.reload():
widget.reload()
# def reload() -> bool:
# # 再読み込みが必要かの判断
# return xxx
def should_reload() -> bool:
# 再読み込みが必要かの判断
return xxx
課題5
append()
だと末尾に追加するようにみえる。実際pythonのlist.append()はその挙動である。prepend()
や add_fisrt()
などが良いだろう。
class Item:
pass
class Items:
def __init__(self, items: list[Item]):
self._items = items
# def append(self, item: Item):
# self._items.insert(0, item)
def add_first(self, item: Item):
self._items.insert(0, item)