Skip to content

Conversation

Jamong-mini
Copy link
Contributor

2.1. 초기화 시 의존성 주입을 활용하기
피드백: "초기화 시 의존성 주입을 받도록 활용하면 추후 테스트나 여러 방면에서 확장성 있는 코드가 될 것입니다."

개선 내용: 의존성 주입(DI, Dependency Injection)은 클래스 내부에서 직접 객체를 생성하지 않고, 외부에서 필요한 객체를 주입받는 방식이다. 기존 코드에서는 BaseballGame 클래스가 초기화될 때 AnswerCreatorLv6 인스턴스를 자체적으로 생성했는데 내부에서 직접 생성하면 해당 클래스가 특정 구현에 강하게 결합되므로, 확장성과 테스트 가능성 측면에서 좋지 않다는 것을 깨달았다.

개선 코드:

class BaseballGameLv6 {
    private var answerCreator: AnswerCreatorLv6

    init(answerCreator: AnswerCreatorLv6) {
        self.answerCreator = answerCreator
        self.answer = answerCreator.create()  // 외부에서 주입된 객체로 정답 생성
    }
}

이 방식으로 개선하면서 얻은 장점은 다음과 같다:

확장성: 추후 AnswerCreatorLv6 대신 다른 구현체를 주입하여 기능을 변경하거나 확장하기 쉽다.

2.2. startBaseballGame 메서드의 역할 분리
피드백: "startBaseballGame 메서드가 다소 많은 역할을 하며 비대해 보입니다. 실제 게임을 플레이하는 부분을 따로 메서드로 분리하는 것이 좋습니다."

개선 내용: startBaseballGame 메서드는 게임의 흐름 전체를 관리하며 사용자 입력 처리, 결과 판정, 메시지 출력 등 다양한 역할을 수행하고 있었는데 이로 인해 코드가 길어지고 가독성이 떨어진 것을 인지는 하고 있었다. 이를 해결하기 위해 역할을 세분화하고 메서드를 나누어 관리하도록 수정했다.

개선 코드:

func startBaseballGame() {
    resetGame()
    while true {
        let userInput = getUserInput()
        let (strike, ball) = evaluateUserInput(userInput)
        displayGameResult(strike: strike, ball: ball)

        if strike == 3 {
            print("정답입니다!\n")
            break
        }
    }
}

이 방식으로 개선하면서 얻은 장점은 다음과 같다:

가독성 향상: 메서드 하나에 너무 많은 내용이 담기지 않으므로 코드가 읽기 쉬워진다.
유지보수 용이성: 각 메서드가 하나의 역할만 수행하므로, 수정할 때도 영향 범위가 명확해진다.
2.3. 매직 넘버 및 매직 스트링을 상수로 관리
피드백: "100... 999와 같은 매직 넘버는 상수로 관리하는 것이 유지보수에 용이합니다. 네임스페이스를 이용해 여러 매직 넘버나 매직 스트링들을 관리해 보세요."

개선 내용: 코드에서 사용된 하드코딩된 숫자(예: 100, 999)나 문자열은 '매직 넘버' 또는 '매직 스트링'이라고 불리며, 코드 이해를 어렵게 하고 유지보수성을 저하시킨다고 한다. 이를 해결하기 위해 상수로 정의하고 네임스페이스를 통해 관리했다.

개선 코드:

enum Constants {
    static let validNumberRange = 100...999
    static let welcomeMessage = "환영합니다! 원하시는 번호를 입력해주세요"
    static let menuOptions = "1. 게임 시작하기  2. 게임 기록 보기  3. 종료하기"
}

이 방식으로 개선하면서 얻은 장점은 다음과 같다:

가독성 향상: 코드 내 숫자와 문자열이 의미를 가지도록 네이밍해 이해하기 쉽다.
유지보수성 향상: 매직 넘버나 스트링이 코드 여러 곳에서 사용될 경우 상수 값만 변경하면 되므로 수정이 간편하다.

2.4. 디렉토리와 파일 구조의 명확한 관심사 구분
피드백: "디렉토리에서 Classes와 Models의 구분이 명확하지 않았습니다. 클래스라는 디렉토리명보다는 각 파일의 역할을 담는 폴더명을 지어 구분하는 게 더 적절합니다."

개선 내용: 기존 구조는 Classes와 Models로 구분되어 있었으나, 이 구분이 명확하지 않아 가독성이나 역할 구분이 모호했다. 따라서 각 클래스의 역할을 바탕으로 폴더명을 정리하여 디렉토리 구조를 개선했다.

개선된 디렉토리 구조:

ProjectRoot/
├── GameLogic/
│   ├── BaseballGameLv6.swift
│   ├── GameHistory.swift
├── ErrorHandling/
│   ├── InputErrorLv6.swift
├── Protocols/
│   ├── BaseballGameProtocolLv6.swift
├── Utilities/
│   ├── Constants.swift
│   ├── AnswerCreatorLv6.swift

이 방식으로 개선하면서 얻은 장점은 다음과 같다:

명확한 역할 구분: 각 디렉토리와 파일이 어떤 역할을 하는지 쉽게 알 수 있다.
프로젝트 유지보수 용이성: 파일을 찾기 쉽고, 각 기능이 명확히 분리되어 있기 때문에 유지보수에 유리하다.

@Jamong-mini Jamong-mini changed the title 튜터님 피드백을 받아 수정 [Lv_7] 튜터님 피드백을 받아 수정 - 김상민 Nov 11, 2024
@Jamong-mini Jamong-mini self-assigned this Nov 11, 2024
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.

1 participant