ternario o qualcosa di simile per la scelta della funzione?

0

Ho postato questa domanda su stackoverflow e ha avuto un problema ricezione. In realtà, i problemi che sto affrontando sono minori e qualsiasi soluzione alternativa può essere considerata poco pratica. Tuttavia, credo che potrebbe essere di interesse generale nel dominio astratto dell'informatica, quindi mi sto dando da fare qui.

Sto lavorando con i test automatici di Drupal in PHP. È una classe con due metodi che mi preoccupano: pass() e fail() . Ciascuno produce una riga separata su una pagina dei risultati che indica se una determinata operazione ha superato o fallito, ad es.

if ( $value == "expected_value" ) {
  $this->pass("Name of Test");
} else {
  $this->fail("Name of Test");
}

(La ragione per cui drupal fa così è che nei risultati, puoi vedere "Nome del test" in una barra verde se è passato, e in una barra rossa se non è riuscito. In altre parole "Testing Feature A : failed "o" Test of Feature A: passed ". Ovviamente puoi inserire due messaggi diversi lì, ma nella mia situazione, voglio mettere lo stesso messaggio in)

Quello che noto di quanto sopra è che sembra prolisso, in quanto ripeto lo stesso messaggio due volte. Mi sembra che dovrebbe esserci un modo per esprimere ciò in cui dichiaro il messaggio una sola volta. Ovviamente potrei inserirlo in una variabile, ma ciò richiede spazio extra e lo passo anche due volte.

Mi piacerebbe fare qualcosa come assegnazione di ternario, solo invece dove decido quale funzione chiamare. C'è un modo per definire questa logica mentre esprimo solo Name of Test una volta?

Qualcosa come:

$function = ($value == "expected_value") ? "pass" : "fail" ;
$this->$function("Name of Test");

È questo il modo più conciso ed elegante in cui posso esprimere questa logica? Ho provato

$this->(($value == "expected_value") ? "pass" : "fail")("Name of Test");

Ma ho un errore di analisi. C'è un modo per portarlo a una riga, come un compito ternario?

Modifica Ecco la migliore formulazione della mia domanda fino ad oggi: "Qual è una sintassi che posso usare, in qualsiasi linguaggio o pseudo-codice, per esprimere ciò senza dire Name of test due volte?"

Mi sento come se dovessi essere in grado di esprimere questa logica senza dire Name of Test due volte (ovunque, anche all'interno di un'altra funzione che chiamo altrove nel codice). Sembra che PHP non mi consenta di esprimerlo in questo modo, quindi sto cercando degli esempi in altri linguaggi (e le persone hanno già pubblicato esempi C, javascript e python) che ti permettono di esprimere ciò conciso senza ripetermi.

    
posta user1936 18.10.2011 - 03:50
fonte

5 risposte

3

Poiché hai detto in un commento che eri curioso anche di altre lingue, funziona in javascript.

(value == "expected_value" ? pass : fail) ("Name of Test");

    
risposta data 18.10.2011 - 04:43
fonte
1

Se la tua lingua supporta le funzioni di prima classe, puoi farlo in modo semplice come segue: Pseudo codice:

function handleTest (bool result, string testName,Function pass, Function fail)
{
    result ? pass(testName) : fail(testName);
}

// Uso

handleTest($value == "expected_value","Name of Test", $this->pass,$this->fail);
    
risposta data 18.10.2011 - 06:33
fonte
1

È passato un po 'di tempo da quando ho guardato a PHP, ma questo dovrebbe darti quello che stai cercando:

class Tester
{
    public function pass($s) {
        echo "pass $s\n";
    }

    public function fail($s) {
        echo "fail $s\n";
    }

    public function test($e, $v) {
        call_user_func($e == $v ? array($this, "pass") : array($this, "fail"), "my test");
    }
}
$t = new Tester();
$t->test(1, 1);
$t->test(2, 1);

test ideone qui

Detto questo, generalmente è bello avere test unitari (e il loro framework associato il più leggibile possibile.) Quello che hai già è più leggibile del codice precedente.Se sei preoccupato per la duplicazione della stringa, perché non solo memorizzarlo in una variabile locale e passarlo a pass o fail ?

    
risposta data 18.10.2011 - 07:33
fonte
1

Python

(self.pass if value == "expected_value" else self.fail)("Name of Test")

Alcune lingue hanno funzioni come oggetti di prima classe e metodi di classe.

[La risposta è breve perché la domanda non è davvero una domanda, è una recensione dei limiti di PHP con un commento "potrebbe essere di interesse generale" che in qualche modo fa una lunga dichiarazione su PHP in una domanda su altri le lingue. Poiché la domanda non è chiara, è difficile fornire più risposte. Questa breve risposta non cerca di respingere la tua domanda. I moderatori mi hanno avvertito che le risposte brevi sono sprezzanti. Dal momento che non posso fornire più risposte, posso solo scusarmi in anticipo e spero che tutti capiscano che non sono sprezzante. La domanda è difficile da capire e rispondere.]

    
risposta data 18.10.2011 - 12:00
fonte
0

Perché non creare una funzione che gestisca entrambi i casi, con un argomento booleano da scegliere tra loro? Nel caso di Simpletest, appare puoi solo dire questo:

$this->assertTrue($value == "expected_value", "Name of Test");
    
risposta data 18.10.2011 - 16:07
fonte

Leggi altre domande sui tag