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

Hanul #10

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open

Hanul #10

wants to merge 2 commits into from

Conversation

gimhanul
Copy link
Member

실행 결과

원서가 정상적으로 제출되었습니다.
원서가 정상적으로 제출되었습니다.
원서는 한 번만 제출할 수 있습니다.

< 부산소프트웨어마이스터고등학교 원서 접수 현황 >
==========================================
|  이 름  |     전화번호     | 출신중학교 | 총점 |
------------------------------------------
|  금곰돌  | 010-1234-4231 | 곰돌중학교 | 328 |
|  이밤돌  | 010-1234-5678 | 밤돌중학교 | 256 |
==========================================

탈락되었습니다.
합격되었습니다.

객체의 역할과 책임

객체지향 프로그래밍에서는 객체에 역할과 책임을 부여하는 것이 중요합니다.
많은 친구들이 객체에 논리가 맞지 않는 책임을 부여했습니다.
정답은 아니지만, 저는 다음과 같이 구성했습니다.

학교

  • 원서를 접수 받기
    • 한 명의 학생에게는 한 번만 받기
  • 접수된 모든 원서를 확인하기
  • 원서를 점수에 따라 합/불 처리하기

학생

  • 원서 작성하기
  • 원서를 접수하기
  • 원서 상태 확인하기

원서

  • 원서를 생성과 동시에 점수 계산하기

원서 접수 프로세스

  1. 학생이 원서를 작성합니다.
  2. 원서는 작성됨과 동시에 점수를 계산합니다.
  3. 학생이 원서를 접수합니다.
  4. 학교가 원서를 접수 받습니다.

    많은 친구들이 놓친 부분이 바로 이 부분입니다.


이슈 리포트: 원서는 한 번만 제출할 수 있다?

학교 객체의 원서 접수 받기 메서드에서 원서를 이미 제출했는지 검증합니다.

원서를 작성할 때 학생 객체가 들고 있는 원서를 저장한다

public void writeApplication(School targetSchool) {
        this.application = new Application(
                this,
                targetSchool
        );
    }

이때, 원서를 다시 작성해 재제출 하면 학생이 들고 있는 원서와 학교가 들고있는 원서의 불일치 문제가 일어납니다.

1. 학생이 A 원서 작성 (학생이 들고 있는 원서: A, 학교가 들고 있는 원서: null)
2. A 원서 제출 (학생이 들고 있는 원서: A, 학교가 들고 있는 원서: A)
3. 학생이 B 원서 또 작성 (학생이 들고 있는 원서: B, 학교가 들고 있는 원서: null)
4. B 원서 제출 -> 같은 학생이 원서를 또 냈기 때문에 오류 발생 (학생이 들고 있는 원서: B, 학교가 들고 있는 원서: A)

원서를 검증한 이후로 제출된 원서를 돌려주자

그럼 원서를 검증한 이후로 확실한 원서를 돌려주면 불일치 문제를 해결할 수 있습니다.

제출된 원서를 돌려주는 프로세스

  1. 학교가 원서를 돌려준다.
  2. 학생이 원서를 받는다.

불일치 문제가 해결됩니다.

1. 학생이 A 원서 작성 (학생이 들고 있는 원서: A, 학교가 들고 있는 원서: null)
2. A 원서 제출 (학생이 들고 있는 원서: A, 학교가 들고 있는 원서: A)
3. 학생이 B 원서 또 작성 (학생이 들고 있는 원서: B, 학교가 들고 있는 원서: null)
4. B 원서 제출 -> 같은 학생이 원서를 또 냈기 때문에 오류 발생 
    (학생이 들고 있는 원서: A, 학교가 들고 있는 원서: null)

하지만, 오류가 발생했는데 잘 제출된 원서를 돌려주는 것은 논리상 말이 안 됩니다.

작성한 원서와 제출한 원서 분리

그래서 작성한 원서와 제출한 원서를 분리했습니다.
이렇게 하면 오류가 발생했을 때 원서를 돌려주지 않아도 됩니다.

1. 학생이 A 원서 작성 (학생이 작성한 원서: A, 학생이 들고 있는 원서: null, 학교가 들고 있는 원서: null)
2. A 원서 제출 (학생이 작성한 원서: A, 학생이 들고 있는 원서: A, 학교가 들고 있는 원서: A)
3. 학생이 B 원서 또 작성 (학생이 작성한 원서: B, 학생이 들고 있는 원서: A, 학교가 들고 있는 원서: null)
4. B 원서 제출 -> 같은 학생이 원서를 또 냈기 때문에 오류 발생 
    (학생이 작성한 원서: B, 학생이 들고 있는 원서: A, 학교가 들고 있는 원서: null)

작성한 원서를 저장하지 않고 그냥 main 함수에서 들고 있으면 되는 거 아닌가요?

main 함수는 그저 일의 순서에 따라 코드를 실행할 뿐
원서를 제출할 책임은 없습니다.
따라서 다음과 같은 코드는 객체 간의 긴밀한 협력을 해치는 코드입니다.

        // TODO-1 이밤돌 학생 원서
        // 이밤돌 학생이 부산소프트웨어마이스터고등학교에 낼 원서를 작성합니다.
        Application leeApplication = lee.writeApplication(bssm);

        // 이밤돌 학생이 원서를 제출합니다.
        lee.submitApplication(leeApplication);

정답은 없다

코드에 정답은 없습니다.
그저 참고용으로 봐주시면 됩니다!

@gimhanul gimhanul requested a review from a team as a code owner June 27, 2023 02:27
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