Это слишком много строк и слишком много вложенных блоков?
У меня есть функция, которая загружает список вещей из базы данных и помещает их в список выбора. Функция выглядит следующим образом: (псевдокод)
protected function Foo()
{
try {
get pdo instance
prepare statement
if (pdo query executes)
{
while (row = fetched rows)
{
do stuff with row
}
}
}
catch (PDOException $ex)
{
do error stuff here
}
}
NetBeans дает подсказку кода, что это слишком много строк и слишком много вложенных блоков. Я лично чувствую, что функция должна быть приемлемой. Я также чувствую, что разбить логику на более мелкие функции - это немного глупо, но зачем мне врать netbeans:)?
поэтому мои вопросы таковы:
Это плохая логика или мне хорошо идти вперед? Я бы приветствовал любые предложения о том, как мне изменить дизайн функции, чтобы она соответствовала ограничениям NetBean.
редактировать:
Я не буду отвечать на свой вопрос, но в этом случае был один вложенный блок, который не был нужен. Pdo извлекается из одноэлементного класса, который имеет блок try/catch. Мне не нужно повторять это снова в этой функции, потому что исключение было бы уже поймано.
редактировать 2:
Снятие блока "попытка поймать" было похоже на ограбление Питера, чтобы заплатить Полу. Поэтому, если исключение выдается при создании экземпляра pdo, это не останавливает выполнение. Таким образом, мы пытаемся вызвать оператор prepare для объекта PDO, который не был правильно инициализирован. Это вынуждает нас выполнить еще один тест перед вызовом подготовки, просто возвращаясь к переработке исходной функции.
По моему опыту, это означает, что где-то вдоль линии моя логика нарушена. Я собираюсь вернуться к своему дизайну и вернуться назад, если у меня есть что-то достойное, чтобы сказать.
Еще раз спасибо всем
2 ответа
Ваш код хорош. То, что предлагает NetBeans, не обязательно является правилом, которому вы должны следовать, и вы бы даже не волновались, если бы использовали какой-то другой редактор, например PHPStorm (В PHPStorm вы можете установить стиль кодирования, соответствующий PSR 1/2).
Вы могли бы по крайней мере покончить с одним вложением, используя что-то, называемое guard clause:
protected function Foo()
{
try {
get pdo instance
prepare statement
if (! pdo query executes) return;
while (row = fetched rows)
{
do stuff with row
}
}
catch (PDOException $ex)
{
do error stuff here
}
}
Я видел людей с разными предпочтениями, так как не существует жесткого и быстрого правила. Например, лично Энтони Феррара считает, что он не должен выходить за пределы четырех вложенных уровней, где я лично считаю, что четыре уровня - это слишком много.
Суть в том, что вы должны минимизировать количество вложений и количество строк. Когда ваш метод слишком велик (иногда его называют богом), это означает, что вы делаете это неправильно.
Вы также можете посмотреть на эту прекрасную статью Уильяма Дюранда на эту тему, где он обсуждает несколько (фактически 9) предложений, предложенных Джеффом Бэй в своей книге " Антология ThoughtWorks".
Также PHP Fixing Standards Fixer ваш друг.
Так:
- Ваш текущий код в порядке
- Создайте ваши личные предпочтения и по возможности минимизируйте количество вложений и количество строк.
Вы можете отменить оператор if и выйти из функции, если условие неверно, чтобы исключить один уровень вложенности. Логика выглядит тоже хорошо, хотя я.