我有一个函数,可以从数据库中加载一些东西并将它们放入一个选择列表中。功能如下: (伪代码)
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语句。这迫使我们在准备调用之前进行另一次测试,因此只返回原始函数的返工。
根据我的经验,这意味着我的逻辑处于某个地方。如果我有什么值得说的话,我会回顾我的设计和霍拉。
再次感谢所有
答案 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个)提案。PHP Coding Standards Fixer也是你的朋友。
所以:
答案 1 :(得分:0)
如果条件不为真,您可以反转if语句并退出函数以消除一级嵌套。虽然逻辑看起来还不错。