Духовность™, в сложных случаях удобно программировать сверху вниз, например:
PHP:
class CalculatePrice
{
public function start()
{
if ($this->isHaveDiscount()) {
return $this->getInitialPrice() - $this->getDiscount();
}
return $this->getInitialPrice();
}
protected function isHaveDiscount()
{
if ($this->userExceededDiscountLimit()) {
return false;
}
if ($this->productAction()) {
return true;
}
if ($this->purchaseAmountAction()) {
return true;
}
}
protected function getDiscount()
{
if ($this->productAction() && $this->purchaseAmountAction()) {
return $this->largerDiscount();
}
if ($this->productAction()) {
return $this->getProductActionDiscount();
}
if ($this->purchaseAmountAction()) {
return $this->getPurchaseAmountActionDiscount();
}
}
}
Как видишь, реализации низкого уровня нет, только заглушки методов. На этом этапе сосредотачиваешься только на алгоритме высокого уровня. Разве можно сказать, что этот код непонятен и в нём трудно разобраться? Разве имеет значение, стоит в условии вызов метода или непосредственно его реализация из одной строчки? Потом, когда будет реализация, какие-то методы заменятся непосредственно их реализацией, какие-то так и останутся.
Если методы циклично вызывают друг друга, значит это рекурсия, по твоему в одном методе такой алгоритм будет лучше реализовать?
Как-то на работе с коллегой тоже зашёл разговор на тему читабельности кода. Коллега утверждал что ему проще разобраться в 100 строчках одного метода, чем в 10 методах по 10 строчек. Дошли до того, что сели за комп и начали разбираться в каком-то чужом ООП коде. Когда я посмотрел как он это делает, я понял в чём проблема. Дело в том, что восприятие кода полностью опирается на понимание последовательности выполнения кода. В методе на 100 строк коллега мог разобраться, так как там последовательность выполнения понятна, код выполняется строчка за строчкой, не считая условий, когда какая-то часть кода не выполняется. Когда же коллега пытался разобраться в ОПП коде, он просто скролил код туда сюда, просматривая все методы подряд и пытаясь что-то понять из их названия. Тогда я показал коллеге заветные клавиши перехода по методам (Ctrl + B для NetBeans), нашли точку входа в алгоритм (как правило паблик метод с которого всё начинается) и потом за три клика нашли метод, который реализовывал определённую часть алгоритма и разобрались в 10 строчках. Обратите внимание, мы не изучали попутно ещё 90 строчек кода, чтобы найти эти 10.
Отдельный разговор о профилировании кода. Анализировать результат профилирования и оптимизировать гораздо легче имея много небольших методов, чем один на 100 строк. В отдельных случаях, в особо узких местах приходиться сворачивать несколько методов в один большой, чтобы повысить производительность. Но это делается в строго определённом месте, а не по всему проекту, и не может служить оправданием для тех кто сразу лепит большие методы.