2011-07-28 92 views
-2

我正在用Drupal的PHP自動測試工作。這是一個有兩種我關心的方法的類:pass()fail()。每個人在結果頁面上產生一個單獨的行,指示特定操作是否通過或失敗,例如,三元或類似的選擇功能?

if ($value == "expected_value") { 
    $this->pass("Looking for expected value"); 
} else { 
    $this->fail("Looking for expected value"); 
} 

我注意到上面的內容是它有點冗長。我想做類似三元賦值的事情,而不是在我決定調用哪個函數的地方。喜歡的東西:

$function = ($value == "expected_value") ? "pass" : "fail" ; 
$this->$function("Looking for expected value."); 

這是最簡潔,優雅的方式,我可以詞組這種邏輯?我試過

$this->(($value == "expected_value") ? "pass" : "fail")("Looking for expected value."); 

但是我得到了一個解析錯誤。是否有辦法將它歸結爲一行,如三元賦值?

編輯我發現的冗長不是if-else結構,但我重複兩次相同的消息。在我看來,應該有一種表達方式,我只在這裏宣佈信息。當然,我可以把它放在一個變量中,但是這佔用了額外的空間,我也通過了兩次。

下面是構建我的問題的另一種方式:是否有一種方法可以定義此邏輯,但只能一次性表示Looking for expected value

+2

看來你正試圖通過語法來簡化,而不是通過設計。不要試圖壓縮你的代碼,而要創建一個簡單的類來驗證數據並自動調用通過/失敗。嘗試從應用程序特定代碼中獲取'通用'代碼。 –

+1

我同意。通過一切手段,使用KingCrunch的答案中顯示的三元組,但是這樣做是爲了替換函數名稱本身?這樣下去只有瘋狂的謊言。如果你在兩年內打開這個網站並試圖弄清楚到底發生了什麼,那麼好處(我向你保證你完全被感知,而不是真實的)不值一秒鐘的困惑。 – Andrew

回答

1

我認爲你原來的代碼是最好的可讀性,但如果你想要的東西更短的(儘管不一定優雅),你可以這樣做:

call_user_func(
    array($this,$value == "expected_value"?'pass':'fail'), 
    "Looking for expected value." 
) 
+0

我喜歡這個答案,因爲它只定義了消息一次:) – user151841

+0

是的,這比將消息放入變量中更容易。 '' – webbiedave

+0

請注意,您可以爲變量分配函數(http://php.net/manual/en/functions.variable-functions.php)。我有別名的GD圖像函數,但我從來沒有嘗試過任何使用'$ this->''$ foo = $ this-> bar('baz');'。這個想法是分配通過或失敗的功能,而不是在測試中調用它,然後調用變量 – horatio

7

我會使用通常的if-elseif -statement,因爲它是最明顯的,可讀的(也許它只是我)它不是「詳細」,它只是一個if-elseif-陳述。

然而

($value == $expectedValue) ? $this->pass() : $this->fail(); 
+0

我喜歡它,但我仍然必須輸入相同的通過/失敗消息兩次,或者將其聲明在前一行的變量中。 – user151841

+1

我感覺的冗長不是'if-elseif',而是我重複兩次相同的消息字符串。在我看來,應該有辦法只寫一次參數。 – user151841

+1

不管通過還是失敗,爲什麼消息都是相同的? – barfoon