뷰 그리는 방식에 대한 논의(Factory vs MH커스텀 vs VC에서 설정)

2024. 12. 2. 10:12·UIKit

뷰를 그리는 컨벤션에 대해 심도있는? 논의를 하였다.

다들 생각하는 것이 달라도 한번 맞출 필요가 있다고 판단하였다.

아래는 날것.... 의 내용이다...

문제 상황

  • 아래 3개 중에 뭘 선택할지
    • UILabel을 생성하는 팩토리
    • 생성자로 모든 걸 받는 MHLabel
    • UIFont만 커스텀 하고, UILabel을 써서 ViewController에서 설정

문제 해결

UILabel+ Factory

  • 생성만 한다면, 서브클래싱을 안하고 Factory로 생성 가능
  • UILabel이라는 것을 알려서 UIKit관련 동작 외에 없음을 알릴 수 있음
  • 생성에 대해서 확장성, 유지보수성을 꾀할 수 있음
  • UILabel관련 버그만 발생해서 디버깅 용이
  • 기능적인 측면에서의 확장성이 적음
  • UI테스트에서 용이한가?

MHLabel

  • ViewController에서 생성자 하나로 설정 가능
  • 확장성이 3개중에 제일 좋음
    • 글자 간격
    • Gesture ..
  • 뎁스가 하나 더 깊어지는 문제가 있긴 함

(솔직히 MH가 간지긴함)

UILabel + UIFont

  • 처음 프로젝트를 접하는 사람의 입장에서 MHLabel이나 Factory처럼 한 단계 더 찾아들어가야하는 수고를 줄일 수 있다.
  • MHLabel의 경우 생성자 제외 추가적인 기능은 존재하지 않기 때문에 label의 config를 설정해주는 것 정도는 VC에서 해도 되지 않을까……라는 생각
  • 앱 전반적인 Label에 변화가 있다면 하나하나 수정해줘야한다.

영현

3 → 2 → 1

1, 2번… 오버엔지니어링…?

효준

1순위: LabelFactory

  • 확장성 고려
  • 생성자 하나로 설정과 관련한 불필요한 코드를 줄일 수 있음
  • 다른 사람이 코드 볼 때 한 뎁스를 더 타고 들어가야 하지만, 우리의 코드는 간단하다.

2순위: MHLabel

  • 다른 MH 시리즈와 함께 쓰면 우리만의 코드가 될 수 있다 ? (외관상)
    • MHNavigationBar
    • MHLabel

윤철

3 → 몰? → 루?

가장 베이직하고 이해하기 편하다.

디자인 패턴이나 새로운 클래스가 적용될 만큼의

정현

1-2-3

최종변론

효준

  • make(style: .default) 좋은 거 같습니다

영현

  • 매개변수로 모든 option들을 받을 것이라면 3번……개추…..
  • 매개변수 하나로 할 것이면 1,2번 좋을 것같습니다 .ᐟ.ᐟ

정현

  • Style을 따로 만드는 방식 좋을듯요
  • UILabel(style: .default)처럼 convenience init 만드는 것도 좋습니다.

윤철

  • 문득 이런 생각이 드네요
  • 얼마나 많은 회사에서 팩토리 패턴을 쓸까?
  • 특정 객체를 여러 군데에서 많이 사용하는 경우가 아니면 안쓸 거 같은 느낌?
  • 근데, 우리 앱은 사용자가 직접 글을 쓰는 서비스여서

깨달음: 논의를 먼저 하자….


let titleLabel: UILabel = MHLabelFactory().make(
    text: "가게 모아보기",
    alignment: .right,
    color: .black
)
let label3 = MHLabel(
    labelText: "가게 모아보기",
    alignment: .right,
    color: .white
)
let titleLabel: UILabel = {
    let label = UILabel()
    label.text = "가게 모아보기"
    label.font = UIFont.pretendard(size: 16, weight: .medium)
    label.textColor = .black
    label.translatesAutoresizingMaskIntoConstraints = false
    
    return label
}()

결론

  • UILabel(style: .default)처럼 convenience init 만드는 것으로 결정
    • 내부에는 Style을 enum으로 정의함

'UIKit' 카테고리의 다른 글

NotificationCenter의 removeObserver를 해야할까?  (0) 2024.12.03
무지성 MainActor를 붙인 상황에서 데이터가 로드되기 전에 뷰가 그려지는 문제 해결  (0) 2024.12.02
CollectionViewCell들 간의 Drag & Drop 구현하기  (1) 2024.12.01
CALayer를 사용할 때 발생하는 메모리 크래시  (0) 2024.11.29
런타임 시점에 Constraint를 조절하여 애니메이션 구현하기  (1) 2024.11.19
'UIKit' 카테고리의 다른 글
  • NotificationCenter의 removeObserver를 해야할까?
  • 무지성 MainActor를 붙인 상황에서 데이터가 로드되기 전에 뷰가 그려지는 문제 해결
  • CollectionViewCell들 간의 Drag & Drop 구현하기
  • CALayer를 사용할 때 발생하는 메모리 크래시
집주인들의 기술 블로그
집주인들의 기술 블로그
Memorial-House 집주인들의 기술 블로그
  • 집주인들의 기술 블로그
    Memorial House
    집주인들의 기술 블로그
  • 전체
    오늘
    어제
    • 🏠 집주인들 글 모아보기 (30)
      • iOS (5)
      • Combine (0)
      • Swift (7)
      • UIKit (7)
      • Xcode (6)
      • Architecture, Design Patter.. (3)
      • 기획 (1)
      • Github actions (1)
  • 링크

    • Github-Repository
    • Github-Wiki
    • Notion
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
집주인들의 기술 블로그
뷰 그리는 방식에 대한 논의(Factory vs MH커스텀 vs VC에서 설정)
상단으로

티스토리툴바