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)
}
}
}
단계:
부족:
이것 은 자바 의 전형 적 인 건설 자 모델 이지 만 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"
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.