티스토리 뷰


오늘의 피드백! - 좌표계산기Step3


   var pointsInfo: PointsInfo = PointsInfo.point
   var trixInfo: pointAndValue = ([MyPoint()], 0.0)
   init() {}
// 의미없은 생성자가 다른곳에서 사용될때 잘못될 가능성이 매우 높다. 좋지않은 코드이다.
   init(pointData: [MyPoint], info: PointsInfo, trixInfo: pointAndValue) {

구체적으로 필요한 데이터로 생성하는 init(pointData:, info:, trixInfo:)가 있으면, 의미가 없는 기본 init() 생성자는 필요 없는 경우가 많습니다.필요한 정보가 있는데 반대로 정보가 없이 만들어지면 잘못 사용할 가능성도 있으니 없애는게 좋습니다. 개선해보세요.


func sortAndMakePoints(_ points: [MyPoint], _ pointsValue: PointsInfo) -> pointAndValue {
   switch pointsValue{
    // sortAndMakePoints를 main에 있는건 좋지않다. 데이터를 다루기때문에 Controller로 바꾸는게 좋을것 같다.

이 sortAndMakePoints() 함수는 왜 여기에 있는건가요?어떤 역할인가요? 어떤 객체에 포함할 수 있을까요? 고민해서 개선해보세요.


pointsValue = inputView.countPointsValue()
          userPoints = try inputView.extract()
// 위의 코드는 순차적으로 실행하기때문에 좋지 않다!
          pointAndValue = sortAndMakePoints(userPoints, pointsValue)
          coordinateInfo = CoordinateModel(pointData: userPoints, info: pointsValue, trixInfo: pointAndValue)

CoordinateModel 모델을 만들기 위해서 inputView 여러 함수들을 차례대로 (순서가 있다면 더더욱!!) 불러야만 한다면 나쁜 구조입니다. 복잡해 보입니다. 좀 더 단계를 줄일 수 없을까요?

우선 위와같은 처리를 하기위해 CoordinateCalculator라는 컨트롤러를 만들었다. 그리고 모든 데이터를 한번에 처리하기위해 CoordinateModel을 선언하였다. 처음엔 구조체로 하여 값을 계속 복사해서 만들었었는데, 입력받은 쪽과 처리하는 쪽, 그리고 출력하는 곳에 사용해야하다보니 값을 복사하는 것보다 클래스로 선언하여 참조하는것이 나을것 같아 그렇게 시도하였다.

순차적으로 실행하는건 정말 안좋아보인다. 순차적으로 실행할거면 차라리 private으로 생성하여 우선시되는 메소드 안에 넣어주는게 순서도 가릴 수 있어서 좋은것 같다.


func executeCoordinatesCalculator() {
   var inputView = InputView()
   let outputView = OutputView()
   let coordinateModel = CoordinateModel()
   let coordinateCalculator = Calculator()
   var checkError = false
   while !checkError {
       do {
           try inputView.readInput()
           try inputView.extract(coordinateModel)
           coordinateCalculator.sortAndMakePoints(coordinateModel)

실행부가 깔끔하고 순차적으로 실행해야하는 부분은 사라졌지만 피드백을 기다리고있다..(바로 밑에 피드백을 받았다!)

CoordinateModel 모델을 만들기 위해서 inputView 여러 함수들을 차례대로 (순서가 있다면 더더욱!!) 불러야만 한다면 나쁜 구조입니다. 복잡해 보입니다. 좀 더 단계를 줄일 수 없을까요?

클래스를 사용하여 데이터를 참조로 사용한다! 그래서 데이터를 넘겨줄때 좀더 자유롭다. 왜냐하면 입력값이 하나기때문에 다룰 객체 데이터도 하나이기 때문이다. 다음과 같이 수정하였다!


while !checkError {
       do {
           try inputView.readInput(coordinateModel)
           try coordinateController.extract(coordinateModel)
           outputView.draw(coordinateModel)
  // 위에서 지적된 순차적인 실행문제 해결 및 데이터 참조로 선언 후 처리.

coordinateModel이 처음엔 구조체였지만 지금은 class이다 그리고 데이터의 저장만 관리하기때문에 final로 지정해주었다.다음의 과정으로 변경해보았다.

  1. inputView는 사용자의 입력을 받고(입력값 확인) CoordinateModel에 값을 넘겨주고,

  2. coordinateCalculator는 입력받은 값을 가지고 추출합니다. 그리고 포인트, 라인인지 확인하여 알맞는 값을 선택하여(sortAndMakePoints), CoordinateModel에 값을 넘겨줍니다.

  3. 마지막으로 outputView는 CoordinateModel을 가지고 그림과 정보를 출력해줍니다.

Comments