일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- uiscrollview
- 클린 코드
- Refactoring
- 스위프트
- ribs
- tableView
- RxCocoa
- rxswift
- Observable
- Xcode
- UITextView
- 리펙터링
- collectionview
- UICollectionView
- swiftUI
- MVVM
- SWIFT
- Human interface guide
- 리팩토링
- swift documentation
- uitableview
- 애니메이션
- clean architecture
- ios
- map
- Protocol
- combine
- Clean Code
- HIG
- 리펙토링
- Today
- Total
목록상속 리펙토링 (4)
김종권의 iOS 앱 개발 알아가기
상속 관계를 제거하고 Wrapper 만들기 상속의 단점 (이전 포스팅 글에서 알아본 내용 복습) 단점1) 수퍼클래스와 서브클래스간의 결합도가 증가하여 부모를 수정하면 자식들의 기능을 헤칠 수 있음 단점2) 사람 객체의 동작이 나이대와 소득 수준으로 나뉜다면, 서브클래스를 부자와 서민으로 나눌 것인데 이렇게 된다면 각 서브클래스에서 하나의 인스턴스로 두 기능 모두 사용이 불가능한 상태 상속을 제거하려는 목적이 있고 새로운 기능이 별로 추가되지 않을 때 wrapper 모델을 만들고 여기에 추가 기능 확장을 하는 방식 ex) Person 이라는 모델이 있고 여기에 사람에 대한 정보가 있을 때, User라는 모델을 만들고 싶은 경우? struct Person { let name: String let age: I..
서브 클래스를 델리게이트로 바꾸기 특정 타입에 따라 동작이 달라지는 경우, 주로 enum case로 분기하여 구현하지만 저번시간에 알아본대로(이전 글 참고) 상속 관계를 만들면 SRP를 지키면서 더욱 유지보수 하기 쉽게 코드 관리가 가능 공통 코드는 수퍼클래스가 책임지고, 각각의 기능은 서브클래스로 정의하여 각 하나의 역할을 담당하도록 구현하는 것 이처럼 서브 클래스의 장점도 많지만, 단점이 존재 단점1) 수퍼클래스와 서브클래스간의 결합도가 증가하여 부모를 수정하면 자식들의 기능을 헤칠 수 있음 단점2) 사람 객체의 동작이 나이대와 소득 수준으로 나뉜다면, 서브클래스를 부자와 서민으로 나눌 것인데 이렇게 된다면 각 서브클래스에서 하나의 인스턴스로 두 기능 모두 사용이 불가능한 상태 서브 클래스를 델리게이..
케이스를 서브클래스로 바꾸기 특정 타입에 따라서 기능을 달리해야하는 경우 보통 enum case로 타입을 구분하고 하나의 파일에서 분기를 넣는데, 이렇게되면 하나의 역할에 대해서만 책임 (Single Responsibility Prinsiple, SRP)을 지키지 못하는 코드로 변동 SRP를 지키지 못하면 type에 대한 특정 동작이 하나의 파일에 섞여나게되어, type에 대한 기능이 수정되어야 할 때 특정 type과 관련없는 코드가 변경될 우려가 존재 변경사항에 대해 코드를 수정해야하는 개발자 입장에서는 변경하려는 type 외에도 다른 type들도 고려하게되어 수정하기가 쉽지 않게 유지 SRP를 지키도록 type으로 하나의 파일에 여러개의 역할에 대해 구분할 때, 서브 클래스로 만들면 유지보수에 용이 ..
메서드 올리기 서브클래스들이 여러개 있을 때 이 클래스에서 동일한 내용을 정의하는 메서드가 있을 때 이 메서드를 수퍼클래스에 이동시켜서 중복을 제거할 수 있음 중복의 위험) 동일한 로직을 사용하고 있는 중복 코드에서, 한쪽의 변경이 다른 쪽에는 반영이 안되는 이슈가 발생할 수 있는 가능성 존재 예시) 메서드 올리기 Member라는 수퍼 클래스가 있고 서브 클래스로 Developer, FireFighter가 존재 얼핏보면 메서드 이름이 달라서 다른 메서드인것 같지만 같은 역할을 하는 것이므로 getFullname(), getName()을 하나로하여 수퍼 클래스로 이동이 필요 class Member { var age: Int var name: String init(age: Int, name: String) ..