-
Notifications
You must be signed in to change notification settings - Fork 40
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
FeatureFlag の実装 #4362
base: master
Are you sure you want to change the base?
FeatureFlag の実装 #4362
Conversation
Preview (prod) → https://4362-prod.traq-preview.trapti.tech/ |
0fb58fe
to
b8bdb7c
Compare
b8bdb7c
to
a53baf1
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
実装は基本は問題無さそうですがいくつか気になった部分をコメントしました!
運用面で気になったポイントとしては以下のような感じです
- 本実装する際に、FeatureFlagと同じ動作をすることをどうやって保証するか。現状切り替えの際に違う動作になることがあったりしそうだから、「FeatureFlag部分は別のコンポーネントに分ける」みたいなルールを決めたい。
- FeatureFlagの実装の告知をどこでやるのか。全体通知はやりすぎな気がする。
- リリースサイクルをどうするか。この機会にマージされる事にリリースするようにしてもいいのかもしれないけど議論がややこしくなりそう。
ここらへんがめんどくさそうだからPTBみたいなのもありかなーとはちょっと思ったけど、それはそれで画像とか引用とかまわりが難しそうだからせっかく作ってもらったし、FeatureFlagで一旦運用してみるのでいいのかなと思ってます
return state.status.get(flag) ?? featureFlag.defaultValue | ||
} | ||
|
||
const FeatureFlags = computed(() => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
この関数はfeatureFlagDescriptions
以外に依存する変数が無さそうに見えて、computedにする必要ないのではと思ったのですが、何か理由があったりしますか?
FeatureFlagKey, | ||
boolean | ||
> | ||
Object.entries(featureFlagDescriptions).forEach(([flag, featureFlag]) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
細かいですけど、featureFlag
は使われてないので無くても良さそうです
- 仮ルールなので必要に応じて変えてほしいです | ||
*/ | ||
|
||
export const featureFlagDescriptions: Record< |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ここをMapにしてしまえばFeatureFlags
などの内部でasを使わないで済みそうです。Recordにする特別な理由がないならMapでいいのかなーと思います。
}) | ||
|
||
const FlagStatus = computed(() => { | ||
const res: Record<FeatureFlagKey, boolean> = {} as Record< |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
FeatureFlags
がMapでこっちがRecordなのって何か理由ありますか?ないなら統一しちゃいたいです。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
使う時はRecordの方が使いやすいと思うので、Recordに統一するのが良さそうに見えます
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
実装的なところは見ていくつかコメントしました
そもそもの要件定義的な部分で、noc7tさんのPTB的な考えは割とアリなのかなという気がしていて、デフォルトON/OFFで分けるのではなくて「ベータ版リリースを受け取る」みたいなのにチェックを入れると全部デフォルトONで振ってくるみたいな方が良いのかなという気がしました (が、サッと実装できなそうなら今の実装でも良いと思います)
title: 'フラグテスト・サンプル用', | ||
description: '「提供終了日」の表記がひらがなになります。', | ||
defaultValue: true, | ||
endAt: new Date('2024-08-31') |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
これだとUTCになっちゃいそうですね (まぁ問題ないと言えばないが)
@@ -0,0 +1,34 @@ | |||
<template> | |||
<section :class="$style.featureFlagTab"> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
featureFlagTab
のスタイルが効いてない (間隔を開けたいんだと思うが、実際に子要素はdiv1つしかないので意味がない) ので、上手くやると良さそうです
<h4 v-if="FlagStatus['flag_test']">ていきょうしゅうりょうび</h4> | ||
<h4 v-else>提供終了日</h4> | ||
<p> | ||
{{ props.endAt.toLocaleDateString() }} | ||
</p> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
細かいですが、提供終了日は横に並べた方が見やすいかもしれません
提供終了日
2024/08/31
ではなく
提供終了日 2024/08/31
みたいにするということです
import { isObjectAndHasKey } from '/@/lib/basic/object' | ||
import { promisifyRequest } from 'idb-keyval' | ||
|
||
type FeatureFlagKey = 'flag_test' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
やらなくてもいいのですが、featureFlagDescriptions を as const satisfies ... にして、そこから型をこねる (keyof typeof featureFlagDescriptions) と FeatureFlagKey という型は自動で導出できそうです
考慮したいことが多いのと現状あまりメリットを感じられなくなったので一旦draftにします |
fix: #4357