4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

運動通信社 AdventCalendar 2021Advent Calendar 2021

Day 5

JavaScriptで簡易な定数のグルーピング(ちょっとしたリファクタリングの話)

Last updated at Posted at 2021-12-05

はじめに

こんにちは、運動通信社でバックエンドメインに携わっている Takeya です。
フロントエンドもちょくちょく実装してます。
今回はES6の書式でよく忘れるのでメモしておきたいと思います。

背景

当時の実装方針や歴史的な経緯もあって、ライブ配信ページの定数宣言クラスがこんな感じになってました。

class Config {
  static get BEFORE() {
    return 0;
  }

  static get PLAYING() {
    return 1;
  }

  static get END() {
    return 2;
  }

  // ... 略 (ライブ配信状態と関係ない各種定数が並列に書かれてる)
}

この3つはライブ配信状態を表している定数なので、グルーピングして LIVE_STATUS.BEFORE って参照したいですね。

結論

今回に関しては、なんのことはなく、定数っぽいキー名にしたオブジェクトを返せばいいかなと。

  static get LIVE_STATUS() {
    return {
      BEFORE: 0,
      PLAYING: 1,
      END: 2,
    };
  }

これで Config.LIVE_STATUS.BEFORE で参照できます。

(※Javaとかなら enum で解決な気がしますが、JavaScriptには enum がないです。
Symbol を使えば enum っぽくできるみたいですが、今回はそこまで考えが至らず:sob:)

理想はどうすべきなのか?

おそらく理想は、クラス設計を見直して、あるべきクラスに定数を移管する、のがいいのかなと思います。(Javaっぽく考えると LIVE_STATUS 自体を ValueObject としてクラス化すべきな気がします)

しかしながら、

  • 結構規模があるので設計見直しは工数的に現実的でない。
  • 一部のライブ配信ページは Vue.js に移行し始めているので、Vueとの相性を考えた設計を検討した方が良さそう。
  • ちょっと可読性が気になったという話なので、手軽な修正で可読性が上がればOK。

と思って今回の実装を落とし所にしました。

今回の落とし所だと、 jsdoc でObject型の中身の型を表現できないみたいで、Lint系ツールなど型チェックには弊害があるかもしれません。
リファクタリングは工数(納期)とできることのバランスをとっていくのが難しいところです。

今回は非常にちょっとした話でしたが、少しずつリファクタリングを進めています、っていう一例でした。

おまけ

enum に関して、
TypeScriptなら enum をサポートしてたので軽く調べると、 enum じゃなくて union 型を使おう、ってなってるようです。
色々クセがありますね。。。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?