본문 바로가기

iOS

SSAC - 다마고치 프로젝트 피드백 정리

728x90

1차 평가과제(?)였던 다마고치 프로젝트의 피드백을 받았다.

평가과제 기간과 앱잼 데모데이 일정이 겹쳐 두가지 작업을 진행하느라 제법 .. 얼레벌레 코드를 작성했었기에 (죄송합니다..) 싹 .. 갈아엎을 생각으로 피드백을 보았다.

 

공통 피드백과 개별 피드백을 읽어보면서 어떻게 코드를 정리하면 되는지 알게 되었고 평가 과제 이후로 자가회고를 하면서 .. 나에게서 무엇이 부족한지 느낄 수 있었다. 피드백 내용은 후술할테니 자가회고를 하면서 느꼈던 것을 먼저 정리하자면, 아래와 같다.

 

자가 피드백 

기술/실력적인 회고에 앞서서 스스로를 되돌아보았을 때, 부끄러운 부분들이 많다.
초반의 열심히하겠다고 한 마음가짐과 다르게 체력적인 한계에 부딪혀서 최선을 다하지 못한 모습이 있었다. 

무엇보다 절대적인 시간을 많이 투자하지 못한 점이 아쉽다. 변명이라고 느껴지는 부분이기도 하나, 앱잼 참여자이자 운영자로서 앱잼의 결과물을 내면서 그리고 데모데이 운영을 하면서 동시에 평가 과제를 진행하니 너무 피곤했다. 데모데이 끝나자마자 솝텀 프로젝트의 코어 타임도 겹쳤고 .. 

그래서 거의 모든 일정이 정리되고 있는 지금 .. 싹 프로그램에 좀 더 집중해야겠다는 생각을 했다. 시차도 아침형으로 돌리고 꾸준히 규칙적인 생활을 해야겠다고 생각했다. 

기술적인 부분들에 있어서는 
- 생각을 하고 이유 있는(논리적인) 코드를 작성할 것
- 쓰던 방식 말고 다른 방식으로 코드를 작성할 것
- 무지성의 '동작만' 가능한 코드가 아니라 보다 '효율적인' 코드를 작성할 것 
.. 이라고 생각했다.

최대한 수업시간에 배운 내용을 과제에 적용함으로서 체화할 수 있도록 해야겠다.

특히, 문법적인 부분들에 있어서 효율적인 코드를 위한 노력을 해야겠다. enum 등을 잘 활용하고 고차함수를 잘 사용하여 깔끔한 코드를 작성하고 싶다.

 


공통 피드백 

공통 피드백 내용 중 몇가지 내용을 적으면 아래와 같다. 

 

중복되는 코드를 줄이자.

레벨을 계산하는 코드를 정리할 수 있다.

    func calculateLevel(riceCount: Int, waterDropCount: Int) -> Int {
        var level: Int = 0
        let data = (riceCount / 5) + (waterDropCount / 2)
        
        if data >= 0 && data < 10 {
            level = 1
        } else if data >= 10 && data < 20 {
            level = 1
        } else if data >= 20 && data < 30 {
            level = 2
        } else if data >= 30 && data < 40 {
            level = 3
        } else if data >= 40 && data < 50 {
            level = 4
        } else if data >= 50 && data < 60 {
            level = 5
        } else if data >= 60 && data < 70 {
            level = 6
        } else if data >= 70 && data < 80 {
            level = 7
        } else if data >= 80 && data < 90 {
            level = 8
        } else if data >= 90 && data < 100 {
            level = 9
        } else {
            level = 10
        }
        
        return level
    }

위의 코드에 대해서 0 ~ 20까지는 레벨이 1로 계산되고 100 이상부터는 10으로 그 중간은 데이터에 대해서 10으로 나눈 값이 레벨이 되는 것을 확인할 수 있다. 그래서 이런 코드를 정리하면 아래와 같이 줄일 수 있다.

    func calculateLevel(riceCount: Int, waterDropCount: Int) -> Int {
        let data = (riceCount / 5) + (waterDropCount / 2)
        
        if data >= 0 && data < 20 {
            return 1
        } else if data >= 100 {
            return 2
        } else {
            return data/10
        }
    }

 

뷰 컨트롤러의 생명주기

부모클래스에 선언된 메서드를 오버라이딩하여 사용할 경우, 부모 메서드도 작성해야 한다.

 

예를 들어, 아래와 같이 작성해야 합니다. 

override func viewWillAppear(_ animated: Bool) {
	super.viewWillAppear(animated)
}

세부적으로 말하면, super.method를 넣어줘야 하는 상황도 있고 선택적인 상황도 존재한다.

https://developer.apple.com/documentation/appkit/nsviewcontroller/1434476-viewdidload

 

Apple Developer Documentation

 

developer.apple.com

 

특히 뷰컨트롤러의 생명주기 같은 경우 뷰 컨트롤러의 뷰가 메모리에 로드될 때, OS에 의해 호출되는 것이므로 습관적으로 호출하는 것이 좋다. 

 

 

네이밍 컨벤션

보편적으로 사용하는 네이밍 컨벤션은 아래와 같다.

 

  • 메서드/프로퍼티는 lower camel case를 사용한다.
    • static let backgroundColor 
    • private func setUpDetailView() { }
  • 클래스/구조체/열거형 등은 대문자로 시작하는 것이 좋다. (애플이 권장하는 방식)
    • class InfoViewController() { }
    • enum ViewType { case .. }
  • 의미 없는 네이밍 지양 (= 이름을 보면 어떤 역할을 하는 것인지 파악할 수 있어야 한다.)
  • 띄워쓰기 역시 컨벤션에 해당한다. 

 

필요 없는 코드 및 사용하지 않는 라이브러리 설치 지양

사용하지 않는 코드가 있거나 사용하지 않는 라이브러리가 설치된 경우 필요가 없다면 삭제해야 한다.

특히, 불필요한 스토리보드 파일은 최대한 삭제하는 것이 좋다. 

 

 

개별 피드백 

다마고치 선택하기

(준비 중인 다마고치를 선택하면 어떤 효과도 사용자에게 보이지 않는 이슈)

클라이언트 개발자 입장에서 생각할 수 있는 부분이다. 클라이언트 개발자는 사용자와의 인터랙션을 보다 세심하게 신경을 써야 한다. 그래야 코드만 잘 구현하는 개발자가 아닌 전체적인 관점을 바라보고 사용자를 이해하는 개발자가 될 수 있다. 

 

 

Constant - User Defaults Key 관리

열거형, 프로퍼티 래퍼, 연산 프로퍼티 등으로 관리할 수 있다.

 

대표적으로 구조체로 아래와 같이 사용할 수 있다.

extension Constant {
    struct UserDefaults {
        static let userName: String = "userName"
        static let riceCount: String = "riceCount"
        static let waterDropCount: String = "waterDropCount"
    }
}

 

 

상수로 관리 

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        userNameLabel.text = UserDefaults.standard.string(forKey: Constant.UserDefaults.UserName) ?? "대장"
        configureNaivgationBarUI()
}

위의 코드에서 "대장"이라는 문자열을 공통된 상수로 관리할 수 있다. 

 

extension Constant {
    struct User {
        static let UserName: String = "대장"
    }
}

 

 

접근 제어 키워드 

접근 제어 디폴트 값이 internal 이므로 모듈이 별도로 사용하지 않는 형태의 프로젝트라면 internal을 명세할 필요는 없다. 

그러므로 아래와 같이 코드를 작성할 필요가 없다.

internal var tamagotchiIndex: Int = 1
internal var viewType: ViewType = .select

 

 

'iOS' 카테고리의 다른 글

프로토콜 - Basic To Advanced  (0) 2022.08.03
Network - 가볍게  (0) 2022.08.02
0729 Q&A 정리  (0) 2022.08.01
Custom Font를 적용하고 싶다면?  (0) 2022.08.01
ATS(App Transport Security)  (0) 2022.07.28