- 객체지향 프로그래밍 방식에 충실하게 카드 클래스(class)를 설계한다.
- 속성으로 모양 4개 중에 하나, 숫자 1-13개 중에 하나를 가질 수 있다.
- 모양이나 숫자도 적당한 데이터 구조로 표현한다. 클래스 혹은 Nested enum 타입으로 표현해도 된다.
- 어떤 이유로 데이터 구조를 선택했는지 주석(comment)으로 구체적인 설명을 남긴다.
- ex. //어떤 처리가 간단해서, 편리해서, 함께 표현하려고...
- 카드 정보를 출력하기 위한 문자열을 반환하는 함수를 구현한다.
- 문자열에서 1은 A로, 11은 J로, 12는 Q로, 13은 K로 출력한다.
- main에서 특정한 카드 객체 인스턴스를 만들어서 출력한다.
♥️Q
♠️7
- 모든 종류의 카드 객체 인스턴스를 포함하는 카드덱 구조체를 구현한다.
- 객체지향 설계 방식에 맞도록 내부 속성을 모두 감추고 다음 인터페이스만 보이도록 구현한다.
- count(): 갖고 있는 카드 개수를 반환한다.
- shuffle(): 전체 카드를 랜덤하게 섞는다.
- removeOne(): 카드 인스턴스 중에 하나를 반환하고 목록에서 삭제한다.
- reset(): 처음처럼 모든 카드를 다시 채워넣는다.
- 카드덱 기능을 확인할 수 있도록 메뉴를 만들기 위해 InputView를 구현한다.
- 사용자가 입력한 메뉴에 따라서 카드덱 구조체 함수를 호출하고 결과를 출력한다.
다음 메뉴를 선택해주세요.
1. 카드 초기화
2. 카드 섞기
3. 카드 하나 뽑기
> 1
카드 전체를 초기화했습니다.
총 52장의 카드가 있습니다.
- 카드덱에 카드 여러 장을 한꺼번에 배열로 뽑아내는 메서드를 추가한다.
- 카드덱을 활용해서 다음 화면처럼 표시할 카드스택(쌓인 모양)을 출력하도록 수정한다.
- 카드덱에 새로 추가한 메서드를 활용해서 카드스택 출력을 담당할 객체를 구현한다.
- main에서 입력 기능을 잠시 제거하고, 바로 카드스택을 출력한다.
- 클래스 이름, 변수 이름, 메서드 이름 작성 기준 :
- 클래스 이름 : 게임 주체, 객체로 나누고 역할에 따라 이름 부여.
- Dealer: 게임 주체. 카드덱과 카드스택을 통제하며 전반적인 게임 진행을 담당
- Deck: 게임 객체. 전체 카드를 담고, 전체 카드를 조작하는 역할
- CardStack: 게임 객체. 카드뭉치를 가지고 특정규칙(stack)에 따라서만 넣고 뺄 수 있음
- Card: 게임 객체의 최소단위
- Shape, Number: Card를 구성하는 규칙
- 변수 이름 : 명사로 끝남. 타입명은 변수에 포함 안 하고 최대한 현실세계의 구체적인 단어 사용.
- 메소드 이름 : 동사로 시작. 영어문장으로 읽힐 수 있도록 파라미터 라벨명에 전치사 사용.
- 클래스 이름 : 게임 주체, 객체로 나누고 역할에 따라 이름 부여.
- 스위프트 코딩 컨벤션 :
- Ray Wenderlich 사의 코딩 컨벤션 참고: raywenderlich
- Enum cases들은 lowerCamelCase를 사용하는 등 현재 나의 코딩 스타일과 가장 비슷하며, 설명이 가장 자세하게 되어있음.