Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 블록체인
- 플레이프레임워크
- 엔터프라이즈 블록체인
- 그라파나
- akka 강좌
- Play2
- Play2 로 웹 개발
- 스칼라
- 파이썬 머신러닝
- 스칼라 강좌
- CORDA
- play2 강좌
- Golang
- hyperledger fabric
- 파이썬 동시성
- 파이썬
- play 강좌
- 주키퍼
- 안드로이드 웹뷰
- 파이썬 데이터분석
- 이더리움
- Akka
- 스위프트
- 하이퍼레저 패브릭
- Adapter 패턴
- Hyperledger fabric gossip protocol
- 하이브리드앱
- 파이썬 강좌
- 스칼라 동시성
- Actor
Archives
- Today
- Total
HAMA 블로그
[코틀린 코딩 습작] Double Dispatch 본문
interface Account {
}
class EthreumAccount(val gas: Int) : Account{
}
class FabricAccount(val org: String) : Account {
}
class BlockChain(val networks : Map<String,String>) {
fun send(account: Account) {
when(account) {
is EthreumAccount -> {
val gas = account.gas
val network = networks.get("eth")
println("send to ${network} with gas: ${gas}")
}
is FabricAccount -> {
val org = account.org
val network = networks.get("fab")
println("send to ${network} with org: ${org}")
}
else -> {
println("illegal parameter exception!!")
}
}
}
}
fun main() {
println ("================= start ================")
val blockchain = BlockChain(mapOf(Pair("eth","address-1"),Pair("fab","address-2")))
val account1 = EthreumAccount(3)
blockchain.send(account1)
val account2 = FabricAccount("navy")
blockchain.send(account2)
}
- BlockChain 클래스에 너무 많은 책임이 몰려있다.
- if문으로 새로운 account타입이 들어올 때마다 분기해줘야 한다.
더블디스패치방식으로 리팩토링 해보자.
import jdk.nashorn.internal.ir.Block
interface Account {
fun send(blockchain: BlockChain)
}
class EthreumAccount(val gas: Int) : Account{
override fun send(blockchain: BlockChain){
val network = blockchain.networks.get("eth")
println("send to ${network} with gas: ${gas}")
}
}
class FabricAccount(val org: String) : Account {
override fun send(blockchain: BlockChain){
val network = blockchain.networks.get("fab")
println("send to ${network} with org: ${org}")
}
}
class BlockChain(val networks : Map<String,String>) {
fun send(account: Account) {
account.send(this)
}
}
fun main() {
println ("================= start ================")
val blockchain = BlockChain(mapOf(Pair("eth","address-1"),Pair("fab","address-2")))
val account1 = EthreumAccount(3)
blockchain.send(account1)
val account2 = FabricAccount("navy")
blockchain.send(account2)
}
'Kotlin' 카테고리의 다른 글
[코틀린 코딩 습작] Visitor (0) | 2021.05.20 |
---|---|
[코틀린 코딩 습작] Intercepting Fillter (0) | 2021.05.15 |
[코틀린 코딩 습작] Annotation & Reflection (0) | 2021.05.15 |
[코틀린 코딩 습작] Future (0) | 2021.05.15 |
[코틀린 코딩 습작] recursive types bound (0) | 2021.05.11 |
Comments