繁体   English   中英

更优雅的方式来编写这些条件?

[英]More elegant way to write these conditions?

出于好奇,我想知道是否有更优雅的方式来编写下面的条件? 我看不到更短的写法,但感觉很笨拙,所以欢迎提出任何建议!

        // Check whether this page has any visuals
        if (count($this->page->pagevisuals->find_all()) > 0)
        {
            // Ok to go ahead and assign
            $visual = $this->page->pagevisuals->find_all();
        }
        // If this is a sub page, parent page may have visuals we can use
        elseif (count($this->page->parent->pagevisuals->find_all()) > 0)
        {
             $visual = $this->page->parent->pagevisuals->find_all();
        }
        // If two levels deep, grandparent page might have visuals
        elseif (count($this->page->parent->parent->pagevisuals->find_all()) > 0)
        {
            $visual = $this->page->parent->parent->pagevisuals->find_all();
        }

您可以改为编写一个循环:

$page = $this->page;
$visual = null;
while (!$visual && $page) {
    $visual = $page->pagevisuals->find_all();
    $page = $page->parent;
}

我相信这是等效的,并且无论您有多少级别的父母/嵌套都可以。

$visual = $this->page->pagevisuals->find_all()
or $visual = $this->page->parent->pagevisuals->find_all()
or $visual = $this->page->parent->parent->pagevisuals->find_all();

如果它们都不匹配,你会怎么做? 在此代码中,它将设置为最后一个,这与您所做的不同。 (在您的代码中,如果没有匹配,则 $visual 未被触及,在此代码中它将设置为零。您可以添加or $visual = -1或类似的东西。)

如果你想避免所有的 -> 父级,你可以创建一个循环,但你需要一些终结器。

$el = $this->page;
while(!$visual = $el->pagevisuals->find_all()) {
  $el = $el->parent;
}

如果它从不匹配,它可能会永远运行,但我对您的应用程序的了解不够,无法建议终止条件 - 您可以添加一个计数器或其他东西。

您可以将$this->page分配给一个变量并以此开始语句,以获得非常小的改进。

或者,您可以创建嵌套的三元语句来分配$visual ,但这当然不是推荐的做法。

递归方法:

function getVisuals($root) {
    $visuals = $root->pagevisuals->find_all();
    if(count($visuals) === 0 && isset($root->parent)) {
        $visuals = getVisuals($root->parent);
    }
    return $visuals;
}

$visuals = getVisuals($this->page);

如果您可以控制任何 class $this->page的实例,那么您可以将其设为实例方法。

您可以使用递归方法来摆脱那些讨厌的条件。 此外,您为每个条件分支调用 find_all() 方法两次,这使处理时间加倍。

这是递归 function 的尝试(虽然可能不起作用,递归函数总是有点棘手。)。 当心无限循环。

<?php
$visual = $this->page->find_all_visuals();

class Page {
    function find_all_visuals()
    {
        $found = $this->pagevisuals->find_all();

        if (count($found) > 0) {
            return $found;
        } else if ($this->parent == null) {
            return null;
        } else {
            return $this->parent->find_all_visuals();
        }
    }
}
?>

您可能需要对代码进行两项更改:

  1. 确保 getVisuals() 返回一个空数组而不是 null 以防万一没有视觉效果
  2. 考虑制作一个空对象 - 一个 singleton 页面实例,它没有视觉效果并且将自身作为父对象。 它可能具有类似 isNull() 的方法,因此您可以轻松测试给定页面是否为 null 页面。

如果你做了这两个调整,大部分与视觉有关的代码将变得更容易编写和调试。

获取两个级别的所有视觉效果(我假设您不想要递归):

$visuals = array_merge(
    $this->page->pagevisuals->find_all(),
    $this->page->parent->pagevisuals->find_all(),
    $this->page->parent->parent->pagevisuals->find_all(),
);

获取页面或父级或祖父级的视觉效果:

   ($visuals = $this->page->pagevisuals->find_all()) ||
   ($visuals = $this->page->parent->pagevisuals->find_all()) ||
   ($visuals = $this->page->parent->parent->pagevisuals->find_all());

递归函数也会简单得多(这是一种添加到页面对象的方法):

public function findRecursive(){
    $my_visuals = $this->pagevisuals->find_all()
    return $this->parent->isNull()?
               $my_visuals
               : array_merge($my_visuals, $this->parent->findRecursive());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM