iOS Study (Chapter 8 - 리팩토링)
이 포스트는 꼼꼼한 재은씨의 스위프트 기본편을 보고 스스로 공부한 내용을 정리한 포스트 입니다.
예제 코드
참고 자료
리팩토링 (Refactoring)
-
소프트웨어 공학에서
리팩토링(Refactoring)
은코드의 결과나 성능에는 영향을 미치지 않고 단지 가독성과 유지 보수의 편의를 위해 더 세련되고 구조화된 코드로 변경하는 것을 말한다.
전체적인 맥락에서 구조적 변화를 주어 유지보수하기 편리하도록 코드를 개선하는 것이 리팩토링 과정이다.
-
MyMovieChart도 마찬가지이다.
반복적인 코드를 작성했지만, 위의 그림의 코드만으로는 네 번째 데이터를 추가하기가 참 번거롭다.
-
데이터만 추가하면 되는 것이 아니라 그에 따른 코드들도 계속 추가해 주어야 하기 때문이다.
-
각 데이터를 추가하는 과정은 모두 거의 동일하다.
-
데이터를 추가하는 과정을 공통으로 엮고 데이터 세트만 따로 관리하는 방식으로 리팩토링 할 수 있다.
-
데이터 세트를 구성할 때에는 가급적 프로그래밍 로직이 포함되지 않게 하는 것이 좋다. 그래야 데이터를 넣고 빼기가 쉽다.
-
튜플이 적절한 자료 구조로 사용되는 이유가 여기에 있다. 데이터를 단순 나열하고 묶을 때에는 튜플만큼 편리한 것이 없다.
리팩토링 - 데이터 세트 정의
-
클래스 전체에서 참조할 수 있도록 프로퍼티로 선언하면서 동시에 튜플을 이용해서 데이터 세트를 구성했다.
-
데이터 세트 사이에 스위프트 코드가 추가된 것이 아니기 때문에 데이터를 추가하거나 삭제하기가 편리하다.
-
리팩토링 이전의 코드에서 데이터를 추가하기 위해 작성해야 했던 구문들을 보면
튜플로 데이터 세트를 구성한 것이 유지 보수를 편하게 만들어 준다는 것을 알 수 있다.
리팩토링 - 데이터 세트를 이용하여 list 배열에 담기
-
아래의 그림을 보면 알 수 있듯이 구성된 데이터 세트를 이용하여 MovieVO 타입의 인스턴스를 만든 다음 list 배열에 담아준다.
-
for ~ in 구문을 사용하여 데이터 세트를 순회하면서 값을 차례로 list 배열에 넣어준다.
-
클로저를 이용하여 프로퍼티 초기화 구문을 활용한다.
-
기존 코드는 var list = [MovieVO]()
이와 같은단순 선언 및 초기화 구문뿐이었다.
-
이 구문에 클로저를 이용한 리턴 값을 대입하고, 초기화 한다.
-
클로저에서는 데이터 세트에 정의된 데이터들을 for 루프 구문으로 순회하면서 차례로 인스턴스를 만들어 배열 변수 datalist에 차곡차곡 담는다.
-
모든 순회가 끝나고 나면 datalist를 리턴한다. 이를 통해 list 프로퍼티에는 데이터 세트를 이용하여 정의한 데이터들이 차례로 대입된다.
리팩토링 - 배열 변수 lazy var list
-
배열 변수 list에는 리팩토링 과정에서
lazy 키워드가 추가되었다.
-
여기에는 두 가지 이우가 있다.
-
1),
미리 생성해서 메로리를 낭비할 필요가 없기 때문이다.
lazy 키워드를 붙여서 변수를 정의하면 참조되는 시점에 맞추어 초기화되므로 메모리 낭비를 줄일 수 있다.
-
2),
lazy 키워드를 붙이지 않은 프로퍼티는 다른 프로퍼티를 참조할 수 없기 때문이다.
-
list 배열 변수를 초기화하는 데에는 dataset 프로퍼티가 필요하다.
-
하지만 프로퍼티들이 초기화되는 순서는 우리가 컨트롤할 수 있는 범위를 벗어나기 때문에 list 배열 변수의 클로저가 실행되는 시점에 dataset 배열이 초기화되어 있다고 보장할 수 없다. 때문에 일반 저장 프로퍼티끼리는 서로 참조할 수 없다.
-
하지만 lazy 키워드가 붙은 프로퍼티는 다른 일반 프로퍼티들이 초기화된 후 맨 마지막에 초기화될 뿐만 아니라, 초기화되는 시점도 우리가 통제할 수 있다.
-
따라서 lazy 키워드가 붙은 프로퍼티의 초기화 클로저 구문 내에서는 다른 일반 프로퍼티를 참조하는 것도 가능하다.
-
dataset 프로퍼티를 참조해야 하는 list 프로퍼티에 lazy 키워드가 추가된 것은 이같은 이유 때문이다.
-
-
-
리팩토링 전과 후
-
viewDidLoad() 메소드에 작성된 모든 내용을 제거한다.
-
이 메소드에서 처리했던 데이터 초기화는 데이터 세트와 프로퍼티 초기화 구문으로 나누어 구현되었다.
- 위의 그림은 리팩토링 전 코드이다.
- 위의 그림은 리팩토링 후 코드이다.