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

Lee Ho Seong #10

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

Lee Ho Seong #10

wants to merge 21 commits into from

Conversation

leon-808
Copy link

요약

describe, context, it, expect, tobe 적용

Pull Request 체크리스트

TODO

  • PR 올리기 전 rebase 동기화를 하셨나요?
  • 마지막 줄에 공백 처리를 하셨나요?
  • 커밋 단위를 의미 단위로 나눴나요?
    • 예시
      • 코드 가독성을 위해 메서드를 추출하라
      • if-else 문을 if 문으로 분리하라
      • 불필요한 메서드를 인라인화하라
  • 커밋 본문을 작성하셨나요?
    • 예시
      • 함수는 한 가지 일을 해야 한다는 원칙에 따라 메서드를 추출합니다.
      • if-else는 컴파일 시 처리가 되어 재컴파일 없이 수정 할 수 없습니다.
        이에 따라 코드가 실행되는 순간에 실행이 결정되는 if 문으로 수정합니다.

jihwooon and others added 6 commits December 19, 2023 17:30
메소드 추출을 통해 한 메소드가 한가지 일만 하도록 크기를 줄였음
추상화 수준을 맞춤으로써 가독성 향상
ch01 sum 예제는 풀이하지 않음
describe, context, it, expect, tobe 구조 적용
간단한 if 문의 리팩토링을 수행
테스트를 위하여 원래 void 였던 updateCar() 함수를 임시로 boolean 으로 변경
Comment on lines 17 to 22
interface TrafficLight {
isRed(): boolean;
isYellow(): boolean;
isGreen(): boolean;
updateCar(): boolean;
}
Copy link
Owner

@jihwooon jihwooon Dec 21, 2023

Choose a reason for hiding this comment

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

Suggested change
interface TrafficLight {
isRed(): boolean;
isYellow(): boolean;
isGreen(): boolean;
updateCar(): boolean;
}
interface TrafficLight {
updateCar(): boolean;
}

해당 메서드를 제거하면 어떤 결과가 발생할까요? 이 메서드를 제거가 가능한지 대한 여부를 고민 했으면 좋겠습니다.

Copy link
Author

Choose a reason for hiding this comment

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

isRed, isYellow, isGreen 을 주석 처리해서 제거해도 코드 상의 오류가 발생하지 않습니다.
Red, Yellow, Green 클래스 내의 isRed, isYellow, isGreen 은
인터페이스에서 상속 받은 클래스를 구현한게 아니라
개별적으로 클래스를 구현한 꼴이 된 거 같습니다.

Copy link
Owner

Choose a reason for hiding this comment

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

인터페이스에서 코드상에 오류가 발생하지 않는다면 상속 받고 있는 클래스에서도 더 이상 사용되지 않아 제거가 가능 하지 않을까요? 99쪽에 필요없는 코드 제거하기 내용을 읽어보시면 좋을 것 같습니다~


const car = new Car();
const CYCLE = [new Red(), new Green(), new Yellow()];
const updateCar = (car: TrafficLight) => car.updateCar();
Copy link
Owner

Choose a reason for hiding this comment

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

Suggested change
const updateCar = (car: TrafficLight) => car.updateCar();
const updateCar = (car: TrafficLight) => car.updateCar();

매개 변수는 클래스와 함수가 아닌 인터페이스로 매개변수를 사용하고 있습니다. 왜 인터페이스를 사용 했을까요? 이 부분을 찾아보고 공부를 해보면 어떨까요?

Copy link
Author

Choose a reason for hiding this comment

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

인터페이스를 매개변수로 선언하면 해당 인터페이스를 기반으로 구현한
여러 객체를 매개변수에 할당해줄 수 있기 때문? 이라고 생각합니다.

Copy link
Owner

Choose a reason for hiding this comment

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

말씀해주신 부분도 맞지만 더 중요한 개념은 다형성이 있습니다. 이 부분은 매우 중요한 개념이라 반드시 공부를 해보시면 좋겠습니다!!

Copy link
Author

Choose a reason for hiding this comment

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

아 terminology 의 중요성을 다시 한번 깨닫고 갑니다.. 감사합니다

Comment on lines 21 to 24
const reportIfPrime = (i: number) => {
console.log(`${i} is prime`);
}

Copy link
Owner

@jihwooon jihwooon Dec 21, 2023

Choose a reason for hiding this comment

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

Suggested change
const reportIfPrime = (i: number) => {
console.log(`${i} is prime`);
}
const reportIfPrime = (i: number) => console.log(`${i} is prime`);

화살표 함수를 사용 하셨는데 화살표 함수의 특징은 한 줄로 표현 할 수 있다는 장점을 가지고 있습니다. 현재 함수에서는 그 장점을 활용하지 않아보입니다.

Copy link
Author

Choose a reason for hiding this comment

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

말씀대로 원본 코드를 수정했습니다

.eslintrc.js Outdated
Comment on lines 11 to 12
plugins: ['@typescript-eslint', 'jest'],
extends: ['airbnb', 'plugin:@typescript-eslint/recommended', 'plugin:jest/recommended'],
Copy link
Owner

Choose a reason for hiding this comment

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

prettier로 인해서 레이아웃에 변경이 발생 한 거 같습니다. 이 해당 파일은 커밋 올리기 전에 확인하고 커밋에 올라가지 않도록 주의해야합니다.

Copy link
Author

Choose a reason for hiding this comment

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

prettier 를 이 프로젝트 전체에 적용되지 않도록 하였으나 저 부분이 수정된줄은 미쳐 몰랐습니다.
지적 감사합니다만 이미 여러번 push 되어서 git 을 관리해야할지 막막합니다.

.eslintrc.js Outdated
Comment on lines 53 to 60
'import/extensions': [
'error',
'ignorePackages',
{
js: 'never',
ts: 'never',
},
],
Copy link
Owner

@jihwooon jihwooon Dec 21, 2023

Choose a reason for hiding this comment

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

위와 동일하게 레이아웃 변경이 발생했습니다. 커밋 올리기 전에 다시 한번 확인이 필요합니다.

Copy link
Author

Choose a reason for hiding this comment

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

로컬 원본 코드를 마저 수정하였습니다.

if 문 리팩토링시 map[y][x] 에서 메서드 인식 불가
map 생성 함수를 고쳐서 map[y][x] 가 클래스로 받아들여지도록 해야할듯 싶음
index.ts Outdated
Comment on lines 282 to 285
if ((map[y][x] === RawTile.STONE || map[y][x] === RawTile.FALLING_STONE)
&& map[y + 1][x] === RawTile.AIR) {
map[y + 1][x] = RawTile.FALLING_STONE;
map[y][x] = RawTile.AIR;
Copy link
Owner

@jihwooon jihwooon Dec 21, 2023

Choose a reason for hiding this comment

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

map[y][x]은 다음 배열을 참조 하고 있습니다.

const map: RawTile[][] = [
  [2, 2, 2, 2, 2, 2, 2, 2],
  [2, 3, 0, 1, 1, 2, 0, 2],
  [2, 4, 2, 6, 1, 2, 0, 2],

이 배열은 RawTile 열거형을 참조하고 있어서 map으로부터 메서드를 호출 할 수 없습니다. 참조 타입을 변경하시면 됩니다.

Copy link
Author

Choose a reason for hiding this comment

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

그럼 처음 말씀드렸던대로 첫 RawTile 맵을 기반으로
tile class 들을 담고 있는 새 맵을 만들고 그걸 참조하게 하면 될까요?

Copy link
Owner

Choose a reason for hiding this comment

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

책에서는 기존 Tile을 인터페이스로 구현하도록 합니다. 때문에 인터페이스로 참조 타입으로 사용해도 됩니다.

Copy link
Author

Choose a reason for hiding this comment

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

아 오류 해결 내용을 뒤에서 다루나 보네요.. 감사합니다 그럼 한번 만들어보겠습니다.

Comment on lines 17 to 22
// interface TrafficLight {
// isRed(): boolean;
// isYellow(): boolean;
// isGreen(): boolean;
// updateCar(): boolean;
// }
Copy link
Owner

@jihwooon jihwooon Dec 22, 2023

Choose a reason for hiding this comment

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

Suggested change
// interface TrafficLight {
// isRed(): boolean;
// isYellow(): boolean;
// isGreen(): boolean;
// updateCar(): boolean;
// }
if(false) {
function doSomeThing() {
interface TrafficLight {
isRed(): boolean;
isYellow(): boolean;
isGreen(): boolean;
updateCar(): boolean;
}
}
}

의미없는 주석은 doSomeThing 함수에 담아서 실행 되지 않게 하는 것이 좋습니다.

seeAlso:

Copy link
Author

Choose a reason for hiding this comment

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

습관을 바꾸겠습니다. 해당 코드는 삭제했습니다.

@@ -1,4 +1,5 @@
.idea
.vscode
.prettierignore
Copy link
Owner

Choose a reason for hiding this comment

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

gitingore 파일에 .prettierignore 를 추가하셨네요. 현재 커밋에서는 이 설정이 어떤 의도로 추가 되어 있는지를 알 수가 없습니다. 해당 파일을 따로 커밋을 두고 의도를 설명하는 편이 좋을 것 같습니다.

Copy link
Author

Choose a reason for hiding this comment

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

아 원자적으로 커밋을 나눠야 하나 보네요.
.prettierignore 파일은 이 프로젝트 전반에 prettier 가 작동하지 않도록 하는 파일입니다.
reset 해서 커밋을 나눠보도록 하겠습니다.

Copy link
Owner

Choose a reason for hiding this comment

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

해당 파일만 따로 커밋을 잘 나누셨네요~! 이 부분을 어떻게 해결했는지 블로그나 글로 작성하셔도 좋을 것 같습니다~!

index.ts Outdated
Comment on lines 482 to 490
map[y + 1][x] = new Stone(new Falling());
map[y][x] = new Air();
} else if (map[y][x].isBoxy() && map[y + 1][x].isAir()) {
map[y + 1][x] = new Box(new Falling);
map[y + 1][x] = new Box(new Falling());
map[y][x] = new Air();
} else if (map[y][x].isFallingStone()) {
map[y][x] = new Stone(new Resting);
map[y][x] = new Stone(new Resting());
} else if (map[y][x].isFallingBox()) {
map[y][x] = new Box(new Resting);
map[y][x] = new Box(new Resting());
Copy link
Owner

@jihwooon jihwooon Dec 26, 2023

Choose a reason for hiding this comment

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

오타 수정를 위한 커밋은 불필요한 커밋을 생성하기 때문에 이전 커밋에서 수정을 하는 편이 좋습니다.

Copy link
Author

Choose a reason for hiding this comment

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

해당 제언까지 수정해서 push 했습니다.

index.ts Outdated
isStony(): boolean;
isBoxy(): boolean;
moveHorizontal(dx: number): void;
moveVertical(dx: number): void;
Copy link
Owner

Choose a reason for hiding this comment

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

Suggested change
moveVertical(dx: number): void;
moveVertical(dy: number): void;

moveVertical의 인자값은 dx가 아닌 dy로 표기해야 합니다.

Copy link
Author

Choose a reason for hiding this comment

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

dy 로 로컬 코드 수정했습니다. 지적 고맙습니다.
이를 언급하는 커밋은 따로 만들지 않겠습니다.

index.ts Outdated
isLeft() { return false; }
isUp() { return false; }
isDown() { return false; }
handle() { moveToTile(playerx + 1, playery); }
Copy link
Owner

Choose a reason for hiding this comment

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

Suggested change
handle() { moveToTile(playerx + 1, playery); }
handle() { moveHorizontal(1); }

책에서는 해당 메서드로 구현 되어 있는데 moveToTile로 왜 변경되었는지가 궁금합니다.

Copy link
Author

@leon-808 leon-808 Dec 27, 2023

Choose a reason for hiding this comment

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

제가 이해하고 작성하기로는 moveHorizontal 과 moveVertical 이 인터페이스에서 상속 받아
클래스 안에 구현된 내장 메소드의 형태로 이전되었습니다.
그래서 책을 따라서 코드를 작성하면 input 이라는 Input 인터페이스를 상속 받는 클래스들은
moveHorizontal 과 moveVertical 을 호출할 수 없으며,
이 함수들은 단독으로도 호출될 수 없기 때문에 빨간줄(에러) 가 발생합니다.
moveToTile 이란 메소드는 playerx, playery 라는 좌표 전역 변수를 재설정하고 있습니다.
그래서 저 부분을 바꾸었습니다.

Copy link
Owner

Choose a reason for hiding this comment

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

moveToTile 메서드로 두 가지 일을 하는 것으로 보입니다. moveHorizontalmoveVertical따로 구분한 이유 중 하나 일 것입니다. 상속 받은 클래스에 호출 할 수 없다고 에러가 발생한 이유가 interface에서 상속 받은 클래스에서 메서드 구현이 제대로 되어 있지 않아서 문제가 발생 할 수 있습니다.

@leon-808 leon-808 changed the title sum test ts 풀이 Lee Ho Seong Dec 27, 2023
생성자와 추가 인터페이스 도입으로 if문 간소화
개인적으로 사용하는 prettier 를
이 프로젝트에서 작동하지 않게 하는 파일입니다.
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.

2 participants