2つのサブクラスDollarとFrancにはもうコンストラクタしか残っていない。
コンストラクタだけのサブクラスを残しておく理由はないので、サブクラスを消してしまいたい。
サブクラスのあらゆる参照を消し去ることが目的。
まずは親クラスのFrancを返していたメソッドから変更し、同様にDollarもMoneyにする。
変更前
playground.swift
static func dollar(_ amount:Int) -> Dollar{
return Dollar(amount,"USD")
}
static func franc(_ amount:Int) -> Franc{
return Franc(amount,"CHF")
}
変更後
playground.swift
static func dollar(_ amount:Int) -> Dollar{
return Money(amount,"USD")
}
static func franc(_ amount:Int) -> Franc{
return Money(amount,"CHF")
}
次にクラスの等価性のテストに関しては他のテストで十分テストされているので、もう消せるのではないか?
playground.swift
func testEquality(){
assert(Money.dollar(5) == Money.dollar(5))
assert(Money.dollar(6) == Money.dollar(6))
assert(Money.franc(5) == Money.franc(5))
assert(Money.franc(6) == Money.franc(6))
assert(Money.franc(6) != Money.franc(3))
assert(Money.franc(6) == Money.dollar(6))
}
うん、、、いらないね、、、過剰テストなので消す。
playground.swift
func testEquality(){
assert(Money.dollar(5) == Money.dollar(5))
assert(Money.dollar(6) == Money.dollar(6))
assert(Money.franc(6) == Money.dollar(6))
}
前章で書いたテスト、testDifferentClassEquaユユtyは複数のクラスがある状況でしか意味をなさない。
ましてやサブクラス消すのでこのテストは消すぞ。
次にtestFrancMultiplicationはFrancに依存してる。こいつも消すぞ。
あらゆるものをけした結果以下のようになるぞ。(雑
playground.swift
var moneytest = MoneyTest()
moneytest.testMultiplication()
moneytest.testEquality()
moneytest.testCurrency()
class MoneyTest{
init(){}
func testMultiplication(){
var five:Money = Money.dollar(5)
assert(Money.dollar(10) == five.times(2))
assert(Money.dollar(15) == five.times(3))
}
func testEquality(){
assert(Money.dollar(5) == Money.dollar(5))
assert(Money.dollar(6) == Money.dollar(6))
assert(Money.franc(6) != Money.dollar(6))
}
func testCurrency(){
assert("USD" == Money.dollar(1).currency())
assert("CHF" == Money.franc(1).currency())
}
}
///親クラス
class Money :Equatable{
var _amount:Int
var _currency:String
init(_ amount:Int,_ currency:String){
self._amount = amount
self._currency = currency
}
static func == (lhs: Money, rhs: Money) -> Bool {
print(lhs.currency())
print(rhs.currency())
return lhs._amount == rhs._amount &&
lhs.currency() == rhs.currency()
}
func currency() -> String{
return _currency
}
func toString() -> String{
return _amount.description + " " + _currency
}
func times(_ multiplire:Int) -> Money{
return Money(_amount * multiplire, _currency)
}
static func dollar(_ amount:Int) -> Money{
return Money(amount,"USD")
}
static func franc(_ amount:Int) -> Money{
return Money(amount,"CHF")
}
}