Правильный код: if(cache.indexOf(query) != -1) { fast_path }
Ну и в итоге первый элемент кэша никогда не используется.
Вопрос: как это юнит-тестить? Работает-то оно одинаково, только с разной скоростью.
This entry was originally posted at http://wizzard.dreamwidth.org/395945.html. It has
Foo() {
if (cached) { Stats.Increment("FastPath"); Fast(); }
else { Stats.Increment("SlowPath"); Slow(); UpdateCache(); }
}
TestFooCaching() {
Foo();
AssertStatEquals(1, "SlowPath");
AssertStatEquals(0, "FastPath");
Foo();
Foo();
AssertStatEquals(1, "SlowPath");
AssertStatEquals(2, "FastPath");
}
Понятно, что вместо Stats может выступать любое средство диагностики. В нашем случае, оно обычно остается и в продакшне: используется для реалтайм-диагностики, графиков, алертов, и т.п.
Но, понятно, если Stats отжирает ощутимо от FastPath, то может придется оставить его только в SlowPath, или и вовсе заменить местным велосипедом предназначенным только для тестов, а из продакшна вырезать, или хотя бы апдейтить каунтер не каждый раз.
Edited at 2014-10-23 09:29 pm (UTC)