일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- collectionview
- map
- swiftUI
- 리펙터링
- tableView
- HIG
- UITextView
- 스위프트
- 애니메이션
- Protocol
- Clean Code
- RxCocoa
- combine
- MVVM
- swift documentation
- ribs
- 리팩토링
- clean architecture
- 리펙토링
- ios
- Xcode
- Observable
- Refactoring
- uiscrollview
- 클린 코드
- SWIFT
- rxswift
- uitableview
- Human interface guide
- Today
- Total
목록리팩토링 (18)
김종권의 iOS 앱 개발 알아가기
파생 변수를 질의 함수로 바꾸기 파생(Derived) 변수: 사용하는쪽에서 관심 밖의 변수들에도 영향을 주는 것 질의(Query) 함수: 사용하는쪽에서 관심 대상인 변수에만 영향을 주는 것 (단순 get, set) 파생 변수를 질의 함수로 바꾸기 리펙토링: 가변 데이터의 유효 범위를 줄이는 것 가변 데이터가 많아지면 한 쪽 코드에서 수정한 값이 연쇄 효과를 일으켜 다른 쪽 코드에 영향을 주어, 원인을 찾기 어려운 문제를 야기하므로 가변 데이터의 유효 범위를 줄이는 리펙토링이 필요 파생 변수를 질의 함수로 리펙토링 예시) Price에서 구조는 매우 안좋은 구조 discountedTotal의 정보를 변경하기 위해 setDiscountedTotal(number:)를 호출했더니 의도치 않게 안에서 discoun..
반복문을 파이프라인으로 바꾸기 파이프라인 코드란? 선언적으로 Collection 타입을 순회하는 방법 처리과정을 일련의 연산으로 표현하고, 이 연산은 컬렉션을 입력받아서 다른 컬렉션을 내뱉는 형ㅇ태 논리를 파이프라인(=선언적)으로 표현하면 이해하기가 쉬워지는 효과 객체가 파이프라인을 따라흐르며 어떻게 처리되는지 읽게끔 구현 반복문 형태의 코드 struct Person { let job: String let name: String } var names = [String]() let input = [ Person(job: "sicence", name: "kim"), .init(job: "programmer", name: "lee"), .init(job: "idol", name: "kim") ] // 반복문 ..
반복문 쪼개기 개념 그저 두 일을 한꺼번에 처리할 수 있어서 한 반복문 안에 두 가지의 일을 처리하는 경우가 있는데, 이렇게되면 반복문을 수정할 때 마다 두 가지 일 모두를 이해하고 진행해야 하므로, 분리해둘때 더욱 리펙토링이 용이 // 하나의 반복문에서 두 가지의 일 (averageAge, totalSalary를 처리하는 상황) struct Person { var age = 1 var salary = 2 } var averageAge = 0 var totalSalary = 0 let people = [Person(), Person(), Person()] for p in people { averageAge += p.age totalSalary += p.salary } averageAge /= people..
문장 슬라이드 관련된 코드끼리 모아두는 형태를 의미 관련된 코드들이 가까이 모여 있을때 이해하기가 더욱 쉽기 때문 변수 선언을 첫머리에 모아두는 것보다는 변수를 처음 사용할 때 선언하는 형태를 지향 ex) 문장 슬라이드가 필요한 코드 아래 코드는 변수 선언을 첫머리에 모아두는 코드지만, b 변수는 아래에서 사용되고 있으므로 아래로 이동시킬 것 func calculate() { var base = 1 let a: Int let b: Int // Order { Order() } private func chargeOrder(charge: Int) { print("charge:", charge) } 현재 가격 정책과(pricingPlan) 주문(order)을 받아서 지불(charge)을 계산하는 코드 // 문장..
인라인 코드를 함수 호출로 바꾸기 코드들을 함수로 호출하면 좋은 이유 함수의 이름은 코드의 동작 방식보다는 목적을 말해주기 때문에 함수를 활용하면 코드를 이해하기가 쉬움 함수는 여러 동작을 하나로 묶어주어, 특정 기능을 수정할때 함수로 되어 있다면 코드 부분을 찾기가 쉽고 코드 중복을 막아주는 효과도 동시에 적용 ex) 인라인 코드를 함수로 호출하기 (인라인 코드가 많은 형태) let states = ["KO", "US", "MA"] var appliesToMass = false for state in states { if state == "MA" { appliesToMass = true } } (함수로 호출하기) 코드의 라인 수도 줄어들고 함수의 이름을 보면 목적 파악이 명쾌하기 때문에 더욱 빠르게 읽..
테스트 코드가 개발 효율을 높여주는 이유? 테스트 코드는 디버깅하는데 시간을 줄여줌 개발자는 보통 실제로 코드를 작성, 설계하는 시간의 비중은 그리 크지 않고, 대부분의 시간은 디버깅에 소요 버그 자체를 수정하는데는 오랜 시간이 걸리지 않지만, 버그를 찾는데 오랜 시간이 소요 테스트 코드를 짠 경우 > 버그를 찾을려고 일일이 디버깅하지 않아도, 테스트 코드에 걸리게 되어 쉽게 잘못된 곳이 어디인지 파악이 가능 테스트 코드가 시간이 걸린다는 주장의 이유? 테스트 코드를 작성하려면 부가적인 코드를 상당량 작성해야 하는데, 실제로 테스트가 프로그래밍 속도를 높여주는 경험을 하지 않았기 때문에 시간이 걸린다고 느낄 수 있음 테스트 코드의 목적은 디버깅하는 시간을 줄여주는 것이므로, 그 관점에서 생각한다면 테스트..
중복 코드 똑같은 코드 구조가 여러곳에서 반복되는 주는 단점 코드가 중복되면 각각을 볼 때마다 서로 차이점은 없는지 주의 깊게 살펴야하는 부담이 존재 한 클래스에 딸린 두 개의 메소드가 똑같은 표현식 사용? -> 함수 추출하기를 사용 (6절에서 계속) 코드가 비슷한데 완전히 같지 않다면? -> 문장 슬라이드 (8절에서 계속) 긴 함수 오랜 기간 잘 활용되는 프로그램들은 짧은 함수로 구성 짧은 함수로 작성한다는 의미? 코드는 끝없이 위임하는 방식으로 작성되기 때문에 코드를 이해하고, 공유하고, 선택하기 쉬우려면 함수의 이름이 짧은 구성이 많을때 재 역할을 수행 예전 언어는 서브루틴을 호출하는 비용이 컸기 때문에 함수 호출을 없애는 방향이었지만 지금은 별 차이가 없으므로 함수를 적극 이용 장황한 네이밍보다는..
코드에서 나는 악취 리팩터링을 언제 하는게 좋은지? 켄트 벡에 의하면 리팩터링할 시점은 '냄새'란 표현을 사용 오히려 인스턴스 변수가 몇 개가 적당한지, 메섣가 몇 줄을 안넘어가면 좋은지보다는, 사람의 직관이 더욱 정확하다는 의미 `냄새`에 대한 감각을 키우려면, 앞으로 나오는 리팩터링 내용들을 숙지하고 직접 코드로 표현해보며 사용 기이한 이름 코드를 명료하게 표현하는 데 가장 중요한 요소는 `이름`이므로 함수, 모듈, 변수, 클래스등은 그 이름만 보고도 각각이 무슨 일을 하고 어떻게 사용하는지 명확히 알 수 있도록 엄청나게 신경써서 이름을 지어야 함 이름만 잘 지어도 나중에 문맥을 파악하느라 헤메는 시간을 크게 절약 가능 ex) 함수 이름 바꾸기, 변수 이름 바꾸기 긴 함수 경험에 비춰보면 오랜 기간 ..