일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 리펙토링
- swiftUI
- Observable
- rxswift
- ios
- 클린 코드
- Clean Code
- ribs
- clean architecture
- Protocol
- 스위프트
- HIG
- SWIFT
- collectionview
- 리팩토링
- Refactoring
- swift documentation
- UITextView
- Human interface guide
- 리펙터링
- 애니메이션
- uiscrollview
- UICollectionView
- tableView
- MVVM
- combine
- Xcode
- uitableview
- RxCocoa
- map
- Today
- Total
목록테스트 (6)
김종권의 iOS 앱 개발 알아가기
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/qtUJA/btrUdhBr2oi/3DbMS6aTMrRhuEy7ce7ufK/img.gif)
테스트 대상 플러스 버튼을 누르면 1초 이후에 값이 증가하는 앱 테스트: 버튼 누름 -> 1초 후에 값이 변화하는지 확인 샘플 프로젝트에서 사용한 라이브러리 - MVVM을 템플릿화 해놓은 ReactorKit 사용 target 'ExAsyncRx' do use_frameworks! pod 'ReactorKit' pod 'RxCocoa' target 'ExAsyncRxTests' do inherit! :search_paths end end 예제에 사용될 ViewController import UIKit import ReactorKit import RxSwift import RxCocoa class ViewController: UIViewController, ReactorKit.View { private le..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dDXNG5/btrmvdyHp73/r2s0ZUXyySCk5aS4eBsZdk/img.png)
1. ReactorKit - 개념 2. ReactorKit - 테스트 방법 (Storyboard 사용, IBOutlet 테스트 방법) 3. ReactorKit - `TaskList 구현`, 템플릿 (template), 비동기 처리 transform(mutation:) 4. ReactorKit - `TaskEdit 구현`, 화면전환, 데이터 전달 * 해당 코드는 ReactorKit git repository 코드를 참고하였습니다. * Unit Test가 중요한 이유, 클린 코드: https://ios-development.tistory.com/770 * Counter 예제 코드: https://github.com/JK0369/ExReactorKit/tree/BaseComponent ReactorKit 테스..
* 냄새와 휴리스틱: 파틴 파울러의 "Refactoring"에서 "코드 냄새"를 표현하여 주의해야하는 코드 사항들에 대해 나열한 것에 더하여 저자 로버트 C.마틴의 생각을 더한 것 이름 서술적인 이름을 사용할 것 소프트웨어가 진화할 경우 의미도 변하므로 선택한 이름이 적합한지, 성급하지 않고 신중하게 고를 것 로버트 C마틴에 의하면, 소프트웨어 가독성의 90%는 이름이 결정 주석을 통해 추가 설명을 하려고 하기전에, 먼저 서술적인 이름으로 코드를 구성하는 방향으로 구현하면 다 읽지 않아도 유추하기가 쉬워져서, 코드 생산성에도 긍정적인 영향을 부여 RIGHT - 서술적인 이름으로 인해 함수의 이름만 보고도 내용을 예측할수 있는 형태 private let ballCountToStrike = 10 privat..
1. DI패턴 (필요한 곳에서 protocol에 선언하는 방법) 2. 테스트 구조를 고려한 DI패턴 Usecase Test를 위한 ViewModel 구조 ViewModel에 Input, Output이 존재하고 특정 Input일때 mock usecase를 동작시켜서 예상되는 Output이 나오는지 확인 ViewModel의 Input, Output 정의 protocol AInput { func viewDidLoad() } protocol AOutput { var calculatedValue: Observable { get } } protocol AViewModel: AInput, AOutput {} DefaultAViewModel 정의 final class DefaultAViewModel: AViewMode..
1. DI패턴 (필요한 곳에서 protocol에 선언하는 방법) 2. 테스트 구조를 고려한 DI패턴 DI 패턴 ADIContainer와 AViewModel이 있고 DIContainer에서 AViewModel를 만들 때, AViewModel에 필요한 값을 정의하는 방법 DIP와 테스트에 용이하기 위하여 protocol을 통해 설계는 2. 테스트 구조를 고려한 DI패턴 참고 1. DI패턴 (필요한 곳에서 protocol에 선언하는 방법)의 목적 DIContainer자체가 구현체가 되는 패턴 파악 DIContainer가 구현체가 되는 '패턴'에 대해서 보며, 이 방법은 의미없다는것을 알고 Usecase위치는 ViewModel에 있어야한다는 것을 깨닫는 목적 테스트시에 DIContainer 구현체를 변경하는 일..
절차 지향 프로그래밍 (Procedural programming) 주로 goto 문장이 주를 이루는 프로그래밍 현재의 프로그래밍은 모두 `구조적 프로그래밍` 자바의 경우 break, goto문이 있지만 이 제어흐름을 아무 제약 없이 직접 전환될 수 있던 과거의 포트란과 코볼같은 언어와는 달리 goto문을 함수 안으로 한정시키는게 대부분 구조적 프로그래밍 (structured programming) 구조적 프로그래밍의 탄생: 수학적으로 접근 (순차 구문-열거법, 분기-열거법, 반복-귀납법) 기능적 분해: 구조적 프로그래밍을 통해 모듈을 증명 가능한 떠 작은 단위로 재귀적으로 분해가 가능 -> 기능적으로 분해 가능하다는 의미 문제 접근방법: 큰 문제 -> 고수즌의 기능들로 분해 -> 이들 각 기능은 저수준의..