Skip to content

Instantly share code, notes, and snippets.

@yanzm
Created February 12, 2019 02:25
Show Gist options
  • Select an option

  • Save yanzm/1ef33e9ae792d2992358fb6a1691f413 to your computer and use it in GitHub Desktop.

Select an option

Save yanzm/1ef33e9ae792d2992358fb6a1691f413 to your computer and use it in GitHub Desktop.

Revisions

  1. yanzm created this gist Feb 12, 2019.
    73 changes: 73 additions & 0 deletions sample.kt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,73 @@
    //
    // DroidKaigi 2019 の 「ぼくのかんがえた最強の Usecase の作り方」 https://www.youtube.com/watch?v=bw8bckLSKiM
    // というセッションで出てきたビジネスロジックの実装を考えてみました。
    //
    // - 設定が有効なら救急の番号には Prefix をつけない
    // - 設定が有効ならフリーダイアルの番号には Prefix をつけない
    // - 無視リストの宛先には Prefix をつけない
    //
    data class PhoneNumber(private val number: String) {
    init {
    for (c in number) {
    check(Character.isDigit(c))
    }
    }

    val isEmergencyCall: Boolean
    get() = EmergencyCall.contains(number)

    val isFreeDial: Boolean
    get() = FreeDial.contains(number)

    fun withPrefix(prefix: String): PrefixedPhoneNumber {
    return PrefixedPhoneNumber(number, prefix)
    }
    }

    data class PrefixedPhoneNumber(
    val original: String,
    val prefix: String
    ) {
    val number = prefix + original
    }

    interface PrefixForEmergencyCall {
    val isEnabled: Boolean
    }

    interface PrefixForFreeDial {
    val isEnabled: Boolean
    }

    interface IgnorePhoneNumbers {
    operator fun contains(phoneNumber: PhoneNumber): Boolean
    }

    class PrefixPhoneNumber(
    private val prefixForEmergencyCall: PrefixForEmergencyCall,
    private val prefixForFreeDial: PrefixForFreeDial,
    private val ignorePhoneNumbers: IgnorePhoneNumbers
    ) {

    fun getPrefixedNumber(phoneNumber: PhoneNumber): PrefixedPhoneNumber {
    if (prefixForEmergencyCall.isEnabled && phoneNumber.isEmergencyCall) {
    return phoneNumber.withPrefix(PREFIX_NONE)
    }

    if (prefixForFreeDial.isEnabled && phoneNumber.isFreeDial) {
    return phoneNumber.withPrefix(PREFIX_NONE)
    }

    if (phoneNumber in ignorePhoneNumbers) {
    return phoneNumber.withPrefix(PREFIX_NONE)
    }

    return phoneNumber.withPrefix(PREFIX)
    }

    companion object {
    private const val PREFIX = "" // TODO
    private const val PREFIX_NONE = ""
    }
    }