Setter con un parametro e valore di default nullo

0

Quale soluzione è più logica? Il valore può essere nullo, ma quando non è nullo deve essere una stringa.

Questo (primo):

function setValue(string $value = null);

Per me questo è male; dato che ora possiamo chiamare il metodo senza nulla:

$dependency->setValue(): 

O questo (secondo)?

function setValue($value)
{
    if(is_string($value) OR $value == null)
    {
        //allow value
    } else {
        //throw error
    }
}

O questo (terzo)?

function setValue(string $value)
{
    $this->value = $value;
}

//client
function client()
{
    $value = "test";
    if($value)
    {
        $this->dependency->setValue($value);
    }
}

Questa soluzione non consente l'impostazione di null.

Preferisco la seconda soluzione. L'unico aspetto negativo è che l'interfaccia non mostra chiaramente quali valori sono accettati.

    
posta Stefan 09.07.2018 - 15:07
fonte

3 risposte

3

Con PHP 7.1 è in realtà abbastanza semplice:

public function setValue(?string $value)
{
    $this->value = $value;
}

o quando vuoi che il valore predefinito sia null quando lo chiami $ object- > setValue ();

public function setValue(string $value = null)
{
    $this->value = $value;
}
    
risposta data 09.07.2018 - 17:00
fonte
1

A mio parere, tutte le tue soluzioni hanno lo stesso problema: stai utilizzando un metodo per due scopi: imposta un valore e reimposta un valore su null.

Quindi disponi di due metodi distinti per ottenere queste due cose:

function setValue(string $value)
{
    $this->value = $value;
}

function resetValueToNull()
{
    $this->value = null;
}
    
risposta data 09.07.2018 - 15:13
fonte
-1

Qual è la funzione di un setter? Per impostare un valore, correggere? Quindi la cosa più semplice che possa funzionare è questa:

function setValue(string $value)
{
    $this->value = $value
}

Se è un errore per $value essere nullo, allora fai semplicemente un controllo nullo:

function setValue(string $value)
{
    if ($value == null)
    {
        // throw error
    }

    $this->value = $value;
}

Qualcosa di più è inutilmente complicato. Devi decidere, in base al lavoro di progettazione che hai svolto, se null è un valore accettabile. Se non lo è, controllalo. Devi anche decidere, in base al tuo progetto, che tipo $value è, e accetta solo quel tipo. Se necessario, puoi fornire funzioni di conversione per comodità.

Questo è ciò che è noto come Single Responsibility Principle (SRP). Poiché il controllo null (se necessario) è incluso nel setter, non è necessario duplicare quella logica su tutto il codice. (questa è una brutta cosa).

    
risposta data 09.07.2018 - 15:14
fonte

Leggi altre domande sui tag