Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

만국박람회 [STEP 2] Jiseong, Ari #118

Merged
merged 36 commits into from
Dec 15, 2021
Merged

Conversation

leeari95
Copy link
Member

@jae57
@lee_ari95 @yim2627

안녕하세요. 찌루루!
STEP 2가 무사히 마무리되서 PR 보내드립니다.
저희가 STEP 3에서 진행해야 할 오토 레이아웃도 최대한 할 수 있는 만큼 시도해보았습니다.
추가적으로 부족한 점은 STEP 3에서 마저 채워나가도록 하겠습니다. ☺️
혹시 이 외에 저희가 놓친 부분이나 부족한 부분이 있다면 번거롭더라도 한번 더 짚어주신다면 감사하겠습니다. 🙏🏻

고민했던 것

  • 파싱에 실패하였을 때 어떻게 에러처리를 할지 고민해보았습니다.
    • 개발자에게만 보여줘야 할지, 사용자에게 보여줘야 할지 고민해보았고 앱을 사용하는 사용자가 에러를 보는 것이 적절하다는 판단에 얼럿을 띄우도록 구성하였습니다.
  • Navigation Bar를 MainViewController에서만 숨길 수 있는 방법을 고민해보았습니다.
    • View Life Cycle을 활용하여 뷰가 보여질때 숨기고, 사라질때 다시 나타내도록 구현해보았습니다.
  • MainViewController에서 크기가 다른 Label의 Text부분을 어떻게 처리할지 고민해보았습니다.
    • 스토리 보드에서 Label을 직접 추가하여 구현할 수도 있었지만, 스토리보드 의존성을 최대한 낮춰보기 위해 코드를 활용하여 Label에 텍스트를 추가하고 이후 특정 글자만 사이즈가 커질 수 있도록 구현했습니다.
  • 파라미터로 전달하는 String을 변수로 따로 담아 enum타입으로 묶어두어 리팩토링을 진행했습니다.
  • 셀의 재사용성을 높이기 위해 xib를 활용하여 커스텀 셀을 구현해보았습니다.
  • 셀을 터치하는 시점에 해당 셀의 정보가 다음 화면으로 전달될 수 있도록 구현했습니다.
  • 선택된 셀이 선택된 흔적이 남아있어 이를 없애기 위해 고민해보았습니다.
    • delegate를 활용하여 셀이 눌렸을 때 시점에 deselect하도록 구성해보았습니다.
  • ResultType이 가독성이 좋고, 에러에 유연히 대처할 수 있도록 decode 메소드를 ResultType으로 구현해보았습니다.
    • fail시 저희가 만든 에러의 description을 사용자에게 알려주고 success시 view를 구성하는 메소드를 타게끔 구성하였습니다.

궁금했던 것 / 조언을 얻고 싶은 점

  • xib를 활용하여 커스텀 셀을 구현하였는데 셀에 들어갈 요소들을 설계할 때 ios14부터 사용되는 contentConfiguration을 사용해야되나? 라는 의문점이 들었습니다.
    저희 조는 cell의 커스텀 클래스를 활용해 UI요소들을 아울렛 변수로 연결해주고 들어갈 데이터를 설계해주는 방식으로 하였는데, 이 부분이 최신 ios 버전에선 적합하지 않은 것인지 궁금합니다.
private func configure(of cell: ItemTableViewCell, by item: ExpositionItem) {
      cell.itemImageView.image = UIImage(named: item.imageName)
      cell.itemNameLabel.text = item.name
      cell.itemShortDescriptionLabel.text = item.shortDescription
}
  • 화면간 데이터 전달을 할 때 현업에서는 어떤 방식으로 하시는지가 궁금합니다.
    저희는 prepare 메소드를 활용하여 데이터 전달을 하였는데, TableView의 Delegate 메소드에서 바로 데이터를 넘겨주기도 하는 것 같던데 어떤 것이 적절한지 잘 판단이 서질 않습니다.
  • 셀을 터치하는 시점에 데이터를 NextViewController의 프로퍼티를 활용하여 전달해주고 있습니다. 이 부분을 프로퍼티를 활용하지 않는 다른 좋은 방법이 떠오르지가 않습니다.
    화면에서 데이터를 주고받을 때 찌루루는 보통 어떤 방법으로 주고받는지 궁금합니다.
  • 함수형 프로그래밍 방식으로 설계해보려 하였는데 저희가 짠 코드가 함수형 프로그래밍이라고 하기 적합한지 궁금합니다.
  • MainViewController 내부에 있는 setUpView() 메소드가 조금 방대하다고 느껴지는데 리팩토링을 하고 싶은데 좋은 방법이 떠오르지가 않습니다. 찌루루의 조언이 필요합니다!

이번 피드백도 잘부탁드립니다! 😊

yim2627 and others added 28 commits December 8, 2021 15:49
- 테스트에 필요한 Asset 파일 추가
- 옵셔널이 아닌 에러나 데이터를 반환할 수 있도록 개선
- 에러처리에 따른 JSONError 타입 추가
- 파싱 실패시 사용자에게 보여줄 Alert을 extension으로 추가
- CategoryPrefix 타입 생성
- Exposition 타입의 연산 프로퍼티(numberFormatter) 추가
- Label의 접두어 Fontsize 변경 메소드 추가
- titleLabel에서 특정 구간에서 newLine을 할 수 있도록 수정
- 기존 커스텀 셀의 IBOutlet 이름을 수정
- 네비게이션 바의 타이틀을 수정
- 필요없는 주석 제거
- parsing() 메소드 구현
- UITableViewDataSource를 활용하여 TableView를 구성
- 네비게이션바 타이틀 설정
- 전달받은 데이터를 통해 UI 업데이트
- mainVC와 listVC에서 파싱할 때 파라미터로 전달했던 FileName을 새로 생성한 타입으로 대체
Copy link

@jae57 jae57 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@leeari95 @yim2627
안녕하세요, 아리, 지성!
고민했던점 잘 읽어보았습니다! 구현의 이유들이 잘 나타나있어서 코드 이해에 도움이 많이 되었습니다!
설정이 쉽지 않았을텐데 xib 를 활용하여 재사용성을 높힌 점 매우 칭찬드립니다! 👏

궁금했던 것 / 조언을 얻고 싶은 점

xib를 활용하여 커스텀 셀을 구현하였는데 셀에 들어갈 요소들을 설계할 때 ios14부터 사용되는 contentConfiguration을 사용해야되나? 라는 의문점이 들었습니다.

iOS14 부터 사용가능한 contentConfiguration 은 커스텀 클래스가 아닌 기본 제공되는 셀을 쓸 때 사용가능한 걸로 알고 있습니다.
따라서 지금처럼 커스텀 클래스를 만든 상황이라면 어차피 사용할 수가 없네요!

화면간 데이터 전달을 할 때 현업에서는 어떤 방식으로 하시는지가 궁금합니다.
저희는 prepare 메소드를 활용하여 데이터 전달을 하였는데, TableView의 Delegate 메소드에서 바로 데이터를 넘겨주기도 하는 것 같던데 어떤 것이 적절한지 잘 판단이 서질 않습니다.

둘 다 가능하니 쓰고싶은 것 쓰시면 될 것 같아요!
한 화면에 Segue가 tableView만이 아니라 여러 곳에 다수 존재한다면 tableView에서의 이동은 tableViewDelegate에서 해주면 좀 더 명확해질 수 있겠네요!

셀을 터치하는 시점에 데이터를 NextViewController의 프로퍼티를 활용하여 전달해주고 있습니다.
이 부분을 프로퍼티를 활용하지 않는 다른 좋은 방법이 떠오르지가 않습니다.
화면에서 데이터를 주고받을 때 찌루루는 보통 어떤 방법으로 주고받는지 궁금합니다.

nextViewController에 setModel(_ model: Model) 과 같이 세터메서드를 하나만들어서 이용해보는 건 어떨까요?
저도 자주사용하는 방법입니다.
그러면 NextViewController의 프로퍼티는 setModel메서드 내에서만 접근하므로 private 으로 지정할 수 있겠어요!

함수형 프로그래밍 방식으로 설계해보려 하였는데 저희가 짠 코드가 함수형 프로그래밍이라고 하기 적합한지 궁금합니다.

우선 아리와 지성이 생각하기에 함수형 프로그래밍으로 짰다고 생각하는 곳이 어느 부분이고, 왜 그렇게 생각하셨는지 구체적으로 말씀해주시면 좀 더 이야기가 잘 될 것 같아요!

MainViewController 내부에 있는 setUpView() 메소드가 조금 방대하다고 느껴지는데 리팩토링을 하고 싶은데 좋은 방법이 떠오르지가 않습니다. 찌루루의 조언이 필요합니다!

제가 보기에는 딱 적절해보입니다! 이부분을 더 분리하기는 어려울 것 같아요! 이미 UI 구성하는 역할 한가지만 하고 있어서 충분해보입니다!


extension UIViewController {
func showAlert(message: String) {
let cancelAction = UIAlertAction(title: "OK", style: .default)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

title 은 OK인데 변수명은 cancelAction인 이유가 따로 있나요?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

잘못된 네이밍이였습니다 okAction으로 수정하였습니다.

@@ -0,0 +1,21 @@
import XCTest

class JSONParesTests: XCTestCase {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

JSONParseTests 오타인거 같아요!


class ItemListViewController: UIViewController {
private var items = [ExpositionItem]()
@IBOutlet private weak var itemListTableVIew: UITableView!
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i 가 대문자네요!

return cell
}

private func configure(of cell: ItemTableViewCell, by item: ExpositionItem) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 메서드도 ItemTableViewCell 내에 선언된다면 cell 의 프로퍼티들을 외부에서 알지못해도 UI 설정이 가능하겠네요!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

네 뷰컨에서 굳이 해줄 필요없이 커스텀 셀 클래스 내부에서 해줘도 되겠단 생각이들어 코드를 옮긴 후 뷰컨에서 호출해주는 방식을 사용하였습니다 😁

}
}

extension ItemListViewController {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

전반적으로 extension으로 영역을 잘 나눠주셔서 가독성이 좋네요!

func test_Decode_파리만국박람회() {
let exposition = JSONParse<Exposition>.decode(fileName: "exposition_universelle_1900")

XCTAssertEqual(exposition?.visitors, 48130300)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

테스트 쪽은 모두 에러가 나고 있어요! 해결해볼 수 있을까요?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Result Type으로 바꾸면서 테스트함수를 미처 보지 못한것같습니다 🥲
수정하였습니다.

@leeari95
Copy link
Member Author

찌루루! 피드백 감사합니다!
말씀해주셨던 부분 모두 개선해보고 저희가 추가적으로 개선해보았습니다.

확인해주시고 머지 부탁드리겠습니다. 😁 🙏🏻

개선 사항

  • 컴파일에러 발생했던 테스트 코드 에러 수정하기
  • 오타수정
  • 화면간 데이터 전달 시 메소드를 활용하도록 수정
  • 스토리보드 분할
  • 배열의 인덱스 안전하게 조회하도록 개선
  • 파일 분리
  • guard문 중에 의미없는 return문을 fatalError()로 수정

@leeari95 leeari95 requested a review from jae57 December 14, 2021 03:04
- IBOutlet 프로퍼티에 접근제어 추가
- configure 메소드를 private으로 수정하고 setModel로 데이터를 넘겨받도록 수정
@jae57
Copy link

jae57 commented Dec 15, 2021

@leeari95 @yim2627
고생하셨습니다! Step2 핵심 구현사항 무리없이 잘 진행해주셔서 머지하겠습니다!

@jae57 jae57 merged commit 1170bb5 into yagom-academy:4-leeari95 Dec 15, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants