일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 스위프트
- 애니메이션
- uiscrollview
- map
- rxswift
- Protocol
- combine
- ribs
- Clean Code
- Refactoring
- swiftUI
- clean architecture
- 리펙터링
- swift documentation
- tableView
- RxCocoa
- ios
- Observable
- UICollectionView
- MVVM
- collectionview
- HIG
- Xcode
- SWIFT
- 리팩토링
- 클린 코드
- UITextView
- uitableview
- 리펙토링
- Human interface guide
- Today
- Total
목록Clean Code (클린 코드) (15)
김종권의 iOS 앱 개발 알아가기
오류 코드보다 예외를 지향 예외처리는 논리가 들어간 로직부분과 예외를 처리하는 부분을 나누어서 코드가 섞이지 않게되어 복잡해지지 않게되는 장점이 존재 오류 코드는 테스트가 힘들지만, 예외를 사용하면 throw에 관한 리턴값을 확인할 수 있어서 TDD에도 용이 WRONG class DeviceController { func sendShutDown() -> Void { if handle != DevcieHandle.INVALID { if record.getStatus() != DEVICE_SUSPENDED { pauseDevice(handle) clearDeviceWorkQueue(handle) closeDevice(handle) } else { Log.error("Device suspended. Unabl..
Interface를 사용해야 하는 이유 Interface는 swift에서 protocol을 의미 추상화 - 외부에서 구현체의 변수에 의존하지 않도록하기 위함 인터페이스는 자료 구조를 명백하게 표현 WRONG ex) Interface가 아닌 경우 - 구현을 외부에 노출 외부에서 구현체를 알아야하는지? 외부에서는 직교 좌표계인지, 극 좌표계인지 알 필요없이 값만 필요한 상황이므로 불필요한 정보를 외부에 노출하여, 외부에서 데이터를 사용할 때 불필요한 고민을 주는 상황 class Point { var x: CGFloat var y: CGFloat init(x: CGFloat, y: CGFloat) { self.x = x self.y = y } } RIGHT ex) Interface인 경우 - 구현을 외부에 감..
되로록이면 주석을 지양 잘 달린 주석은 그 어떤 정보보다 유용하지만, 프로그래밍 언어 자체의 표현력이 풍부하다면 주석이 거의 필요하지 않을 것이므로, 주석이 필요 없도록 프로그래밍의 표현력에 집중 코드는 분리되어 점점 변하지만 주석을 직접 수정해주지 않으면 남아있는 경우가 존재 주석은 나쁜 코드를 보완하지 못하므로, "모듈의 이해를 위해서 주석을 달아야지" 보다는 "코드를 정리해야지"의 관점이 필요 WRONG - 나쁜 코드를 보완하려는 목적으로 주석이 사용되었지만, 나쁜 코드를 정리하는 것이 훨씬 중요 // 직원에게 복지 혜택을 받을 자격이 있는지 검사 if ((employee.flags & HOURLY_FLAG) && (employee.age > 65)) { ... } RIGHT - 나쁜 코드를 정리하..
짧은 이름보다는 서술적인 이름을 선택 함수를 구현할 때 항상 함수의 이름을 확인하면서, 함수의 이름에 부합하는 작업만 포함하고 있는지 확인할 것 길지라도 서술적인 이름이 지향 함수가 하는 일을 좀 더 잘 표현 좋은코드는 코드를 읽으면서 짐작했던 기능을 각 루틴이 그대로 수행하도록 짜는 코드이므로 서술적인 코드가 짐작하기가 용이 ex) SetupTeardownIncluder, isTestable(), includeSetupAndTeardownPages() 모듈 내에서의 일관성 모듈 내에서함수 이름은 같은 문구, 명사, 동사를 사용 class IncludeModule { func includeSetupAndTeardownPages() {} func includeSetupPages() {} func inclu..
함수 가능한 하나의 함수는 20줄도 길다고 생각하여, 짧게 만드는것이 가독성에 중요한 요소 하나의 함수가 길어진다면, 그 길어지는 것들을 또다른 함수로 정의하여 그것을 호출하도록 설계 함수 안의 if, guard문의 블록은 여러줄이 아닌 한줄로 구현 하나의 함수는 한가지의 일만 하도록 구현 ex) 페이지를 입력받아서 HTML로 변환하는 함수 정의 - 입력받은 페이지가 테스트 페이지인 경우, 설정페이지(setup)와 해제페이지(teardown)에 페이지를 넣고 해당 테스트 페이지를 HTML로 렌더링하는 기능 WRONG - if문 블록이 한줄을 넘어가므로 잘못된 코드 - 하나의 함수에서 다양한 일 처리 (페이지를 가져오고, 설정페이지와 해제페이지를 추가하는 작업) func renderPageWithSetup..
의도를 명확히 좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 더 많은 장점이 존재 의도가 명확하게 이름을 지을 것 (주석이 필요하다면 의도를 명확히 드러내지 못한 것) 존재 이유는? 수행 기능은? 사용 방법은? WRONG var d: Int // 경과 시간 (단위: 날짜) RIGHT var elapsedTimeInDays: Int var daysSinceCreation: Int var daysSinceModification: Int var fileAgeInDays: Int 잘못된 정보를 지양 여러 계정 그룹을 묶을 때 실제 List가 아니면 accountList라 하지 않는것을 주의 실제 컨테이너가 List인 경우에도 컨터이너 유형을 이름에 넣지 않는 것이 바람직 WRONG var ..
론 제프리스(Ron Jeffries)의 클린 코드 정의 중복 줄이기 표현 높이기(네이밍) 초반부터 추상화 고려(DIP) - 지금은 간단하게 재빨리 구현했다가 나중에 구현체만 변경 가능, 추상화하면 `진짜`문제에 신경 쓸 여유가 생기는 효과 C++ 창시자, Bjarne Stroustrup의 클린 코드 정의 버그를 줄이기 위해서 논리가 간단한 코드 유지보수를 쉽게하기 위하여 의존성을 줄인 코드 나쁜 코드는 너무 많은 일을 하려 애쓰다가 의도가 뒤섞이고 목적이 흐려지기 때문에, 클린 코드는 한 가지에 `집중`한 코드 나쁜 코드는 `유혹`을 하여, 나쁜 코드를 고칠 때 또다른 나쁜 코드를 생성할 확률이 높아지므로 애초부터 아무리 바쁜 상황이라도 나쁜 코드를 지양하는 습관이 필요 나쁜 코드가 생기면 안되는 이유 ..