일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 리펙터링
- 리팩토링
- SWIFT
- combine
- Protocol
- swift documentation
- uiscrollview
- tableView
- 클린 코드
- Observable
- rxswift
- 애니메이션
- MVVM
- UITextView
- Xcode
- collectionview
- Human interface guide
- Refactoring
- ribs
- ios
- uitableview
- clean architecture
- RxCocoa
- Clean Code
- map
- 리펙토링
- HIG
- swiftUI
- 스위프트
- Today
- Total
목록리펙토링 (45)
김종권의 iOS 앱 개발 알아가기
변수 쪼개기 한 변수에 대입이 두 번 이상 이뤄진다면, 한 변수가 여러 가지 역할을 수행한다는 의미이므로 변수를 쪼개서 역할을 나누어야함 여러 용도로 변수가 사용되면 코드를 읽는 사람에게 혼란을 주기 때문에 변수를 쪼갤것 하나의 변수에는 하나의 대입 (= 하나의 역할)을 하게 하기 위해서 가능하면 변수를 불변으로 선언할 것 ex) for문에서의 i값은 불변(immutable)로 선언되어 있고, 재활용하지 않으며 매번 새로운 i로 선언됨 // i변수는 내부적으로 let으로 선언되어, 한 변수에 여러번의 대입이 되지 않도록 되어있음 for i in 0...10 { print(i) } 변수 쪼개기 예제 1 여행한 거리를 구하는 함수 distanceTravelled(value:time:)에서 accerlaera..
반복문을 파이프라인으로 바꾸기 파이프라인 코드란? 선언적으로 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 } } (함수로 호출하기) 코드의 라인 수도 줄어들고 함수의 이름을 보면 목적 파악이 명쾌하기 때문에 더욱 빠르게 읽..
리펙토링 핵심 각 방법들을 '왜' 수행해야 하는지 깨닫고 유연하게 적용하기 문장을 호출한 곳으로 옮기기 한 함수는 한 가지의 일만 해야하는데 두 가지 이상의 일을 하는 경우, 함수 안의 문장을 밖으로 빼내는 작업 함수는 프로그래머가 쌓아 올리는 추상화의 기본 빌딩 블록이지만 추상화의 경계를 항상 올바르게 긋기가 어려움 기능 범위가 달라지면 추상화의 경계도 움직이게 되므로 함수 관점에서 응집도가 높고 한 가지 일만 수행해야하는 함수가 둘 이상의 다른 일을 수행하게 될 수 있으므로 이런 부분들을 리펙토링하는것 반대 리펙토링: 문장을 함수로 옮기기 문장을 호출한 곳으로 옮기기 리펙토링 ex) photo, person 데이터가 있고, 이것을 렌더링하는 함수가 있는 상태 getRecentPhotos(_:)에서도 ..
문장을 함수로 옮기기 함수를 호출하는 쪽에서 항상 그 함수를 호출하기 전이나 후에 동일한 관련 동작을 할 것으로 예상되는 것들은 함수 안으로 이동시키기 함수를 이용하는 관점에서 매번 사용되는 코드를 함수 안으로 이동시킴으로써 코드 중복을 막는게 목적 주의할점은 함수 안으로 이동할 문장이 함수의 일부라는 확신이 있어야함 (한 함수는 하나의 일만 해야지, 응집도가 높은 코드 기대가 가능) 중요한 이유 특정 함수를 호출하는 코드가 나올 때마다 그 앞이나 뒤에서 똑같은 코드가 추가로 실행되면, 그 똑같은 코드를 함수안에 삽입하여 중복 코드를 방지 문장을 함수로 옮기기 예제 ex) 이름을 변경한 후 변경 전과 변경 후의 코드를 출력하는 코드 class ViewController: UIViewController {..
필드 옮기기 데이터구조에서 맥락상 어울리지 않는 필드가 있다면 필드를 옮기는 방법 필드 옮기기가 필요한 배경 프로그램이 상당 부분 동작을 구현하는 코드로 이뤄지지만, 데이터 구조를 잘 활용하면 코드는 자연스럽게 단순하고 직관적으로 변경 데이터 구조를 잘못 선정하면 아귀가 맞지 않는 데이터를 다루기 위한 코드로 범벅되고 데이터 구조파악도 힘들게 됨 현재 데이터 구조가 적절치 않음을 깨닫게 된다면 곧바로 수정이 필요 ex) 필드 옮기기를 수행해야하는 상황 함수에 어떤 레코드를 넘길 때마다 또 다른 레코드의 필드도 넘기고 있는 경우 한 레코드를 변경하려 할 때 다른 레코드의 필드까지 변경해야하는 경우 레코드 뿐만이 아닌 클래스나 객체도 동일 필드 옮기기 리펙토링 ex) 고객(Customer)과 계약정보(Cus..