Android 디자인 모드 (2) 작성 자 모드

건설 자 모델 이 해결 하 는 것 은 복잡 한 대상 의 구축 과 그 표현 을 분리 시 켜 대상 의 구축 과정 을 서로 다른 표현 으로 하 는 것 이다.무슨 소리 야?
fun main(args: Array) {
    MacBook(15,8,16,512,true,"test","")
}

class MacBook(private var screenSize:Int,
              private var cpuCore:Int,
              private var ramCapacity:Int,
              private var diskCapacity:Int,
              private var appleCare:Boolean,
              private var engraveWords:String,
              private var protectingShell:String)

이런 너무 긴 매개 변수 구조 함수 에 직면 하여 우 리 는 건설 자 모델 을 통 해 개조 해 야 한다.
앞서 언급 한 공장 모델 이 든 단일 사례 든 선택 가능 한 매개 변 수 를 대량으로 확장 하 는 문 제 를 해결 하지 못 했다. 예 를 들 어 우 리 는 MacBook 을 구 매 할 때 선택 가능 한 제품 맞 춤 형 제작 을 한다. 예 를 들 어 화면 크기, 프로세서 종류, 메모리 크기, 하 드 디스크 크기, Applecare, 명심 내용, 부품 등 이다.
업무 중 에 도 우 리 는 중첩 구조 기 (telescoping constructor) 를 자주 사용 합 니 다. 먼저 필요 한 매개 변수 만 있 는 구조 함 수 를 제공 하고 다른 매개 변수 조합의 구 조 를 제공 하지만 매개 변수 가 너무 길 면 유지 에 불리 합 니 다.그래서 우 리 는 건설 자 모델 로 개조 했다.
fun main(args: Array) {
    MacBook.Builder()
            .setScreenSize(15)
            .setCpuCore(8)
            .setRamCapacity(16)
            .setDiskCapacity(512)
            .setAppleCare(true)
            .build()
}

class MacBook private constructor(var screenSize: Int,
                                  var cpuCore: Int,
                                  var ramCapacity: Int,
                                  var diskCapacity: Int,
                                  var appleCare: Boolean) {

    class Builder(private var screenSize: Int? = null,
                  private var cpuCore: Int? = null,
                  private var ramCapacity: Int? = null,
                  private var diskCapacity: Int? = null,
                  private var appleCare: Boolean = false) {

        fun setScreenSize(screenSize: Int?): Builder {
            this.screenSize = screenSize
            return this
        }

        fun setCpuCore(cpuCore: Int?): Builder {
            this.cpuCore = cpuCore
            return this
        }

        fun setRamCapacity(ramCapacity: Int?): Builder {
            this.ramCapacity = ramCapacity
            return this
        }

        fun setDiskCapacity(diskCapacity: Int?): Builder {
            this.diskCapacity = diskCapacity
            return this
        }

        fun setAppleCare(appleCare: Boolean): Builder {
            this.appleCare = appleCare
            return this
        }

        fun build(): MacBook {
            return MacBook(screenSize!!, cpuCore!!, ramCapacity!!, diskCapacity!!, appleCare)
        }

    }
}

단계:
  • 내장 형 빌 더 가 MacBook 대상 을 만 드 는 것 을 정의 합 니 다
  • 사유 화 된 MacBook 의 구조 함수 로 MacBook 을 통 해 인 스 턴 스 를 직접 설명 할 수 없 도록 확보 합 니 다
  • Builder 클래스 에서 정 의 된 선택 가능 한 속성 을 통 해 대상 이 만 든 콘 텐 츠 를 맞 춥 니 다
  • build () 방법 으로 MacBook 인 스 턴 스 를 되 돌려 줍 니 다
  • 이렇게 하면 구조 함수 에서 파 라 메 터 를 직접 설정 하 는 것 보다 훨씬 우아 합 니 다. 인 스 턴 스 를 만 들 때 set 방법 에 대해 값 을 부여 하면 됩 니 다.
    부족:
  • 업무 수요 파라미터 가 매우 많 을 때 코드 는 여전히 비교적 길 어 보인다
  • build () 방법 은 호출 을 잊 어 버 리 는 경우 가 많다
  • 인 스 턴 스 를 만 들 때 먼저 구조 기 를 만들어 야 합 니 다.

  • 이것 은 자바 의 전형 적 인 건설 자 모델 이지 만 kotlin 에서 우 리 는 이 를 사용 하 는 것 을 피 할 수 있 습 니 다. 왜냐하면 건설 자 모델 은 본질 적 으로 구 명 된 선택 가능 한 매개 변 수 를 모 의 했 기 때 문 입 니 다. 예 를 들 어 Flutter 중의 Dart 사용 { } 이 구 명 된 매개 변 수 를 전달 할 때 매개 변수 순서 와 무관 하기 때 문 입 니 다. 물론 kotlin 도 이러한 특성 을 지원 합 니 다.
    void printTest(String name1, {String name2, String name3}) { }

    선택 가능 한 인자
    kotlin 함수 와 구조 기 는 모두 서명 선택 가능 한 인 자 를 지원 합 니 다. 저 희 는 data class 를 이용 하여 데이터 류 를 직접 설명 합 니 다.
     fun main(args: Array) {
        MacBook(screenSize = 15)
        MacBook(appleCare = true ,screenSize = 15,cpuCore = 8)
    }
    data class MacBook(val screenSize: Int? = null,
                       val cpuCore: Int? = null,
                       val ramCapacity: Int? = null,
                       val diskCapacity: Int? = null,
                       val appleCare: Boolean? = null)

    이렇게 하면 우리 가 대상 을 설명 할 때 모든 매개 변수 이름 은 명시 적 이 고 순서대로 매개 변수 내용 을 정의 하지 않 아 도 되 며 매개 변 수 는 val 에서 설명 하 는 것 이 더욱 안전 합 니 다.
    requair 를 이용 하여 매개 변수 행동 제약 을 진행 합 니 다.
    업 무 를 더욱 안전 하 게 하기 위해 서 우 리 는 건설 자 모델 중의 속성 을 이용 하여 업무 행 위 를 제약 하 는 경우 가 많다.
    fun main(args: Array) {
        MacBook(cpuCore = 38)
    }
    
    class MacBook(val screenSize: Int? = null,
                       val cpuCore: Int? = null,
                       val ramCapacity: Int? = null,
                       val diskCapacity: Int? = null,
                       val appleCare: Boolean? = null) {
        init {
            require(cpuCore!! <= 32) {
                "CPU         "
            }
        }
    }

    이렇게 하면 우리 가 들 어 오 는 매개 변수 정의 가 requair 의 제약 에 부합 되면 이상 을 던 집 니 다.
    Exception in thread "main" java.lang.IllegalArgumentException: CPU         

    물론 이것 은 requair 예 시 를 설명 하기 위해 서 구체 적 인 이런 업 무 는 데이터 설정, 예 를 들 어 매 거 진, 사용자 정의 주석 등 상세 한 제약 을 해 야 한다.
    데이터 모델 독립
    여기 서 한 마디 더 하 겠 습 니 다. 상기 requair 는 data class 를 사용 하지 않 았 습 니 다. Kotlin 에 데이터 류 가 있 는 모델 은 자바 와 같은 모델 보다 더욱 간소화 되 고 간결 합 니 다.하나의 data 키워드 로 모든 매개 변수의 getters, setters, toString () 과 copy () 방법 을 추상 화하 여 우리 의 데이터 류 가 그들 이 유일 하 게 관심 을 가 져 야 할 일 인 데이터 모델 을 독립 적 으로 반영 할 수 있 도록 합 니 다.
    그래서 저 희 는 업무 개발 을 할 때 Kotlin 의 확장 을 통 해 업무 나 변환 논리 와 데이터 모델 을 분리 할 수 있 습 니 다. 예 를 들 어 저희 가 기업 급 IM 응용 에서 사용자 페이지 나 방문 내용 을 동적 으로 배포 해 야 합 니 다.
    data class RongCloudCast(
            val uuid: String,
            val departments: String,
            val category: String,
            val website: String,
            val version: String,
            val hashCode: String
    ) {
        //         
        fun getRouterBaseUrl(): String = "$departments/$category"
        //      WebView   URL
        fun getWebViewEntryUrl(): String =  "https://$website/$version/$hashCode"
    }

    이것 에 비해 확장 기능 으로 연결 논 리 를 완성 합 니 다.
    data class RongCloudCast(
            val uuid: String,
            val departments: String,
            val category: String,
            val website: String,
            val version: String,
            val hashCode: String
    )
    
    fun RongCloudCast.getRouterBaseUrl(): String = "$departments/$category"
    fun RongCloudCast.getWebViewEntryUrl(): String = "https://$website/$version/$hashCode"

    좋은 웹페이지 즐겨찾기