ag 付きで実装しておくことで、その機能の反映可否 をコードを変更することなく 行 えるようにできる •「 fl ag 付きで実装する = fl ag を含む if 分岐で実装を囲んでおくことによっていつでもその実装を有効化無効化できるよ うに実装をしておく」 •役割を終えたら feature fl ag を削除する、といいうのを徹底してやらないとコードが複雑化 してしまう •feature fl ag の実装は属 人 化しがちなので、早めに実装した 人 が削除しないと簡単に負債化してしまう The Go gopher was designed by Renée French. GO Feature Flag
ON ͷ࣌ʹ࣮ߦ͍ͨ͠ॲཧ // ex.) ө͍ͨ͠मਖ਼ // ex.) AB ςετͷ A Λ༗ޮԽ͢Δ // ... } else { // flag OFF or flag Λઃఆ͍ͯ͠ͳ͍࣌ʹ // ࣮ߦ͍ͨ͠ॲཧ // ex.) मਖ਼લͷطଘͷ࣮ // ex.) AB ςετͷ B Λ༗ޮԽ͢Δ // ... } 実装イメージ • HOGE_FLAG とういう fl ag が ON だっ た場合と OFF だった場合の処理を if 文 で書く • AB テストや特定の実装を有効化する場 合などに使える The Go gopher was designed by Renée French. GO Feature Flag
見 ていって、- version / + version の構造体を作成 • 振り分けていく際に、+/- がついていた 行 はその位置を記録しておく • - だった場合は、最後に - ではなかった位置を記録しておく - が連続していた場合でも、最後に - ではなかった位置を記録 後にここに if else の node を差し込む // patchVersion is one of the versions of // a patch specified in a unified diff. type patchVersion struct { // Contents of the file. Contents []byte // Positional information for each line in Contents. // // Each LinePos contains matches an offset // in Contents to a token.Pos in // the original patch file. Lines []section.LinePos } // LinePos contains positional information about a line in a buffer. type LinePos struct { // Offset of the first character of this line. Offset int // Original position from which this line was extracted. Pos token.Pos // * New Added // Type of the line: '+' for true, ‘-' for false, ' ' // for unchanged Type LineType // * New Added // position of the plus side when minus elements are embedded MinusToPlusPos token.Pos }
AST を構築して feature fl ag 用 に AST を差し替えることが できた • まだ実戦導 入 するには不 足 している部分が多いが、ここからさらに 色 々なパ ターンに対応していきたい The Go gopher was designed by Renée French. GO Feature Flag