Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FeatureFlag の実装 #4362

Draft
wants to merge 10 commits into
base: master
Choose a base branch
from
Draft

FeatureFlag の実装 #4362

wants to merge 10 commits into from

Conversation

Takeno-hito
Copy link
Member

fix: #4357

  • FeatureFlag を実装した
  • 使い方のサンプルを FeatureFlag に入れた
  • 乱用してほしくないので FeatureFlag 利用の仮ルールをコメントで残した(ここは議論の余地があると思います とりあえずたたき台くらいの温度感でルールをコメントに残しています)

@Takeno-hito Takeno-hito added the enhancement New feature or request label Aug 9, 2024
@Takeno-hito Takeno-hito self-assigned this Aug 9, 2024
Copy link

github-actions bot commented Aug 9, 2024

@Takeno-hito Takeno-hito requested review from cp-20 and nokhnaton August 9, 2024 11:59
Copy link
Contributor

@nokhnaton nokhnaton left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

実装は基本は問題無さそうですがいくつか気になった部分をコメントしました!

運用面で気になったポイントとしては以下のような感じです

  1. 本実装する際に、FeatureFlagと同じ動作をすることをどうやって保証するか。現状切り替えの際に違う動作になることがあったりしそうだから、「FeatureFlag部分は別のコンポーネントに分ける」みたいなルールを決めたい。
  2. FeatureFlagの実装の告知をどこでやるのか。全体通知はやりすぎな気がする。
  3. リリースサイクルをどうするか。この機会にマージされる事にリリースするようにしてもいいのかもしれないけど議論がややこしくなりそう。

ここらへんがめんどくさそうだからPTBみたいなのもありかなーとはちょっと思ったけど、それはそれで画像とか引用とかまわりが難しそうだからせっかく作ってもらったし、FeatureFlagで一旦運用してみるのでいいのかなと思ってます

return state.status.get(flag) ?? featureFlag.defaultValue
}

const FeatureFlags = computed(() => {
Copy link
Contributor

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]) => {
Copy link
Contributor

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<
Copy link
Contributor

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<
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FeatureFlagsがMapでこっちがRecordなのって何か理由ありますか?ないなら統一しちゃいたいです。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

使う時はRecordの方が使いやすいと思うので、Recordに統一するのが良さそうに見えます

Copy link
Contributor

@cp-20 cp-20 left a 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')
Copy link
Contributor

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">
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

featureFlagTab のスタイルが効いてない (間隔を開けたいんだと思うが、実際に子要素はdiv1つしかないので意味がない) ので、上手くやると良さそうです

Comment on lines +6 to +10
<h4 v-if="FlagStatus['flag_test']">ていきょうしゅうりょうび</h4>
<h4 v-else>提供終了日</h4>
<p>
{{ props.endAt.toLocaleDateString() }}
</p>
Copy link
Contributor

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'
Copy link
Contributor

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 という型は自動で導出できそうです

@nokhnaton nokhnaton marked this pull request as draft November 11, 2024 08:58
@nokhnaton
Copy link
Contributor

考慮したいことが多いのと現状あまりメリットを感じられなくなったので一旦draftにします

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Feature Flag を追加できるようにする
3 participants