일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 리펙토링
- UICollectionView
- map
- ios
- 클린 코드
- SWIFT
- ribs
- rxswift
- collectionview
- RxCocoa
- Protocol
- Observable
- 리팩토링
- MVVM
- clean architecture
- UITextView
- Clean Code
- 스위프트
- Xcode
- swiftUI
- uitableview
- HIG
- uiscrollview
- tableView
- 애니메이션
- Human interface guide
- swift documentation
- combine
- 리펙터링
- Refactoring
- Today
- Total
목록Refactoring (Marting Flowler) (8)
김종권의 iOS 앱 개발 알아가기
함수 옮기기 어떤 함수가 자신이 속한 모듈 A의 요소들마다 다른 모듈 B의 요소들을 더 많이 참조하면 모듈 B로 옮겨줘야 좋은데, 이때 함수를 이동시큰 것 '모듈성'을 위해 이동 모듈성이란? 프로그램의 어딘가를 수정하려 할 때 해당 기능과 깊이 관련된 작은 일부만 이해해도 가능하도록 해주는 것 모듈성은 서로 연관된 요소들을 묶고, 요소의 연결관계를 쉽게 찾고 이해할 수 있도록 하는 것 중첩된 함수가 어떻게 보면 은닉화라고 생각할 수 있지만, 중첩되면 그 안에서 숨겨진 데이터끼리 상호 의존하기가 아주 쉬운 구조가 쉬운 형태가 되므로 차라리 중첩하지 않고 바깥으로 빼내고 함수 내부에서는 parameter를 받아서 처리하게끔하는 구조로 구현할것 함수 옮기기 예제 ex) GPS 기록의 총 거리를 계산하는 tra..
위임 숨기기 * swift에서 자주사용하는 delegate와는 다른 개념임을 주의 B안에 C인스턴스가 있고 A가 C에 접근할때, B.C로 접근하지 않고 B에서 C를 리턴하는 메소드를 만들어, 사용하는 쪽에서는 B를 모르게끔 수정하는 방법 (기대효과: 사용하는쪽에서 B를 모르는 상태이므로, B의 코드를 수정할때 사용하는쪽을 신경쓰지 않고 쉽게 수정이 가능) 모듈화 설계의 핵심은 캡슐화이며, 캡슐화는 모듈들이 시스템의 다른 부분에 대해 알아야 할 내용을 줄여주는 것 무언가를 변경해야 할 때 함께 고려해야할 모듈 수가 적어져서 코드 변경이 쉬워짐 반대 리펙토링: 중개자 제거하기 위임 숨기기 예시) 리펙토링 전) 사용하는쪽에서 person.department.manager으로 접근하므로 department가 삭..
클래스 or 구조체 추출하기 * 아래부터 편의상 구조체 추출하기도 클래스 추출하기로 명칭 클래스 안에 일부 property나 메소드를 또다른 클래스로 묶을 수 있다면 따로 그 요소들을 별도의 클래스로 만드는 것 클래스는 데이터가 추가되고, 연산이 추가되다보면 어느새 비대해지는데, 역할이 많을수록 복잡도가 증가하는데 이 것을 클래스 추출하기를 통해 해결이 가능 하나의 클래스에는 하나의 성격만 담도록 코딩하다보면 나중에 변경할때도 다른 사이드 이펙을 고려하지 않고 쉽게 수정이 가능 ex) 구조체 추출하기 struct Person { let officeAreaCode: String let officeNumber: String func getOfficeAreaCode() -> String { officeArea..
레코드란? 데이터를 저장하는것을 의미 대표적인 레코드 표현 구조는 list, dictionary, hash 3가지 캡슐화란? 클라이언트 코드에서(=사용하는쪽) 사용하는 것만 관심있고 내부에서는 어떻게 처리하고 있는지 모르게하는 방법 구현 내용 일부를 "은닉화"한다고도 불림 캡슐화하는 이유? 구현을 숨긴다는것은 클라이언트 코드에서 접근하지 못한다는 의미로, 구현부가 유연하게 변경되어도 클라이언트쪽 코드를 신경쓰지 않아도 되어 곧 개발자는 사용하는쪽을 신경쓰지 않고 구현부 하나만 신경쓸수 있는 장점이 존재 레코드 캡슐화 데이터를 저장하는 부분을 클라이언트 코드쪽에서 모르게끔 하는것 기대효과: 캡슐화되어 있으면 데이터가 변경되어도 클라이언트 코드는 영향이 가지 않기 때문에 더욱 유연한 코딩이 가능 레코드 캡슐..
리펙토링 핵심 각 방법들을 '왜' 수행해야 하는지 깨닫고 유연하게 적용하기 단계 쪼개기 서로 다른 두 대상을 한꺼번에 다루는 코드를 발견하면 각각을 별개 기능으로 나누는 방법 코드를 수정할 때 두 대상을 동시에 생각할 필요 없이 하나에만 집중할 수 있게끔하기 위함 기능이 잘 분리되어 있다면 다른 기능의 상세 내용은 전혀 기억하지 못해도 원하는 대로 수정을 쉽게 접근이 가능 단계 쪼개기 전략 1) 입력을 단순한 형태로 변경 (입력이 처리 로직에 적합하지 않은 형태로 들어오는 경우, 먼저 입력값을 다루기 편한 형태로 가공할것) 2) 처리 로직을 순차적인 단계들로 분리하고 이 단계는 서로 확연히 다른 일을 수행하도록 구현 ex) 단계 쪼개기 전략이 적용된 사례 - 컴파일러 컴파일러는 어떤 코드를 입력받아서, ..
리펙토링 핵심 각 방법들을 '왜' 수행해야 하는지 깨닫고 유연하게 적용하기 함수들을 클래스로 묶기 함수는 데이터를 입력받아서 여러가지 정보를 얻는데, 이렇게 입력받는 데이터들의 중복을 줄이기 위한 방법 매개변수 같은 중심(공통 데이터)으로 긴밀하게 엮여 작동하는 함수 무리를 하나의 함수로 묶는 것 장점 - 중복코드를 막고 함수들이 공유하는 공통 환경을 더욱 명확하게 표현이 가능 ex) 여러 함수를 묶기 - 보일러 사용량과 기간에 대해 세금을 계산하는 코드 // 보일러 사용 정보 struct UseInfo { let quantity = 1 let month = 2 let year = 3 } // 보일러 정보 획득 func getUseInfo() -> UseInfo { UseInfo() } // 기본적으로 ..
리펙토링 핵심 각 방법들을 '왜' 수행해야 하는지 깨닫고 유연하게 적용하기 변수 추출하기 표현식이 너무 복잡한 경우, 따로 지역변수로 빼서 표현식을 쪼개어 관리하는 방법 표현식에 이름을 붙이는 것 반대 리펙토링: 변수 인라인하기 ex) 가격을 구하는 함수 getPrice(order:) 내부를 변수 추출하기 리펙토링 초기상태 struct Order { let quantity: Double let price: Double } let order = Order(quantity: 100, price: 3000) let price = getPrice(order: order) private func getPrice(order: Order) -> Double { // 가격 = 기본가격 + 배송비 - 할인 order.q..
리펙토링 핵심 각 방법들을 '왜' 수행해야 하는지 깨닫고 유연하게 적용하기 함수 추출하기 하나의 블록 안에 있는것을 함수로 빼는 것 반대 리펙토링: 함수 인라인하기 ex) 함수 추출하기 예제 리펙토링 전 func printSome() { let person = Person() person.name = "jong" person.age = 20 print("person's name: \(person.name)") print("person's age: \(person.age)") } 함수 추출하기 리펙토링 반영 func printSome() { let person = Person() person.name = "jong" person.age = 20 print("person's name: \(person.nam..