Был у меня код вроде вот такого ([[nodiscard]] и прочие элементы хорошего стиля убраны для упрощения):
|
class element_finder_t { public: search_result_t find_element(const search_conditions_t & conditions) { if(should_use_first_algorithm(conditions)) return find_by_first_algorithm(conditions); else if(should_use_second_algorithm(conditions)) return find_by_second_algorithm(conditions); ... } private: search_result_t find_by_first_algorithm(const search_conditions_t & conditions) { ... // Какой-то код для поиска элемента в цикле. if(is_conditions_fulfilled(element_info, conditions)) return element_info; ... // Какой-то код для подготовки следующей итерации. } search_result_t find_by_second_algorithm(const search_conditions_t & conditions) { ... // Какой-то код для поиска элемента в цикле. if(is_conditions_fulfilled(element_info, conditions)) return element_info; ... // Какой-то код для подготовки следующей итерации. } }; |
В один прекрасный день потребовалось кроме метода find_element добавить еще и метод find_element_with_postprocessing. Отличие нового метода от старого find_element в том, что когда элемент удовлетворяющий условиям поиска найден, то нужно сделать некую дополнительную постобработку. К сожалению, постобработка может привести к тому, что элемент перестанет удовлетворять условиям поиска. В таком случае нужно попытаться найти следующий подходящий элемент.
В лоб такое расширение element_finder_t можно было бы сделать так: