스파게티코드 해결방안 고민하기

2024. 4. 15. 16:42iOS

스파게티코드를 보면...

  • 유지보수의 어려움
  • 재활용이 불가능
  • 버그의 온상
  • 생산성 저하

 

이런식의 문제점이 보이기 시작한다...

 

코드의 형테

  • 복잡한 제어문(goto, branch, loop, Cyclomatic complexith)
    • if문이 없다면 가독성이 좋아진다 읽기편하다
  • 많은 변수(단순히값을저장하는용도 ok)
    • 제어를 컨트롤 하기위한 용도 → 변수를 이용한 if, switch, for 등등.. 읽기 힘들게해버린다.
    • 제어에 사용되는 변수가 많을 수록 코드의 흐름을 따라가기 힘듦.
  • 잘못된 상속
    • 상속은 가장 강한 커플링중 하나
    • 코드를 읽을 때 현재 코드와 부모클래스의 코드를 오가면서 읽어야한다…….
    • override된 함수와 아닌 함수를 구분해야한다….. 이미 어렵다 그런데 잘못된 상속이 더해진다면 문제다.
  • 클래스 간 의존관계 정리가안됨
    • 클래스간 의존관계가 복잡하여 클래스를 독자적으로 재활용 할수없는상황
      • 클래스 동작을 위해서 다른 클래스 필요할때 강한참조인상황??
      • 클래스 재활용 하려고했는데 수십개의 클래스를 가져와야하는상황.??
  • 추상화 단계의 부재
    • 라면 조리방법도 추상화는 잘되있다….. 상세는(추가메서드)를 만들수있는것이다.
    • 디테일한 설명은 없다
    • 라면 조리과정을 3단계에서 설명한다.
    • 만일 각 단계에서 세부사항을 한다면??? 물→ 생수? 수돗물? 건더기 스프 → 비닐통째? 아님 비닐뜯어서? 물의 온도는? 이런 디테일 차이?

해결하기 위해서 준비해야할것들

  • OOP에 대해서 다시 제대로 공부해야지 해결이 가능
  • OOP를 배워야한다.
  • 디자인 패턴을 공부해야한다.
    • 먼가 썼는데 복잡해졌다면 잘못쓴거다..
  • 리팩토링 공부를 해야한다.
    • 기존의 레거시를 잡으려고 리팩토링을 하는것임
    • 버그가…. 버그를 안내려고 유닛테스트를 한다.

가장 먼저 선행되어야 할 것이 코드를 짧게 짜는 연습

  • 코드를 짧게 작성한다는 것의 의미
    • 전체적으로 코드양이 줄진않겠지만 관리비용이 덜해지니 좋아진다.
    • 발생한 다양한 문제들을 해결하는 가장 기본적인 준비 과정
    • 문제 해결의 단초
    • 로직과 구조가 단순화 되어 상관관계를 파악하기 쉬워짐
    • 요소의 분리
      • 하나의 함수가 여러개의 함수로 분리
      • 하나의 클래스가 여러개의 클래스로 분리
      • 하다보면 나름의 규칙을 세우고 그 규칙에 맞게 분리를 하기 시작
      • 추상화레벨을 생각하게된다 ,,, 각각의 역활이 명확해진다.
  • 추가적으로 생각해볼것들...
    • 어떻게 하면 더 간결하게 표현 할 수 있을지 고민하게 된다.
    • 어떻게 함수를 분리해야 할지 고민하게 된다.
    • 어떻게 클래스를 분리해야 할지 고민하게된다.
    • 핵심 키워드: 고민 딮다이브… 깊은고민을해서 만들어내야한다..
    • 실무에서 쓰기 어렵다.. 쉽지않음 그래도 어디까지나 연습해야한다. 실무에서도 적용하기위해 노력하면 습관이 된다.
    • 습관의힘! (찰스 두히그?)

고민의 시간을 많이 확보 하는 것이 중요

이후 학습할 디자인 패턴, 리팩토링같은 내용에 큰 도움이 된다.

분리된 함수와 클래스를 다시 어떻게 구조화 시킬것인지가 더 중요하다.

자주 분리를 하다보면 자연스럽게 잘 분리 하는것을 연습하게 됨

새로 분리된 클래스/함수는 응집도가 높아짐.

응집도가 높은 작은 클래스가 많아짐

클래스간 결합도를 낮추면 재활용 가능한 많은 클래스가 만들어짐

 

그렇다면??? 

결합도와 응집도

커플링이 심해진 코드를 스파게티 코드라고 한다.

응집도과 결합도를 이해해야 한다.

원인을 알아야지만 결과를 만들어 낼수있다.

결합도가 낮고 응집도가 높은 코드를 만들자!

  • 결합도
    • 왜 결합도가 높아졌고
    • 어떻게 하면 그 결합도를 낮출 수 있는지?
  • 결합도는 낮추자.
    • 파라미터나 메시지에 의해서 동작될때 약하다.
    • 내부 동작에 의존하게되면 높아진다.
  • 응집도 높아야한다.
    • 모듈 내부의 모든 기능이 단일 목적 수행
    • 다수의 관련 기능을 가질 때 모듈의 구성요소들이 그 기능을 순차적으로 수행(절차적응집도)
      • 뷰디드로드 → 뷰가 로드 되었을때 여러가지 메서드들이 있는데 서로 관련없는 메서드들이다 그래도 뷰에 나타나야하니깐 쓴다?? 그치만 거기에 그렇게 쓴다면 썪 좋은 코드는 아니다.
  • 응집도가 높은 클래스
    • 인스턴스 변수의 수가 적어야함(변수가 2개면 2가지의 일을 하고있지않을까? )
    • 각 메서드는 인스턴스 변수를 하나 이상 사용해야함
    • 메서드가 인스턴스 변수를 더 많이 사용할 수록 응집도가 높다.
    • 응집도가 높은 코딩을하는방법을 배워야한다.

'iOS' 카테고리의 다른 글

컴파일 최적화 방법  (0) 2024.05.05
Concurrency (await)  (0) 2024.04.16
OOP (객체 지향 프로그래밍)  (1) 2024.01.08
POP(프로토콜 지향 프로그래밍)  (0) 2024.01.08
APPDelegate  (1) 2023.12.03