PartizaneN
I speak PHP
Expection handling
Привет всем!
Недавно попробовал использовать эксэпшны для реализации алгоритма кэширования результатов выполнения функции (метода).
Задача была следующей: Многие статические методы вызывались по несколько раз для различных вычислений, и с целью оптимизации, когда проект уже подошёл к концу - нужно было соптимизировать.
Пример статического метода:
Придумалось использовать для этого Эксэпшны, причём так чтобы выглядело следующим образом:
Что же происходит - вначале пытаемся вернуть закэшированный результат выполнения функции - если не находится кэша - выкидывается эксэпшн и идёт в catch. Дальше $cache->set закэширует результат этого метода. и в следующий раз до кэтча не дойдёт.
Всё было бы хорошо, если бы не существовало анти-паттерна схожего:
http://en.wikipedia.org/wiki/Expection_handling
......
Вопрос заключается в следующем - является ли алгоритм мой анти-паттерном (т.к. не совсем для эррор хэндлинга используются эксэпшны, а для кэширования), либо всё-таки - сойдёт (впринципе пробуется сделать ретурн закэшированного значения и т.к. его нету возникает эррор и выкидывается эксэпшн)?
Привет всем!
Недавно попробовал использовать эксэпшны для реализации алгоритма кэширования результатов выполнения функции (метода).
Задача была следующей: Многие статические методы вызывались по несколько раз для различных вычислений, и с целью оптимизации, когда проект уже подошёл к концу - нужно было соптимизировать.
Пример статического метода:
PHP:
class ShippingCalculator{
/**
* Gets shipping costs
*
* @param SingleParcel $parcel
* @return array
*/
public static function getCost(SingleParcel $parcel) {
//....
$query="SELECT * FROM price_location_bands
WHERE pickup_country='".$parcel->get('pickup_country')."'";
// и тому подобные запросы дальше и вычисления
return array('price_band'=>$priceBand,'delivery_time'=>$deliveryTime,'price'=>$price);
}
}
PHP:
class ShippingCalculator{
/**
* Gets shipping costs
*
* @param SingleParcel $parcel
* @return array
*/
public static function getCost(SingleParcel $parcel) {
try{
return CalculatorsCache::get($parcel);
}catch(CalculatorsCache $cache){
//....
$query="SELECT * FROM price_location_bands
WHERE pickup_country='".$parcel->get('pickup_country')."'";
// и тому подобные запросы дальше и вычисления
return $cache->set(array('price_band'=>$priceBand,'delivery_time'=>$deliveryTime,'price'=>$price));
}
}
}
Всё было бы хорошо, если бы не существовало анти-паттерна схожего:
http://en.wikipedia.org/wiki/Expection_handling
......
Вопрос заключается в следующем - является ли алгоритм мой анти-паттерном (т.к. не совсем для эррор хэндлинга используются эксэпшны, а для кэширования), либо всё-таки - сойдёт (впринципе пробуется сделать ретурн закэшированного значения и т.к. его нету возникает эррор и выкидывается эксэпшн)?