2015-05-12 6 views
1

У меня есть функция, которая загружает список вещей из базы данных и помещает их в список выбора. Функция выглядит следующим образом: (псевдокод)Это слишком много строк и слишком много вложенных блоков?

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 дает подсказку кода, что это слишком много линий и слишком много вложенных блоков. Я лично считаю, что эта функция должна быть приемлемой. Я также чувствую, что разбить логику на более мелкие функции - это немного бесполезно, но почему бы небезопасные мне лгать?

поэтому мои вопросы заключаются в следующем:

Это плохая логика или я хорошо идти вперед? Я хотел бы приветствовать любые предложения о том, как я могу перепроектировать функцию для соответствия ограничениям NetBean.

редактировать:

Я не буду отвечать на свой вопрос, но в этом случае был один вложенный блок, который был не нужен. Pdo извлекается из одноэлементного класса, у которого есть блок try/catch. Мне не нужно повторять это снова в этой функции, потому что исключение уже было пойманным.

редактировать 2:

Удаление блока попытка поймать был так же, как грабят Питера, чтобы заплатить Павлу. Поэтому, если исключение создается при создании экземпляра pdo, оно не останавливает выполнение. Таким образом, мы пытаемся вызвать оператор prepare для объекта PDO, который не был инициализирован правильно. Это заставляет нас вводить еще одно испытание перед вызовом подготовки, таким образом, просто возвращаясь к переделке исходной функции.

По моему опыту, это означает, что где-то вдоль линии моя логика настилается. Я собираюсь пересмотреть свой дизайн и вернуть Холла, если у меня есть что-то достойное сказать.

Еще раз спасибо всем

+0

По правде говоря, это 4 линии, которые на самом деле выполняют действие в коде с 5 уровнями глубины, но это не должно быть слишком плохо. Просто попробуйте написать несколько строк кода, и он должен уйти (или отключить функцию в Netbeans). –

+0

Логика выглядит отлично. Как правило, вы можете абстрагировать настройку экземпляра PDO в свой собственный класс со своей собственной архитектурой отчетов try/catch/error. Затем вы можете просто захватить результирующий указатель уровня класса к экземпляру PDO и принять в остальной части вашего кода, что вам не нужно обертывать все в try/catch, и вы можете просто проверить, выполняется ли запрос или нет. Прохождение строк отлично, хотя (не уверен, какой язык), вероятно, имеет функцию типа fetchAll, которая выгружает ее в аккуратный маленький массив для вас. – joshstrike

+0

Спасибо, ребята, я так понял! У меня есть экземпляр PDO в одноэлементном классе и в блоке catch try. Причина, по которой у меня было время для входа в массив, - каждый результат, например, помещается в другой объект - myObject-> InsertChild (row); если вы получите мой дрейф. спасибо Эрик и Джош за руководство. – Shibby

ответ

3

Ваш код хороший. То, что предлагает 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 
    }   
} 

Я видел людей, имеющих различные предпочтения, так как нет жестких правил. Например, Энтони Феррара personally thinks он не должен выходить за рамки четырех уровней, где я лично считаю, что на четырех уровнях слишком много.

Точка вы должны минимизировать вложенность и количество строк столько, сколько сможете. Когда ваш метод слишком велик (иногда его называют богом метод), это означает, что вы делаете это неправильно.

Вы также можете посмотреть на этой хорошей статье Уильяма Дюрана на эту тему, где обсуждают несколько (на самом деле 9) предложений, предложенных Джефф Бей в своей книге ThoughtWorks Anthology

Object Calisthenics

Также PHP Coding Standards Fixer это ваш друг.

Итак:

  • Ваш текущий код прекрасно
  • Создание ваших личных предпочтений и свести к минимуму вложенности и количество линий, где possible.
+0

Спасибо вам за это. Я рассмотрю эти статьи и буду следовать вашей рекомендации. Я стараюсь, чтобы все мои классы и функции были минимальными, но полными. спасибо еще раз, все самое лучшее – Shibby

+0

@Shibby: Добро пожаловать – Sarfraz

0

Вы могли бы повернуть вспять, если заявление и выйти из функции, если условие не выполняется, чтобы устранить один уровень вложенности. Однако логика выглядит тоже хорошо.

+0

Спасибо за ваш комментарий. Я только что удалил избыточный блок try/catch, поскольку у меня уже есть блок catch try, когда я создаю экземпляр объекта POD. все самое лучшее – Shibby

+0

Привет, спасибо за вашу помощь. Я отметил ответ ниже только потому, что он охватывает немного больше общей теории, но такое же решение для кодирования, как и то, что вы сказали. Еще раз спасибо – Shibby

Смежные вопросы