일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- uiscrollview
- collectionview
- 애니메이션
- Protocol
- combine
- 스위프트
- rxswift
- UITextView
- MVVM
- swiftUI
- uitableview
- HIG
- UICollectionView
- tableView
- 클린 코드
- 리펙터링
- swift documentation
- map
- clean architecture
- ios
- Clean Code
- ribs
- 리팩토링
- Xcode
- SWIFT
- 리펙토링
- Refactoring
- RxCocoa
- Observable
- Human interface guide
- Today
- Total
목록Refactoring (50)
김종권의 iOS 앱 개발 알아가기
참조를 값으로 바꾸기 참조 타입 vs 값 타입 참조로 데이터를 다룰 땐 객체는 그대로 둔 채 그 객체의 속성만 변경 값으로 데이터를 다룰 땐 새로운 속성을 담은 새로운 객체로 초기화하며 영향력은 복사된 곳에서만 고려됨 참조 타입의 데이터 구조를 사용하면 이 데이터가 다른곳에 건네줄때 이 값이 마음대로 바뀔수 있음 값 타입은 불변이기 때문에 불변 데이터를 같은 프로그램 외부에 건네줘도 나중에 그 값이 나 몰래 바뀌거나 내부에 영향을 주지 않는 다는 것을 확신할 수 있음 값 타입은 불변이므로 동시성 프로그래밍과 분산 시스템에도 유리 값을 복재해서 이곳저곳에서 사용해도 서로 간의 참조를 관리하지 않아도 되므로 유용 swift언어에서는 struct라는 값 타입이 있고, 보통 데이터 구조를 표현할때 struct를..
파생 변수를 질의 함수로 바꾸기 파생(Derived) 변수: 사용하는쪽에서 관심 밖의 변수들에도 영향을 주는 것 질의(Query) 함수: 사용하는쪽에서 관심 대상인 변수에만 영향을 주는 것 (단순 get, set) 파생 변수를 질의 함수로 바꾸기 리펙토링: 가변 데이터의 유효 범위를 줄이는 것 가변 데이터가 많아지면 한 쪽 코드에서 수정한 값이 연쇄 효과를 일으켜 다른 쪽 코드에 영향을 주어, 원인을 찾기 어려운 문제를 야기하므로 가변 데이터의 유효 범위를 줄이는 리펙토링이 필요 파생 변수를 질의 함수로 리펙토링 예시) Price에서 구조는 매우 안좋은 구조 discountedTotal의 정보를 변경하기 위해 setDiscountedTotal(number:)를 호출했더니 의도치 않게 안에서 discoun..
필드 이름 바꾸기 필드 이름을 변경하려고 할 때 이 필드가 여러곳에서 사용되고 있는 경우 변경 방법은 캡슐화를 통해 리펙토링 필드 이름 바꾸기에서 생각하는 포인트 변경하려는 필드가 여러곳에서 사용되고 있는 경우, 어떻게 바꿀것인가? 데이터 구조가 불변성으로 표현되면 좋은 이유? 필드 이름 바꾸기 예시 아래에서 name 필드를 title로 변경하고 싶은 경우? 이 값은 여러곳에서 사용되고 있기 때문에 쉽게 바꾸기 힘든 상황 name을 단순히 title로 변경하고난 후 빌드에러나는 곳을 찾아서 일괄 변경할 수 있지만 일괄 수정하다가 실수를 유발할 수 있음 (swift에서 일반적으로 데이터 모델은 struct를 사용하지만, 불변성의 중요성을 깨닫기 위해 class로 선언) class MyData { var n..
변수 쪼개기 한 변수에 대입이 두 번 이상 이뤄진다면, 한 변수가 여러 가지 역할을 수행한다는 의미이므로 변수를 쪼개서 역할을 나누어야함 여러 용도로 변수가 사용되면 코드를 읽는 사람에게 혼란을 주기 때문에 변수를 쪼갤것 하나의 변수에는 하나의 대입 (= 하나의 역할)을 하게 하기 위해서 가능하면 변수를 불변으로 선언할 것 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 } } (함수로 호출하기) 코드의 라인 수도 줄어들고 함수의 이름을 보면 목적 파악이 명쾌하기 때문에 더욱 빠르게 읽..