LoginSignup
0
0

More than 1 year has passed since last update.

SwiftでTDD写経 第六章 テスト不足に気づいたら

Posted at

まず継承を検討する。
Dollarを親とし、Fracを子クラスにすると考えた。
しかし、実際はこれはコードを削減にはつながらない。
(てか個人的にはむしろこの発想がやべぇ。普通しない)

次にMoneyという親クラスを検討する。
これは少し時間がかかるが、非常にうまくいく。

なお、SwiftにはJavaのprotectedのようなものはない!!!
(aaaaa!罪を贖えぬ!!!!!

本書には共通メソッド、共通プロパティ親クラスに移す手順が書かれている。
コピペしているわけだから、共通プロパティはamount、メソッドはequalメソッドとすぐわかる。
ちょっとjavaと書き方変わるけど,swiftだとこんな感じですかね。

playground.swift

var moneytest = MoneyTest()

moneytest.TestMultiplication()
moneytest.TestEquality()
moneytest.TestFrancMultiplication()

class MoneyTest{
    init(){}

    func TestMultiplication(){
        var five = Dollar(5)
        assert(Dollar(10) == five.times(2))
        assert(Dollar(15) == five.times(3))
    }

    func TestEquality(){
        assert(Dollar(5) == Dollar(5))
        assert(Dollar(6) == Dollar(6))
        assert(Franc(5) == Franc(5))
        assert(Franc(6) == Franc(6))
    }
    
    func TestFrancMultiplication(){
        var five = Franc(5)
        assert(Franc(10) == five.times(2))
        assert(Franc(15) == five.times(3))
    }
}
///親クラス
class Money :Equatable{
    var amount:Int
    init(_ amount:Int){
        self.amount = amount
    }
    static func == (lhs: Money, rhs: Money) -> Bool {
        return lhs.amount == rhs.amount
    }
}

///Dollar子クラス
class Dollar:Money {
    override init(_ amount:Int){
        super.init(_ :amount)
        self.amount = amount
    }
    
    func times(_ multiplire:Int)  -> Dollar{
        return Dollar(amount * multiplire)
    }
}

///Franc子クラス
class Franc:Money {
    override init(_ amount:Int){
        super.init(_ :amount)
        self.amount = amount
    }
    
    func times(_ multiplire:Int)  -> Franc{
        return Franc(amount * multiplire)
    }
}


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0