ごらくらいふ

プログラミングしたりゲームしたり

型に語らせて in kotlin (and java ?)

某本の某コードをkotlin化している。

この本はちょっとしたイラッを無数に積み重ねる反面教師本だと感じている。

何を悪しとして何を良しとしたかの備忘録。

あまり手を加えず、本件とは無関係の要素を削ぎ落としたコード片が以下の通りである。

abstract class Token {
    open fun isIdentifier():Boolean { return false }
    open fun getText():String { return "" }
}
class Lexer {
    inner class IdToken(private val value:String) :Token {
        override fun isIdentifier(): Boolean { return true }
        override fun getText(): String { return value }
    }
    fun read(): Token {
        // 諸々省略
        return IdToken()
    }
}
class Leaf {
    fun parse(lexer: Lexer) {
        val t = lexer.read()
        if (t.isIdentifier()) {
            // なにかしらの処理
        }
    }
}

少しイラッとしただろうか。欠片でも伝われば報われる。

何がクソだと感じたか

  • super classであるToken特定のsub classの存在を予定しているところ

お前なんかこうだ!

abstract class Token {
    open fun getText():String { return "" }
}
inner class IdToken(private val value:String) :Token {
    override fun getText(): String { return value }
}
class Lexer {
    fun read(): Token {
        // 諸々省略
        return IdToken()
    }
}
class Leaf {
    fun parse(lexer: Lexer) {
        val t = lexer.read()
        if (t is IdToken) {
            // なにかしらの処理
        }
    }
}

javaにだってinstanceof演算子がいるからできるでしょ。

型に語らせれば分かることをis**(Type)**化する意味はない。