Pythonにおけるクラス
Python のクラス(javaとの比較)
Pythonのクラス
Python でクラスの書き方を調べたのでjavaとの比較で整理します。
# 商品 class Goods: def __init__(self, price): if price < 0: raise ValueError('価格は0円を超えること') self._price = price # 価格 self._tax = 0 # 消費税率 @property def tax(self) -> float: return self._tax @tax.setter def tax(self, tax): if tax < 0.0 or 1.0 < tax: raise ValueError('税率は0.0 〜 1.0 で入力') self._tax = tax @property def price(self): return int(self._price * (1.0 + self._tax)) goods = Goods(2000) goods.tax = 0.18 print(goods.price)
結果は 2360
java で書くとしたら
僕が対外的に、使えると言える言語のjavaで書くとしたら
import java.math.BigDecimal; /** * 商品 */ public class Goods { // 価格 private int price; // 消費税率 private BigDecimal tax; public Goods(int price) { if (price < 0) { throw new IllegalArgumentException("価格は0円を超えること"); } this.price = price; this.tax = BigDeceimal.ZERO; } public BigDecimal getTax() { return tax; } public void setTax(BigDecimal tax) { if (tax < BigDecimal.ZERO && BigDecimal.ONE < tax ) { throw new IllegalArgumentException("税は0 〜 1 で入力"); } this.tax = tax; } public int price() { return BigDecimal.valueOf(getPrice()).multiply(tax).intValue(); } }
雑感
java
- javaは呪文が長いのがアレだけど、オブジェクト指向のために作られた言語って感じです。「私をオブジェクト指向で書いて」って。
- カプセル化が前提です。自クラスのフィールドにもアクセッサ経由で値を取得するようにすると、継承時に振る舞いを変えやすくなります。
- ちなみに商品価格と税は関心が分離されると思われますので、実業務では同一クラスにしないです。軽減税率の実装もしにくくなりますし。