# 3조 피어세션 회고 # 팀원 | S031 | S045 | S002 | S022 | S049 | S020 | S012 | S013 | | -------- | -------- | --- | --- | --- | --- | --- | -------- | | [오현식](https://github.com/Kinaan-Oh) | [이지수](https://github.com/tmfrlrkvlek) | [강민상](https://github.com/FreeDeveloper97) | [백지현](https://github.com/bhyun) | [이태혁](https://github.com/taelee42) | [박인우](https://github.com/inuinseoul) | [김우재](https://github.com/kimwj9792) | [김태훈](https://github.com/Modyhoon) | ## 목적 - 코드 공유를 통한 피드백 및 부족한 점 개선 - 마스터 피드백 내용을 함께 살펴보면서 구체적인 내용 파악 ## 과정 - [x] 코드리뷰 - [x] 마스터 피드백 리뷰 - [x] 깃 이슈 공유 및 커밋메세지 공유 - [x] 유용한 꿀팁 공유 ### S012 김우재 [XCode XCTest 테스트 메서드 실행 순서 정리](https://zdodev.github.io/xctest/Xcode-XCTest-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%8B%A4%ED%96%89-%EC%88%9C%EC%84%9C-%EC%A0%95%EB%A6%AC/) ### S031 오현식 Player card 받은것을 Set으로 선언하여 관련 메소드로 중복처리 를 간편하게 할 수 있다. ``` swift XCAssertEqual(cardsDistibutedSet.count, sut.turnBefore() != "로봇" ? mode : 3, "~~~") XCAssertEqual(cardRecieved.intersection(cardsDirtrubutedSet).count, 0, "~~~") ``` - `~=` 기능 Range 안에 속해있는지 판단해주는 연산자이다. - if문 말고 Guard를 활용하여 validation 처리를 미리 해주자. ### S049 이태혁 - 뷰 컨트롤러들을 전부 탭바에 넣음 - `guard` 구문에서 컴마로 ```swift func isValidText(_ text: String) -> Bool { let validRegex = "^\\w{1,5}$" let alphaRegex = "[a-zA-Z]" guard let _ = text.range(of: validRegex, options: .regularExpression), let _ = text.range(of: alphaRegex, options: .regularExpression) else { return false } return true } ``` guard 에서는 `,` 가 and의 역할을 할 수 있는 것 같다. [스위프트의 콤마와 &&의 차이: condition과 expression의 구분](https://soojin.ro/blog/swift-comma-vs-and-operator) ### S045 이지수 스토리보드에서 `extension` 으로 Button UI 바꾸기 ``` swift import UIKit extension UIButton { @IBInspectable var borderWidth: CGFloat { set { layer.borderWidth = newValue } get { return layer.borderWidth } } @IBInspectable var cornerRadius: CGFloat { set { layer.cornerRadius = newValue } get { return layer.cornerRadius } } @IBInspectable var borderColor: UIColor? { set { guard let color = newValue else { return } layer.borderColor = color.cgColor } get { guard let color = layer.borderColor else { return nil } return UIColor(cgColor: color) } } } ``` [피어세션 관련 개인 기록](https://bush-tire-4d2.notion.site/16bd93f9fec24f7c86afb90d9b0d6da8) ### S002 강민상 ``` swift public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { return range.location < 5 } ``` 이렇게하면 애초에 Text 5글자 이상 입력을 못한다고 한다. - `mutating` 알아보자 shuffle test → 카드 종류가 한번이라도 다를 경우 → 이래서 Card에 `Equtable`을 사용한 것 - 과일 카드게임테스트에서 테스트는 각 시행이 독립적으로 작동해야 한다고 알고 있는데, 3장뽑는테스트에서 1장뽑는 테스트를 사용하게 되면 독립적임이 보장되는가? - reset() 을 할때 removeAll() 을 하지 않고 빈 배열을 하나 만들어서 넣어줬는데, 그렇게 하게되면 기존에 있던 메모리를 가지고 있는 변수가 없을것 같다. 이 때 메모리 누수 이슈는 없을까요? ### S020 박인우 클래스와 구조체를 선택하는 방법 동일성이 필요하면 클래스를 사용해라 [Apple Developer Documentation](https://developer.apple.com/documentation/swift/choosing_between_structures_and_classes) ### S022 백지현 - nil 로 테스트 - 깃을 웹 게임처럼 할수 있는 사이트 [XCode XCTest 테스트 메서드 실행 순서 정리](https://zdodev.github.io/xctest/Xcode-XCTest-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%8B%A4%ED%96%89-%EC%88%9C%EC%84%9C-%EC%A0%95%EB%A6%AC/) ### JK 님 피드백 기준으로 진행 ![](https://i.imgur.com/KftHJxj.png) - 테스트 작성을 먼저할지 코드 작성을 먼저 할지 (TDD 방식) 논의 - 다들 코드 작성을 먼저 하는 편 - 잘게 쪼개어 놓는게 유닛테스트를 하기에 좋지 않을까 생각 [https://www.youtube.com/watch?v=meTnd09Pf_M&t=665s](https://www.youtube.com/watch?v=meTnd09Pf_M&t=665s) ![](https://i.imgur.com/zjaWsto.png) ### 공유된 꿀팁들 - https://soojin.ro/blog/swift-comma-vs-and-operator - https://zdodev.github.io/xctest/Xcode-XCTest-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%8B%A4%ED%96%89-%EC%88%9C%EC%84%9C-%EC%A0%95%EB%A6%AC/ - https://learngitbranching.js.org/?locale=ko - https://www.youtube.com/watch?v=meTnd09Pf_M&t=665s - https://gist.github.com/godrm/d07ae33973bf71c5324058406dfe42dd - https://www.conventionalcommits.org/en/v1.0.0/ - http://karma-runner.github.io/6.3/dev/git-commit-msg.html ## 결과 ### 피어별 느낀점 - S012 김우재 : 같은 코드도 여러 방향으로 짤 수 있다는 것을 배웠습니다. 특히 프로토콜... 더 공부해야 할 것 같아요... - S020 박인우 : 다른 분들에 비해 구조화가 덜 되었음을 느꼈습니다. 과제의 목적에만 맞추려고 하지말고 더 나은 코드를 작성하려고 노력하겠다고 다짐했습니다. - S002 강민상 : Test를 먼저 생각하고 작성하는 TDD에 대해 좀더 알아봐야겠다는 생각이 들었습니다. 피어세션을 통해 CaseIterable, removeAll() 등 몰랐던 부분을 알게 되었습니다. commit 의 convention 또한 알게 되었습니다. (git은 아직 어렵...) - S049 이태혁 : IBInspectable이 충격적이었습니다. 테스트에 신경을 쓰신 분들이 많이 계셔서 많이 배울 수 있었습니다. - S045 이지수 : 같은 미션을 진행했는데도 팀별로 신경쓴 포커스가 다르다는 점이 신기했습니다. 그래서 피어 세션의 목적답게 폭넓은 정보들을 공유할 수 있었던 것 같습니다. 특히 꿀팁을 많이 알게 되었습니다. - S022 백지현: 커밋 메시지를 좀 더 컨벤션에 맞게 작성해야 겠다는 생각이 들었습니다. 다른 분들 코드 리뷰를 통해서 다양한 꿀팁을 알게 된 것 같습니다. - S013 김태훈 : Model, Controller, View에 따라 폴더를 나누면 코드 분리가 수월하고 가독성이 좋을것 같다라는 생각이 들었습니다. 추가적으로 git convention 에 대해 이야기를 나눠봐서 좋은 정보를 많이 얻어간것 같습니다. - S031 오현식 : 저희 팀원들과 다른 생각을 가진 타 팀원들과 다양한 Swift 문법, 커밋 컨벤션, 모델 설계 방법, 깃 브랜치 전략에 대해 공유하였고 많이 배웠습니다. 다만, 테스트하기 좋은 구조가 무엇인지에 대해 해결하지 못한 점이 아쉬웠고 마스터님께 질의해야 겠다는 생각이 들었습니다.