ehdrhelr / baseball

그룹프로젝트 #3
0 stars 1 forks source link

Game DTO 형식 정하기 #19

Closed eeeesong closed 3 years ago

eeeesong commented 3 years ago

이슈를 파서 논의하면 더 수월할 것 같아서 하나 생성해보았습니다 :)

eeeesong commented 3 years ago

Swift

우선 swift 버전의 DTO는 작성을 해보았어요! (일부 struct는 원랜 DTO 내부 타입이 아닌데, 편의상 우선 붙여 놓은 것입니다)

@Lia316 와 오후에 이야기 나눈대로 전부 옵셔널로 되어있기 때문에 데이터를 받아 온 이후, nil이 아닌 것들을 뽑아 내서 쓰면 되는 형태입니다!

즉, 어떤 데이터가 오든 다 이 DTO의 타입으로 파싱하면 됩니다

struct GameDTO: Decodable {

    var teams: Teams?

    struct Teams: Decodable {
        var home: String
        var away: String 
    }

    var inning: Inning?

    struct Inning: Decodable {
        var counter: Int
        var isTop: Bool
    }

    var score: Score?

    struct Score: Decodable {
        var home: Int
        var away: Int
    }

    var batter: Player?
    var pitcher: Player?

    struct Player: Decodable {
        var name: String
        var info: String
    }

    var newPitch: Pitch?

    struct Pitch: Decodable{
        var count: Int
        var result: String
        var log: String
    }

    var ballChanged: BallChanged?

    struct BallChanged: Decodable { //1 or 0
        var strike: Int?
        var ball: Int?
        var out: Int?
    }

    var baseChanged: BaseChanged?

    struct BaseChanged: Decodable { //1 or 0 or -1
        var first: Int?
        var second: Int?
        var third: Int?
        var home: Int?
    }

}
eeeesong commented 3 years ago

JSON

json 버전입니다! 회의 때 말씀해주신 형식 반영해서 data/error 씌우기(?) 반영하였고, 코드 아래에 몇가지 포인트들 적어보았습니다.

{
  "data": {
    "teams" : {
      "home": "Marvel",
      "away": "Captin"
    },
    "inning": {
      "counter": 2,
      "isTop": false
    },
    "score": {
      "home": 5,
      "away": 1,
    },
    "batter": {
      "name": "shion",
      "info": "백엔드 천재"
    },
    "pitcher": {
      "name": "lia",
      "info": "iOS 천재"
    },
    "new-pitch": {
      "count": 5,
      "result": "스트라이크",
      "log": "2-2"
    },
    "ball-changed": {
      "strike": 1,
      "ball": 0,
      "out": 0
    },
    "base-changed": {
      "first": -1,
      "second": 1,
      "third": 0,
      "home": 0
    }
  }, 

  "error": null

}
  1. 모든 값은 포함시키셔도 되고, 포함시키지 않으셔도 됩니다. 변경된 사항만 보내주시고 나머지는 null 처리하셔도 됩니다!

    • 예시)
    • teams: 1회 초에 한번만 보내고 이후엔 쭉 null
    • inning: 이닝이 바뀔 때만 보내고 나머지 경우는 null
    • new-pitch: 아직 pitch가 없는 게임 시작 시점엔 null
    • base-changed: 베이스 정보가 바뀌지 않은 턴엔 null
  2. inning의 counter -> 2회 이 부분을 뭐라고 불러야할지 몰라서 counter라고 썼는데.. 혹시 마땅한 네이밍을 아시는 분이 계시다면..ㅎㅎㅎ 구글링 해봤는데 잘 모르겠더라고요..

  3. ball-changedbase-changed

    • 제일 많이 바뀐 부분인 것 같은데요, 이 두가지는 프론트에서 애니메이션이 들어가는 부분이다보니, 절대적인 값 보다는 상대적인 변화값을 받는 것이 좋겠다는 생각으로 바꿔보았습니다.
    • ball-changed의 각 값은 추가되기만 하므로, 변화가 없을 시 0 / 있을 시 1을 보내주시면 좋을 것 같습니다.
      • 예시)
      • strike가 1 추가되어 2-2가 된 상황: strike:1 / ball: 0 / out:0 (2-2가 된 상황에 대해선 전달하지 않음)
    • base-changed의 값은 감소하기도 하므로, 선수가 이동했을 시 -1, 그대로면 0, 추가된 경우 1을 보내주시면 될 것 같아요!
      • 예시)
      • 1루수가 2루로 이동: first: -1 / second: 1 / third: 0 / home: 0
      • home도 필요할 것 같아서 추가했습니다 :)

천천히 보시고 궁금한 점 있으시면 언제든 말 걸어주세요!! 특히나 3번 사항에 대해.. 이렇게 데이터를 전달하도록 구현하는 것에 무리가 있으시다면 꼭 말씀해주세요!

ehdrhelr commented 3 years ago

오오 정리 너무 잘 해주셨네요!! 정리해주신대로 데이터 전달할 수 있도록 구현해보겠습니다! ㅎㅎㅎ

질문) new-pitch의 count는 5번째 공을 던졌고, 결과는 스트라이크며, 그에 따라 2-2가 되었다는 뜻일까요?? ㅠ 아니면, 2-2인 상황에서 5번째 공을 던졌다고 생각하면 될까요!? count와 log가 일치하지 않아 헷갈려서 질문 드립니다!

Lia316 commented 3 years ago

저 생각해보니까 헷갈려서 질문드립니다! base-changed 가 모든 변화를 나타낼 수 있는 타입인지 모르겠습니다. 예를 들어, 1루, 2루, 3루 모두 채워진 상태에서 안타에 성공해서 각각 1루씩 옮기게 되면.. 어떻게 표현할 수 있나요?

eeeesong commented 3 years ago

@ehdrhelr 아아 카운트랑 로그는 생각을 안하고 그냥 예시를 써버렸습니다.. 혼동을 드려 죄송합니다ㅠㅠ 공 5번 던져서는 2-2가 나올 수 없다는 말씀이신거죠?!

new-pitch의 count는 5번째 공을 던졌고, 결과는 스트라이크며, 그에 따라 2-2가 되었다 가 맞습니다!!

eeeesong commented 3 years ago

@Lia316 아 그러네요ㅎㅎ -1과 1이 동시에 있으면 표현을 할수가 없군요.. 이 부분이 좀 어렵네요 허허

그러면 각 루의 in / out 을 각자 따져야 할 것 같네요! (점수 득점 없이 out만 되는건 고려 안하기로 한 게 맞죠? 만약 그것까지 고려해야한다면 In / next / out 정도를 다 따져야 할 것 같아서..)

그렇다고 한다면 이런 방식이 괜찮지 않을까 싶습니다!!

"first": {
   "in": false,
    "out": true
},
"second": {
  "in": true,
  "out": true
},
"third": {
  "in": true,
   "out": true
}

그럼 home은 없어도 되겠네요!! 혹시 더 좋은 방법이 떠오르신다면 말해주세요!

Lia316 commented 3 years ago

오 괜찮은 것 같습니다!

또 다른 의문점이 생기면 그때 다시 생각해보구! 일단은 이렇게 해도 좋을 것 같습니다!

ehdrhelr commented 3 years ago

호옥시 게임을 선택하고 제일 처음 보여지는 1이닝은 이 정보만 드려도 될까요?? (1이닝에서 pitch가 진행됨에 따라 new-pitch, ball-changed, base-changed가 추가된 json 데이터 전달드릴 예정) 더 필요한 부분이 있다면 추가하겠습니다..!!

{
    "data": {
        "teams": {
            "away": "Marvel",
            "home": "Captain"
        },
        "inning": {
            "counter": 0,
            "top": false
        },
        "score": {
            "away": 0,
            "home": 0
        },
        "batter": {
            "name": "시온",
            "info": "백엔드 천재"
        },
        "pitcher": {
            "name": "리아",
            "info": "iOS 천재"
        }
    },
    "error": null
}
eeeesong commented 3 years ago

@ehdrhelr 넵넵!! 너무 괜찮습니다 :) 근데 혹시 inning counter는 0 == 1회가 맞나요??

eeeesong commented 3 years ago

(일단최종) JSON

리아가 말씀해주신 부분 반영한 (일단최종) JSON 입니다!!

@ehdrhelr 바뀐 부분은 base-changed 부분 하나예요!

{
  "data": {
    "teams" : {
      "home": "Marvel",
      "away": "Captin"
    },
    "inning": {
      "counter": 2,
      "isTop": false
    },
    "score": {
      "home": 5,
      "away": 1,
    },
    "batter": {
      "name": "shion",
      "info": "백엔드 천재"
    },
    "pitcher": {
      "name": "lia",
      "info": "iOS 천재"
    },
    "new-pitch": {
      "count": 5,
      "result": "스트라이크",
      "log": "2-2"
    },
    "ball-changed": {
      "strike": 1,
      "ball": 0,
      "out": 0
    },
    "base-changed": {
        "first": {
            "in": false,
           "out": true
        },
        "second": {
           "in": true,
           "out": true
       },
        "third": {
           "in": true,
           "out": true
       }
    }
  }, 

  "error": null

}
ehdrhelr commented 3 years ago

@eeeesong 감사합니다!! inning counter는 실수입니다 ㅠㅡㅠ ,, 1 == 1회로 바꿀게요!!

eeeesong commented 3 years ago

아직 네트워크 받아온 뒤 GameDTO 형식을 프론트 내부 타입에 적용하는 부분을 구현하지 못해서 이 이슈는 조금 더 열어놓겠습니다!