Skip to content

コードを書いていると良い方法を思いつく事例

新しい機能を有効化するとき、少しずつ展開していきたいのでオーガニゼーション毎に有効化するかどうかを判断したいという状況があった。このとき、writer に届くリクエストのメトリック名には、先頭にオーガニゼーションIDが入っているので、分岐はこれを使えばいいだろうと思った。

というわけで最初の実装はこうなっていた。

async addWithAggregationOfSameHashTag(metrics: readonly Datapoint[]): Promise<readonly Datapoint[]> {
...
for (let t = timestamp; t < timestamp + this.interval; t += prevMetricCache.interval) {
if (metricsByTimestamp[t] !== undefined)
points.push(metricsByTimestamp[t]);
else if (oldMetrics[t] !== undefined)
points.push(oldMetrics[t]);
}
const t = datapointExtensionType(metricName); // 有効なorgはグローバルにある
const a = aggregateDatapoints(metricName, timestamp, t, points);
newMetricsByName[metricName].push(a);
...
}

各メトリックごとに実行しても計算コストはそこまで多くないだろうし、別に困らないのだが、これは有効なオーガニゼーションのリストをグローバルに持っているので、有効と無効それぞれでテストを行いたい場合はモック等で切り替えるしくみが必要になる。これもやれば出来るので、LLMで生成したコードがモックするテストになっていても違和感はなかっただろうけれども、関数の名前が示すようにこれは同一のRedisハッシュで限定された状態で実行されるものであるし、ハッシュには必ずオーガニゼーションIDが全部含まれるので、じつは全て同じIDを持つことになる。そうであれば呼び出す前に計算しておいて、引数として渡せばいいのではないか。

async addWithAggregationOfSameHashTag(
metrics: readonly Datapoint[],
extensionType: DatapointExtensionData["type"]
): Promise<readonly Datapoint[]>

こうすると、テストのときモックが不要になるし、metrics に異なるオーガニゼーションが混在していたときの問題も起きないことがシグネチャから分かるし、意図も明確になる。LLMを使って生成すると、テストするときにモック作るのが面倒だなと思うことはなく、最初の設計をそのまま使ってしまっただろう。