ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 문자열 계산기 javascript.ver
    spring.project.log 2022. 4. 10. 16:01

     

    문자열 계산기를 자바로 짜는 과제를 레샨님께서주셨는데 흑흑 웬걸 너무 힘들었다... js적 사고를 하는 나에게 넘어려운것...

    그래서 일단 javascript로 만들어보고 옮겨야겠다는 생각을 했다~



    리팩토링 전 풀이 그냥 쿠쿠루삥뽕 구현함

    const input = "2 + 3 * 4 / 2";
    const output = 10;
    
    
    const operatorDict = {
      "+" : (a,b)=>a+b,
      "-" : (a,b)=>a-b,
      "*" : (a,b)=>a*b,
      "/" : (a,b)=>a/b
    }
    
    
    const splitArr = input.split(" ")
    //자르기
    const initialValue = parseInt(splitArr.shift())
    // console.log(splitArr)
    //chunk
    
    const chunkArr = Array.from({length:splitArr.length/2})
      .map((v,i)=> {
        return [
          splitArr[i*2], 
          parseInt(splitArr[i*2+1]),
        ]
      })
    console.log(JSON.stringify(chunkArr))
    // reduce로 연산해서 결과 출력 후 구조분해할당!?
    //배열을 구조분해할당하려면?
    
    const result = chunkArr.reduce((acc,[operator, number])=>{
      console.log(acc, operator, number)
      return operatorDict[operator](acc, number) 
    }, initialValue)
    
    initialValue
    //두번째 v parseInt
    // console.log(JSON.stringify(chunkArr.map((v,i)=>[v[0],parseInt(v[1])])))
    
    
    // [i][i+1]
    
    // [["+","3"],["*","4"],["/","2"]]

     


    리팩토링한거~ 이건 혼자안했다 왜냐면 이름짓기 너무힘듦 ㅠㅠ 토끼님이 도와주심

    const operatorDict = {
      "+" : (a,b)=>a+b,
      "-" : (a,b)=>a-b,
      "*" : (a,b)=>a*b,
      "/" : (a,b)=>a/b
    }
      //어떤 역할이 있을까?
    
      // 이름 parse // 문자열을 split해준다
      // split한거를 chunk해준다
    
    const parse = (input) => {
      const CHUNK_SIZE = 2;
      const tokens = input.split(" ")
      const initialValue = parseInt(tokens.shift())
      
      const operationList = Array.from({length:tokens.length/CHUNK_SIZE})
        .map((_,i)=> {
          return [
            tokens[i*CHUNK_SIZE], 
            parseInt(tokens[i*CHUNK_SIZE+1]),
          ]
        })
      return { initialValue, operationList }
    }
    //1. 변수명이 구리다.(O)
    //2. split chunk 합쳐져잇는게 맘에안듦(X)
    // -> split+chunk같은역할, reduce 이렇게 구분해서 함수로 쪼개고싶다~(O) : 함수추출하기 extract function
    //3. 각각의 숫자로 써져있는 부분들(하드코딩)을 변수로 빼기~ (O) : 상수추출하기 extract constant
    
    //input을 받는 함수를 만들기!
    const evaluate= (input)=>{
      const {initialValue,operationList} = parse(input)
    
      //chunk한거를 reduce해준다~
      return operationList.reduce((acc,[operator, n])=>
        operatorDict[operator](acc, n), initialValue)
    }
    // console.log(evaluate("2 + 3 * 4 / 2"))

     


    예쁘게 정리함~

    const operatorDict = {
      "+" : (a,b)=>a+b,
      "-" : (a,b)=>a-b,
      "*" : (a,b)=>a*b,
      "/" : (a,b)=>a/b
    }
    
    const parse = (input) => {
      const CHUNK_SIZE = 2;
      const tokens = input.split(" ")
      const initialValue = parseInt(tokens.shift())
      
      const operationList = Array.from({length:tokens.length/CHUNK_SIZE})
        .map((_,i)=> {
          return [
            tokens[i*CHUNK_SIZE], 
            parseInt(tokens[i*CHUNK_SIZE+1]),
          ]
        })
      return { initialValue, operationList }
    }
    const evaluate= (input) => {
      const {initialValue,operationList} = parse(input)
      return operationList.reduce((acc,[operator, n])=>
        operatorDict[operator](acc, n), initialValue)
    }

     

    근데 코드를 짜고 나서 느낀점은 반복문으로 구현할 수 있는 부분은 반복문으로 구현해야 ㅠㅠ 더 좋을 것 같다는 것이다 ~왜냐면 Array.from부분(chunk해주는 부분 조금 약간 고통... 저부분을 반복문으로 바꾸는게 더 간단해보일듯~굳이 함수형으로 풀어야했을까? 하는 생각이 든다~)

     

    그리고 리팩토링하면서 constant extract, function extract라는 개념을 배웠다~ 너무 재밌다 껄껄

    리팩토링 유잼

     

    그래도 잘한것은 reduce를 바로 떠올린것과 혼자서 스스로 코드의 문제점을 찾고 개선해보려고 노력했다는 점이다~ 

    변수명이 구린것도, 함수로 추출하려는 것도, 상수추출하려는 것도 뭔가 불만족스러워서 일단 써놓은 것임.. 너무 내코드에 불만이 많아서

    이래선 구현을 못할지도~?! 실무에서는 역시 중도를 맞추는 게 중요할 것 같다는 생각이 든다

     

    그리고 테스트를 짜서 함수형하는 사람들처럼 거꾸로 구현해보고 싶다는 생각을 했다 ~ 왜냐하면 그것이 나의 행복 그것이 내가 이르고자하는 길...함수형 love....

    'spring.project.log' 카테고리의 다른 글

    .equals와 ==  (0) 2022.04.16
    [JAVA] 접근제어자, getter/setter  (0) 2022.03.26
    오버라이딩(overriding)과 오버로딩(overloading)  (0) 2022.03.18
    이넘(enum)  (0) 2022.03.17
    인터페이스(interface)  (0) 2022.03.17
Designed by Tistory.