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

김승우 2주차 과제 #5

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

Conversation

kyh196201
Copy link

@kyh196201 kyh196201 commented Sep 13, 2023

안녕하세요!

우선 백을 이용한 첫 번째 과제를 풀어봤습니다.

추상 데이터 타입을 사용하는 이유와 백을 구현하면서 어떤 기능(API)를 제공할 수 있을지 대해서 고민하면서 과제를 했습니다.

1-2 과제에서 평균을 쉽게 구하기 위해서 sum 이라는 메서드를 구현했는데, 어떤 타입의 데이터가 백 안에 들어올지 모르니 좋은 방법이 아닐 수도 있겠다는 생각이 드네요!(PR을 올리면서 생각났습니다 😂)

Comment on lines 21 to 34
next() {
if (index < data.length) {
const value = data[index];
index += 1;

return {
done: false,
value,
};
}

return { done: true };
},
};
Copy link
Contributor

Choose a reason for hiding this comment

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

index가 초과하지 않았을 경우에는 값을 반환하고, 아닌 경우에는 끝나도록 하신 것 같아요.
종료조건을 먼저 명시하는 것도 좋을 것 같아요. 진짜의도는 아래에 배치하고, 예외가 되는 경우를 위에 배치하는거죠.

      next() {
        if (index >= data.length) {
          return { done: true };
        }

        const value = data[index];
        index += 1;

        return { done: false, value };        
      },
    };

그리고 리턴하는 중괄호도 모양을 일부러 맞춰줬어요

Copy link
Author

Choose a reason for hiding this comment

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

피드백 감사합니다 :-)
얼리 리턴에 대해서 배웠던 기억이 나네요!
실제 업무에서도 얼리 리턴을 많이 사용했는데, 예외가 되는 케이스가 많을 경우에 진짜 의도를 나타내는 코드가 눈에 잘 안들어오는 경우도 있었습니다.

윤석님은 혹시 이런 경험이 있으신가요? 만약 있으시다면 어떻게 코드를 작성하셨는지 궁금합니다.

throw new Error('스택이 비어있습니다');
}

const popped = this.#items[this.#n];
Copy link
Contributor

Choose a reason for hiding this comment

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

popped라는 의미는 boolean변수처럼 보여서 item정도로 해도 될 것 같아요. items에서 나온거라서

Comment on lines 16 to 18
sum() {
return this.#items.reduce((acc, cur) => acc + cur, 0);
}
Copy link
Contributor

Choose a reason for hiding this comment

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

sum을 구현했는데 타입에 따라서 동작하지 않을까봐 걱정이셨군요. 해결 방법에는 두 가지가 있는데, 하나는 타입으로 해결하여 제네릭을 사용하는 방법이 있고요, 다른 하나는 함수를 주입해주는 방법이 있습디다.

  1. 타입으로 해결할 경우
interface Plusable<T> {
  plus: (other: T) => T;
}

class SomeValue implements Plusable<SomeValue> {
  value = 0;

  constructor() {}

  plus(other: SomeValue) {
    const newValue = new SomeValue();
    newValue.value = this.value + other.value;
    
    return newValue;
  }
}

class Bag<T extends Plusable<T>> {
  items: Array<T> = [];

  constructor() {
  }

  sum(): T {
    return this.items.reduce((acc, item) => acc.plus(item));
  }
}
  1. 함수로 해결하는 경우
class Bag {
  // ... 생략

 sum(operator = () => acc + cur) {
    return this.#items.reduce(operator, 0);
  }
  
  // ... 생략
}

const bag = new Bag();
bag.sum((acc, cur) => acc + cur.someValue);

이렇게 하면 sum할 때 어떻게 동작할지 결정할 수 있습니다. 자바스크립트에서는 대부분 함수로 해결하고, 함수형에서 주로 이렇게 해결합니다.

Copy link
Author

@kyh196201 kyh196201 Sep 18, 2023

Choose a reason for hiding this comment

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

윤석님 자세한 설명 감사합니다 :-)

2번째 방법을 이용해서 수정했고, reduce의 initialValue를 지정해주면 좋을 것 같아서 sum의 두번째 인자로 initialValue를 추가했습니다.

첫 번째 방법은 많이 생소해서 코드가 아직 잘 이해가 안가네요 ..!
Plusable과 같은 인터페이스를 만들어서 문제를 해결하는게 너무 신기합니다..
좀 더 읽어보고 이해해보겠습니다.. 혹시 이런 패턴에 대해서 참고할 만한 문서가 있을까요?

Copy link
Contributor

@hannut91 hannut91 Sep 26, 2023

Choose a reason for hiding this comment

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

타입이 있는 언어를 다뤄보시지 않았다면 낯설어서 어려웠을 것 같아요.
그래도 타입스크립트를 사용하면 제너릭을 사용하게 될테니 배워놓으셔야 합니다!
https://www.typescriptlang.org/docs/handbook/2/generics.html

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