Metodo per aggiornare un tipo di riferimento - restituire un oggetto o usare void

0

Che cosa preferisci e perché?

void PrepMyInstantiatedObject(SomeComplexDTO someComplexDto){
      someComplexDto.Name = SomeOtherClassHelper.DerivedName(someComplexDto.Name);
      someComplexDto.Ids = SomeOtherClassHelper.Resolve(someComplexDto.RelatedIds); 
      someComplexDto.SingleId = SomeOtherClassHelper.FindId(someComplexDto.Name);
}

o

SomeComplexDTO PrepMyInstantiatedObject(SomeComplexDTO someComplexDto){
      someComplexDto.Name = SomeOtherClassHelper.DerivedName(someComplexDto.Name); 
      someComplexDto.Ids = SomeOtherClassHelper.Resolve(someComplexDto.RelatedIds); 
      someComplexDto.SingleId = SomeOtherClassHelper.FindId(someComplexDto.Name);

      return someComplexDto;
}

Anche se restituire l'oggetto non è necessario (2 ° metodo) - qualcuno mi stava dicendo che era più facile capire come usare il metodo PrepMyInstantiatedObject . Nel frattempo ho pensato che il nome fosse sufficiente per trasmettere il suo scopo.

public class SomeComplexDTO
{
    public string Name {get; set;}
    public IEnumerable<int> Ids {get; set;}
    public IEnumerable<int> RelatedIds {get; set;}
    public int SingleId {get; set;}
}

Si potrebbe sostenere che questo DTO dovrebbe avere la logica per prepararsi, tuttavia il mio team non vuole aumentare questa classe con la logica.

    
posta S1r-Lanzelot 25.05.2018 - 15:52
fonte

2 risposte

4

Nessuno dei due. Ma le ragioni sono complesse

In primo luogo, se provieni da una prospettiva OOP, il metodo dovrebbe essere sull'oggetto

SomeComplexDTO.Prep();

In secondo luogo, anche le funzioni con effetti collaterali sono disapprovate. quindi da questo angolo dovresti avere

SomeComplexDTO  PrepMyInstantiatedObject();

o

void PrepMyInstantiatedObject(out SomeComplexDTO someComplexDto)

In terzo luogo abbiamo la filosofia "immutables are good", che suggerirebbe

SomeComplexDTO PrepMyInstantiatedObject(SomeComplexDTO someComplexDto)
{
    return new SomeComplexDTO(
        SomeOtherClassHelper.DerivedName(someComplexDto.Name),
        SomeOtherClassHelper.Resolve(someComplexDto.RelatedIds),
        SomeOtherClassHelper.FindId(someComplexDto.Name)
        );
}

Penso che il mio "odore del codice" principale con entrambi i metodi sia che implicano che l'oggetto che stai trasmettendo sia "costruito a metà" e in uno stato non valido.

Ora non sono io a insistere sul fatto che gli oggetti non dovrebbero mai trovarsi in uno stato non valido, ma qui sembra che tu stia progettando che sia normale.

Rifatta il codice in modo da avere una singola funzione di configurazione e non avrai bisogno di passare un oggetto nei tuoi metodi di configurazione, che rimuoverà la maggior parte delle obiezioni.

SomeComplexDTO GetObject(string name, string[] relatedIds, string id)
{
    return new SomeComplexDTO(
        name,
        relatedIds,
        id
        );
}
    
risposta data 25.05.2018 - 16:09
fonte
2

Se sei in dubbio, usa sempre la soluzione più semplice. Il più semplice qui è il primo esempio, che non restituisce un valore superfluo. Per la seconda opzione, gli utenti che guardano il sito di chiamata si chiederebbero se l'oggetto restituito è lo stesso dell'oggetto di input o quale sia la differenza.

Resta semplice.

    
risposta data 25.05.2018 - 16:09
fonte

Leggi altre domande sui tag