Una classe immutabile può avere un costruttore di argomenti zero?

4

Vedi il codice qui sotto:

public List<DenominationDTO> CalculateChange(
        decimal cost, 
        decimal paymentReceived, 
        string currencySymbol)
{
    var currency = CurrencyFactory.Create(currencySymbol);
    var denomination = DenominationFactory.Create(0,0);
    DenominationsCalculator = DenominationsCalculatorFactory.Create(
        currency, 
        denomination, 
        cost, 
        paymentReceived);
    return Mapper.Map<List<DenominationDTO>>(
        DenominationsCalculator.GetDenominations().ToList());
}

DenominationFactory è usato per creare un'istanza di una classe di valore immutabile. Le classi immutabili non dovrebbero avere un costruttore di argomenti zero basato su ciò che ho letto. Se potessero avere un costruttore con valore singolo, potrei semplicemente iniettare la classe creata da DenominationFactory nel costruttore della classe che contiene CalculateChange.

Una classe immutabile può avere un costruttore di argomenti zero? Secondo questo link non dovrebbe: link

Sto parlando rigorosamente da una prospettiva di buone pratiche usando DDD e un modello di dominio ricco.

    
posta w0051977 14.06.2017 - 15:15
fonte

4 risposte

5

L' articolo a cui fai il link non dice "non dovresti avere un costruttore di argomenti zero "dice" fornire parametri tramite costruttore. "

Un costruttore con argomento zero indica alcune possibilità:

  1. La classe non ha dipendenze
    1. Potrebbe avere solo metodi stateless
    2. Potrebbe essere solo un nome. Ho visto questo lavoro con eccezioni.
  2. La classe ha valori predefiniti
    1. Potrebbe esserci un altro costruttore che consente di ignorare quei valori predefiniti
    2. Come le enumerazioni, potrebbero esserci altre classi che implementano la stessa interfaccia con valori predefiniti diversi
    3. I valori predefiniti sono semplicemente codificati e sei bloccato con loro

È 2.3 che causa i veri problemi. Tutti questi possono essere immutabili.

    
risposta data 14.06.2017 - 15:42
fonte
2

Sì.

Specialmente in linguaggi come Java o C #, le implementazioni della strategia, ad esempio, possono avere costruttori nullarici perché la carne della loro implementazione è una funzione che soddisfa un'interfaccia. Anche le lingue senza supporto enum tendono a farlo per emulare enumerazioni.

È forse discutibile se le classi senza valori debbano essere considerate immutabili, o se è buona DDD. Direi che lo è, dal momento che stai seguendo gli obiettivi di progettazione e ottieni i benefici dell'immutabilità mentre hai un costruttore vuoto.

    
risposta data 14.06.2017 - 15:37
fonte
0

Dipende da cosa intendi per "costruttore di argomenti zero" (sono consentiti o meno i costruttori di argomenti non-zero privati) e se autorizzi l'accesso a variabili globali statiche (come DateTime.UtcNow ).

Se intendi veramente nessun costruttore di argomenti zero (incluso privato) e non consentire l'accesso alle variabili globali statiche e richiedono l'immutabilità, quindi richiedo che il tuo oggetto non può contenere dati non costanti, solo comportamenti (ad esempio schemi di strategia, come menzionato da altri). Si potrebbe obiettare, tuttavia, se le istanze di quella classe possono essere chiamate "oggetti", dal momento che il loro comportamento sono solo funzioni / metodi statici che non operano sullo "stato".

Sto aggiungendo due esempi alla lista nel caso in cui uno qualsiasi degli altri due metodi sia permesso, perché penso che sia una domanda molto interessante:

  • Un oggetto timestamp che registra l'ora della sua creazione (ad esempio, accedendo ad alcuni servizi statici globali) ma è altrimenti immutabile.

  • un generatore di numeri Pseudo casuali che inizia con un seme ben definito e restituisce il numero successivo, in questo modo:

public class PRNG {
  public long Value { get; }
  public PRNG() {
    Value = 12345; // seed
  }
  private PRNG(long value) {
    Value = value;
  }
  public PRNG Next() {
    return new PRNG(PRNG_Algorithm_NextVal_For(Value));
  }
}
    
risposta data 14.06.2017 - 20:09
fonte
-3

Alcune best practice del DDD affermano che un Value object dovrebbe essere immutabile ma non specifica come dovrebbe essere implementato.

Il modo in cui viene implementato dipende molto dal linguaggio di programmazione e DDD è un linguaggio agostino.

    
risposta data 14.06.2017 - 15:27
fonte

Leggi altre domande sui tag