クラスのコンテキストの場合(変数の抽出)
変数でなくメソッドとして抽出する
抽出した名前はクラス全体で通用する
👉なので、メソッドにする
メソッドにすることで、オブジェクトの共通の振る舞いとしている
code:before.py
class Order:
def __init__(self, a_record) -> None:
self._data = a_record
@property
def quantity(self):
return self._data.quantity
@property
def item_price(self):
return self._data.item_price
@property
def price(self):
return (
self.quantity * self.item_price
- max(0, self.quantity - 500) * self.item_price * 0.05
+ min(self.quantity * self.item_price * 0.1, 100)
)
手順
メソッドを導入(プロパティとして実装)
メソッド呼び出しに1箇所ずつ置き換える
エディタの「Extract Method」機能で1手順にまとめられる
code:after.py
class Order:
def __init__(self, a_record) -> None:
self._data = a_record
@property
def quantity(self):
return self._data.quantity
@property
def item_price(self):
return self._data.item_price
@property
def price(self):
return self.base_price - self.quantity_discount + self.shipping
@property
def base_price(self):
return self.quantity * self.item_price
@property
def quantity_discount(self):
return max(0, self.quantity - 500) * self.item_price * 0.05
@property
def shipping(self):
return min(self.base_price * 0.1, 100)
(Orderクラスは_data属性に持ったデータをプロパティを通して扱える実装となった)