2011-08-16 33 views
0

出於好奇我想知道是否有更優雅的方式來寫下面的條件?我看不到更短的寫作方式,但感覺非常笨重,歡迎任何建議!寫出這些條件的更優雅的方式?

 // 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(); 
     } 

回答

0
$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; 
} 

這可能會一直運行下去,如果它永遠不匹配,但我不知道有足夠的瞭解你的應用程序建議終止條件 - 你可以添加一個計數器,或別的東西。

+0

這不是更具可讀性,它主要是一個壓縮版本。 – Seldaek

0

您可以將$this->page分配給一個變量,然後用這個變量開始語句,只是進行非常輕微的改進。

或者,您可以創建嵌套的三元語句來分配$visual,但這當然不是建議的做法。

1

你可以寫,而不是一個循環:

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

我相信這是等價的,將工作無論父母如何多層次/嵌套你。

0

遞歸方法:

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); 

如果您有任何以上類$this->page是一個實例的控制,那麼你可以把它的實例方法。

0

你可以做一個遞歸方法來擺脫那些討厭的條件。此外,您還會爲每個將處理時間加倍的條件分支調用find_all()方法兩次。

下面是一個遞歸函數的嘗試(雖然可能不起作用,但遞歸函數總是有點棘手!)。謹防無限循環。

<?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(); 
     } 
    } 
} 
?> 
0

你可能想使你的代碼中有兩處變化:

  1. 確保getVisuals()返回一個空數組,而不是空的情況下有沒有視覺
  2. 考慮制定一個空對象 - 一個單獨的頁面實例,沒有視覺效果,並且自己作爲父項。它可能有一個像isNull()這樣的方法,因此您可以輕鬆測試給定頁面是否爲空頁面。

如果進行兩次調整,大多數關於視覺效果的代碼將變得更容易編寫和調試。

讓所有的視覺效果兩個層面(我假設你不想遞歸):

$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()); 
} 
相關問題