Yejin-02 / practice-calc

0 stars 0 forks source link

[REFACTOR] review & refactor requests #3

Closed crown-3 closed 4 months ago

crown-3 commented 4 months ago

리뷰

개선점

1. 렌더링 로직과 연산 로직 분리

interface OperationProps { setNumbers: Dispatch<SetStateAction<number[]>>; numbers: number[]; setOperation: Dispatch<SetStateAction>; }

export const division = ({ setNumbers, numbers, setOperation, }: OperationProps) => { setNumbers([...numbers, NaN]); setOperation("division"); };

- 이렇게 작성한 뒤에 App.tsx에서 적용시킬 때 다음과 같이 적용시켜주면 됩니당
```tsx
...
<OrangeButton
    onClick={() => division({ setNumbers, numbers, setOperation })}
>
    /
</OrangeButton>
...

2. Enum 사용

function App () { const [operation, setOperation] = useState<OperationMod | null>(); }

```ts
const multiplication = () => {
    setNumbers([...numbers, NaN]);
    setOperation(OperationMod.MULTIPLICATION);
};

3. NaN 대신 null 사용

두 번째 수가 입력되었는지를 감지하기 위해 NaN을 쓰고 있는데, 사실 NaN은 자바스크립트가 내뱉는 오류적인 값이라서, 초기 설정값과 실제로 NaN이 나온 경우를 구분해야 할 필요가 있는 것 같아요. 그래서 numbers의 타입을 (number|null)[]로 바꾸고, 초기값을 [null]로 준 다음 null인지 아닌지 검사하는 방식으로 가면 어떨까요?

Yejin-02 commented 4 months ago

5c6d06f312fe7fc15a6201780da307b0f0130c34

src/operations에 연산자들만 따로 분리해서 리팩토링.

2, 3번의 경우 지난 번에 nubmers/operations를 따로 받는 것에서 value에 텍스트로 모든 걸 입력하고 eval(value).toString()로 연산 결과를 얻는 방식으로 바꾸었기 때문에 더이상 의미 없어져서 스킵.

질문

기존에 사용하던 numbers와 operations을 따로 입력 받아서 연산을 진행하는 방식과, string 타입의 value에 숫자와 연산자를 모두 텍스트로 입력받고 eval을 이용하는 방법 두 가지 중 무엇이 더 나은지 말 할 수 있는가? 다양한 기능 구현 방법이 있을 때 무엇을 기준으로 선택을 해야 하는가?