たとえば以下みたいなデータ構造がDatastoreにあるとする
type UserSetting struct { UseNotification Bool `datastore:"useNotification"` }
これはユーザーの設定として「通知をするか/しないか」を表現しているものだが、もしも仕様変更でTrue/False以外の値を設定したくなった場合には問答無用でマイグレーションを行わねばならない。マイグレーションを行うということは、アプリケーションを停止したり不整合を防ぐなどの処置をせなばならず、そこそこ負荷が大きい。
このような将来の変更を見越すのならば、以下のようにStringとするのがよい。
type UserSetting struct { Notification Notification `datastore:"notification"` } type Notification = String const ( On Notification = "on" Off Notification = "off" )
文字列の列挙型のような形で表現すれば真偽値と同等の表現は問題なくできる上、もし真偽値以上のデータを取りたくなった場合にも容易に対応できる。
また、文字列ではなく数値で表現(1=on, 2=off)するのはどうなんだ、という話もある。
これは実際にプロダクトで使った経験から言うと、非常にデバッグがしづらい。もちろん、文字列を使っている場合でもその文字列が正しい表現になっていなければそれまでだが、数値だと今度は「その数値がなにを表しているのか?」を知るためにコードを読んだり、別のドキュメントにマスターデータ的な対照表を用意しておく必要が出る。
「コードを読むのが一番正しい」というのは間違いないが、たとえば新人が入ってきた際にフラグが表すものを知るために1からコードを読ませるというのは相当工数の無駄だろう。もちろん、新人じゃなくたって大変だ。
- 作者: 河村康爾,北沢匠,佐伯嘉康,佐藤直生,原沢滋,平山毅,李昌桓,渡部徹太郎
- 出版社/メーカー: 秀和システム
- 発売日: 2017/05/09
- メディア: Kindle版
- この商品を含むブログを見る