是这么多行还是嵌套块太多了?

时间:2015-05-12 09:44:12

标签: php netbeans code-hinting

我有一个函数,可以从数据库中加载一些东西并将它们放入一个选择列表中。功能如下: (伪代码)

 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约束的建议。

编辑:

我不会回答我自己的问题,但在这种情况下,有一个不需要的嵌套块。从具有try / catch块的单例类中检索pdo。我不需要在这个函数中再次重复它,因为异常将被捕获。

编辑2:

删除try catch块就像抢劫彼得付钱给Paul一样。因此,如果在创建pdo实例时抛出异常,则不会停止执行。因此,我们尝试在未正确初始化的PDO对象上调用prepare语句。这迫使我们在准备调用之前进行另一次测试,因此只返回原始函数的返工。

根据我的经验,这意味着我的逻辑处于某个地方。如果我有什么值得说的话,我会回顾我的设计和霍拉。

再次感谢所有

2 个答案:

答案 0 :(得分: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
     }        
}

我看到人们有不同的偏好,因为没有硬性规定。例如Anthony Ferrara personally thinks他不应该超越四个嵌套级别,我个人认为这个级别太多了。

要点是你应该尽可能地减少嵌套和行数。当你的方法太大时(有时称为上帝方法),这意味着你做错了。

你可能还想看看威廉·杜兰德(William Durand)关于这个主题的好文章,他讨论了杰夫·贝(Jeff Bay)在他的书ThoughtWorks Anthology

中提出的几个(实际上是9个)提案。

Object Calisthenics

PHP Coding Standards Fixer也是你的朋友。

所以:

  • 您当前的代码非常好
  • 创建您的个人偏好,并尽量减少possible
  • 中的嵌套和行数

答案 1 :(得分:0)

如果条件不为真,您可以反转if语句并退出函数以消除一级嵌套。虽然逻辑看起来还不错。