Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 리펙토링 - 밀집된 코드 vs 분리된 코드 작성하기 (#응집도, #결합도, #과도한 분리(over-abstraction), #파일 점프) 본문

Refactoring (리펙토링)

[iOS - swift] 리펙토링 - 밀집된 코드 vs 분리된 코드 작성하기 (#응집도, #결합도, #과도한 분리(over-abstraction), #파일 점프)

jake-kim 2025. 5. 7. 01:35

밀집된 코드와 분리된 코드

  • 코드 관점에서 밀집된 코드와 분리된 코드가 있는데 가끔 어떤 방식으로 코드를 구현해야하는지 고민이 될 때가 있음 
    • cf) 응집도와 결합도: 흔히 알려진 개념인 응집도와 결합도는 모듈을 기준으로 한 모듈이 다른 모듈을 많이 의존한다면 결합도가 크고 응집도가 낮다고 함
  • 모듈 관점에서는 코드를 작성할때 모듈간에 최대한 모르게끔 하는 명확한 방법이 존재하지만, 모듈 내부에서 코드를 작성해나갈때 최대한 함수로 작성할지, 아니면 함수 없이 한곳에 작성할지 고민이 되는 경우가 있음

ex) VC가 로드될때 로딩을 돌리고, 카페 이름을 가져와서 뷰에 반영한 후 로딩을 멈추는 코드

1. 하나의 함수에 모든 과업 다 넣기

func viewDidLoad() {
  super.viewDidLoad()
  
  loadingView.start()
  
  let name = service.getName()
  let cafeNameTitle = "카페 이름 \(name)"
  cafeNameLabel.text = cafeNameTitle
  
  loadingView.stop()
}

2. 별도의 함수로 분리하여 과업 처리하기

func viewDidLoad() {
  super.viewDidLoad()
  updateCafeName()
}

func updateCafeName() {
  loadingView.start()
  
  let name = service.getName()
  let cafeNameTitle = "카페 이름 \(name)"
  cafeNameLabel.text = cafeNameTitle
  
  loadingView.stop()
}
  • 위와 같은 경우는 누가봐도 함수로 뺀것이 더욱 읽기가 쉬움
    • viewDidLoad에서 함수로 빼지 않으면 모든 코드를 읽어봐야 어떤 행위를 하고 있는지 알 수 있지만 함수로 뺀 경우, 함수 이름만 봐도 어떤 행위를 하는지 쉽게 예측이 가능하기 때문
    • 하지만 모든 케이스가 함수로 분리한다고해서 좋은것이 아님

과도한 분리

  • 클린 코드 책에서는 가능하면 함수로 분리하는것이 좋다고하지만 `과도한 분리`가 된다면 함수를 왔다갔다 하면서 읽어나가면서 가독성이 매우 떨어지는 경우가 존재

ex) 위에서 알아봤던 것을 함수로 최대한 분리한 것

override func viewDidLoad() {
    super.viewDidLoad()
    performInitialSetup()
}

func performInitialSetup() {
    startLoading()
    updateCafeNameLabel()
    stopLoading()
}

func startLoading() {
    loadingView.start()
}

func stopLoading() {
    loadingView.stop()
}

func updateCafeNameLabel() {
    let name = fetchCafeName()
    let title = generateCafeTitle(with: name)
    setCafeLabelText(to: title)
}

func fetchCafeName() -> String {
    service.getName()
}

func generateCafeTitle(with name: String) -> String {
    "카페 이름 \(name)"
}

func setCafeLabelText(to title: String) {
    cafeNameLabel.text = title
}
  • 그렇다면 어떤 기준을 가지고 함수로 빼야하는지, 빼지 않아야하는지 알 수 있는것일까?
    • 코드 점프 or 파일 점프가 많아질거 같은지 생각하면서 개발하기
    • 코드를 작성할 때 보통은 되도록 나눌라고 해도 단점이 있다는 것을 생각하며, 코드 점프 뿐만이 아닌 다른 파일로의 점프도 생각하면서 작성하는 것
    • 코드 점프와 파일 점프가 많아진다면 이론만 충실하고 나도 모르게 장황한 코드를 작성하고 있다는 것을 잊지 말기

 

Comments