Composable 함수 작성시에 중요한 사항
관용적인 Compose API 개발
세션에서 다루는 가이드라인은
- 프레임워크 : 엄격한 규칙
- 라이브러리 : 가능한 가이드라인을 따르는 것을 권장
- 앱 개발 : 가이드라인을 권장 고려
새 API를 만드는 방법
하나의 컴포넌트, 하나의 문제를 한 곳에서 해결
suggestions/quick actions과 같은 기능이 추가로 필요한 경우, 다른 목적을 가진 FilterChip 변형 버전이 필요해진다
FilterChip에 더 많은 옵션을 넣기? | 완전 별개의 컴포넌트로 만들기? |
---|---|
![]() |
![]() |
앱 디자인에 일관된 요구 사항이 있지만, 다소 유사한 컴포넌트의 변형에 대한 요구 사항이 있다면 새로운 컴포넌트를 레이어 위에 구축하는 것이 좋다.
계층화된 상위 수준의 API는 더 많은 제약이 따르며 특정 동작과 기본값을 제공하고 커스텀 옵션이 더 적다. 레이어는 일반 Chip과 같이 하위 수준의 컴포넌트 위에 만들어져야 한다.
단순하고 하위 수준의 컴포넌트는 커스텀 정의에 더 개방적이어야 한다. 즉, 하위 수준에서 상위 수준 API로 이동할 때 동작이 증가/커스텀 옵션이 줄어든다.
이 전략에 의거해 Compose는 suggestion/assist/input chips의 새로운 레이어를 선택했다
새로운 API는 필요성을 정당화해야함. 새 컴포넌트를 만들거나 기존 컴포넌트에 위임하는 방법 중 하나를 선택하면 됨
클래스 네이밍 규칙
을 사용함수 네이밍 규칙
을 사용
remember라는 접두사
를 붙여야 한다파라미터 : API의 목적과 요구 사항을 정의하는 데 매우 중요
컴포넌트는 자체 내부 동작과 외관을 담당하고, Modifier는 외부 컴포넌트를 잘 수정하는 역할을 담당
컴포넌트 사용자는 이미 Modifier를 어디에 어떻게 사용할지에 대한 기대치가 있다
Modifier가 Composable 동작과 Shape을 설명하는 경우 명시적인 파라미터가 왜 필요한가?
파라미터의 순서 정의
스타일/옵션과 같은 세부 집합의 경우, 기본값을 제공하며 API가 독립적으로 사용 가능하도록 하는 것이 좋다
기본 스타일링 값이 짧고 예측 가능한 경우 간단한 inline 상수로 가능
기본값이 많이 필요한 경우, 컴포넌트 기본값을 사용하여 한 곳에 맵핑 가능 (예: ChipDefaults)
상태에 따른 조건 처리도 기본 API에 위임 가능하다
Slot 파라미터/컨텐츠 : 부모 컴포넌트 내부의 빈 공간을 자식 컴포넌트로 채우도록 지정하는 Composable 람다 파라미터
Chip의 경우
컴포넌트 내부/외부에서 일어나는 변경 사항을 관리할 메커니즘에 State가 필요함
Chip Composable은 활성화/비활성화 상태에 따른 UI에 영향을 주는 프로퍼티가 필요함
상태 처리 방법
가능하면 stateless 방식을 추천
-> 상태 컨트롤을 추출하는 것을 상태 호이스팅
이라고 함
API 컨트롤은 외부에 있지만, 클릭과 같이 호출자에게 신호를 보낼 방법이 필요
MutableState/Immutable 상태 API를 직접 파라미터로 전달은 하지 말아야 한다
-> 명시적인 입력이어야 한다
접근성/테스트/문서화/이전 버전과의 호환성 등 중요한 요구사항을 충족하는지 확인 필요
-> 장기적으로 견고하고 신뢰할 수 있는 API가 되길 희망
접근성
API에 명시적인 semantic 세트가 필요한 경우 non-optional 접근성 파라미터를 요청
예 : image composable의 contentDescription 프로퍼티
Chip composable
파라미터 대신 Slop 컨텐츠 방식으로도 사용 가능
격리된 상태에서 얼마나 testable한지 확인하는 것은 잘 만들어진 API의 좋은 지표이며, 더 큰 복합 컴포넌트의 일부로서도 테스트가 더 쉬워진다.
특정 Activity/Context가 필요한 경우, test/preview에서 리소스에 접근할 수 없기 때문에 testable이 제한된다
더 나은 대안 : Click 이벤트로 activity 시작에 context가 필요하면 Click 람다 파라미터로 제공하여 호출자에게 책임을 위임하는 것
API를 테스트할 때는 가능한 모든 상태를 쉽게 확인할 수 있어야 한다
좀 더 상태를 쉽게 테스트하기 위해서 interactionSource를 사용할 수 있다
특정 컴포넌트를 테스트에서 식별하는데 testTag를 지정 가능
API의 장기적인 안정성과 유지보수를 위해 적절한 문서 작성도 필요
comments powered by Disqus
Subscribe to this blog via RSS.
Jetpack Compose: LazyColumn/LazyRow 내부 코드 분석 ~ 2부 LazyList (2) rememberLazyListMeasurePolicy
Posted on 09 Feb 2025Jetpack Compose: LazyColumn/LazyRow 내부 코드 분석 ~ 2부 LazyList (1)
Posted on 25 Jan 2025Jetpack Compose: LazyColumn/LazyRow 내부 코드 분석 ~ 1부 LazyColumn/LazyRow
Posted on 10 Jan 2025