Dovremmo usare le clausole di guardia in un metodo usando le proprietà auto validate di un oggetto?

0

Diciamo che ho una classe come questa:

public class MyClass
{
    public string A { get; }
    public string B { get; }
    public string C { get; }

    public MyClass(string a, string b, string c)
    {
        this.A = a ?? throw new ArgumentNullException(nameof(a));
        this.B = b ?? throw new ArgumentNullException(nameof(b));
        this.C = c ?? throw new ArgumentNullException(nameof(c));
    }
}

e alcuni metodi da qualche parte usando un'istanza di esso:

public void DoMagic(MyClass myClass)
{
    if(myClass == null) throw new ArgumentNullException(nameof(myClass));

    // do stuff using myClass.A, myClass.B, myClass.C
}

A questo punto, sappiamo per certo che nel corpo del metodo, né myClass né alcuna delle sue proprietà possono essere nulli, e quindi possiamo usarli in modo sicuro.

Ma questo si interromperà se in qualsiasi momento la specifica per la classe cambia e all'improvviso una sua proprietà diventa facoltativa.

Che cosa si deve fare in questo caso? Devo fare affidamento sulle proprietà che vengono convalidate all'interno della classe, o dovrei mettere le clausole di protezione per A, B e C in tutti i metodi inide che le usano? Questo non gonfiarebbe troppo il codice?

Esiste una strategia generale raccomandata in questo caso? O più a seconda di alcune variazioni di contesto?

    
posta xlecoustillier 23.03.2018 - 09:12
fonte

1 risposta

1

Perché una proprietà diventare facoltativa rompe questo approccio? Se è facoltativo, è ragionevole presumere che avrà un valore predefinito e quindi non sarà ancora null , ad esempio:

public class MyClass
{
    public const string DefaultC = "";

    public string A { get; }
    public string B { get; }
    public string C { get; } = DefaultC;

    public MyClass(string a, string b, string c = DefaultC)
    {
        A = a ?? throw new ArgumentNullException(nameof(a));
        B = b ?? throw new ArgumentNullException(nameof(b));
        if (c != null) C = c;
        // or if you still want to throw on a null c, stay with,
        // C = c ?? throw new ArgumentNullException(nameof(c)); 
    }
}

Quindi può ancora essere utilizzato in modo sicuro.

    
risposta data 23.03.2018 - 09:22
fonte

Leggi altre domande sui tag