Open5

APIのレスポンスで失敗を避ける考え方

@tyamahori@tyamahori

このAPIレスポンスは避けたいオブ・ザ・イヤー2021

{
    "imiaruBunmyaku1": "hogehoge",
    "imiaruBunmyaku2": "hogehoge",
    "imiaruBunmyaku3": "hogehoge",
    "imiaruBunmyaku4": "hogehoge",
    "imiaruBunmyaku5": "hogehoge"
}

なぜか

  • 拡張性の問題
  • あとからの仕様の都合でnullableになってイケてない。。.
@tyamahori@tyamahori

仕様変更入りましたオブ・ザ・イヤー2021

{
    "imiaruBunmyaku1": "hogehoge",
    "imiaruBunmyaku2": "hogehoge",
    "imiaruBunmyaku3": "hogehoge",
    "imiaruBunmyaku4": null,
    "imiaruBunmyaku5": null
}
  • すでに走り出しているAPIと仮定して、項目をなくすと色々面倒なので、nullを返すようになりました。。
@tyamahori@tyamahori

どうしたらええねん。。オブ・ザ・イヤー2021

  • nullableは避けよう。
  • nullを表現する場合、"item":null ではなく、そもそも項目自体を存在させないほうがきれいかも
  • ネストすることを考えよう
@tyamahori@tyamahori

少しはましかな?しらんけどオブ・ザ・イヤー2021

{
   "imiaruOmotoBunmyaku1":{
      "imiaruBunmyaku1":"hogehoge",
      "imiaruBunmyaku2":"hogehoge",
      "imiaruBunmyaku3":"hogehoge"
   },
   "imiaruOmotoBunmyaku2":{
      "imiaruBunmyaku4":"hogehoge",
      "imiaruBunmyaku5":"hogehoge"
   }
}

ポイント

  • 意味ある文脈にてネストすることで、nullableの表現がきれいになる。
  • 新しい項目を追加しやすくなる

表したい意図の例

  • imiaruOmotoBunmyaku1, imiaruOmotoBunmyaku2 は両方あるかもしれないし、両方ないかもしれない
  • imiaruOmotoBunmyaku1 があるということは、imiaruBunmyaku1, imiaruBunmyaku2, imiaruBunmyaku3は基本的にある
  • imiaruOmotoBunmyaku2 があるということは、imiaruBunmyaku4, imiaruBunmyaku5は基本的にある
  • imiaruBunmyaku4, imiaruBunmyaku5がともnull ならば、imiaruOmotoBunmyaku2 以下はなくて良い
@tyamahori@tyamahori

APIはフロントエンドエンジニアのための情報をかえす。エンドユーザーのための情報は返さなほうがよいかも