Restituisce il tipo di riferimento passato al metodo

0

Lo sto chiedendo dal punto di vista .NET (C #), tuttavia preferirei una risposta agnostica della lingua.

È meglio restituire il tipo di riferimento quando qualche valore è cambiato nel metodo o no? Sono principalmente preoccupato per la leggibilità, ma mi piacerebbe qui altri professionisti e amp; contro se ce ne sono.

Ad esempio, abbiamo la seguente struttura

struct PersonInformation
{
    internal string name;
    internal int year;
}

Esempio 1:

private void Caller()
{
    var person = new PersonInformation;
    person = GetPersonInfo(person);
}

private PersonalInformation GetPersonInfo(PersonalInformation person)
{
     person.name = "Mike";
     person.year = 19;
     return person;
}

Esempio 2:

private void Caller()
{
    var person = new PersonInformation;
    GetPersonName(person);
}

private void GetPersonInfo(PersonalInformation person)
{
        person.name = "Mike";
        person.year = 19;

}
    
posta StupidOne 23.02.2015 - 19:46
fonte

3 risposte

2

Is it better to return the reference type when some value is changed in method or not?

Per espandere il commento di Doval, è meglio lontano non causare affatto effetti collaterali. Gli effetti collaterali rendono il tuo codice più difficile da ragionare. Rendono il tuo codice più difficile da riutilizzare. Rendono il tuo codice più difficile da testare. Rendono modo più difficile da usare contemporaneamente.

Questi esempi hanno i loro problemi. Se la tua funzione è denominata GetPersonInfo perché non restituisce nulla, intendo ottenere qualcosa, devi necessariamente restituirla. Per l'altra firma, perché stai chiamando GetPersonInfo quando hai già una persona info ? Entrambe queste firme sono rari in C # (e in altre lingue) perché non seguono il principio della sorpresa minima. I programmatori non possono semplicemente guardare la firma e ragionevolmente indovinare cosa sta succedendo. Ciò porta alla lentezza del codice di scrittura e porta a bug.

No, un'opzione migliore sarebbe quella di passare in alcuni dati per trovare la persona che desideri e restituire (un'ideale immutabile) istanza di informazioni sulla persona.

    
risposta data 23.02.2015 - 20:54
fonte
1

Generalmente preferisco seguire il principio di separazione delle query di comando . Il principio afferma che se modifichi le informazioni è un comando , quindi non restituisce nulla.

Se la chiamata al metodo è una Query , in pratica recupera le informazioni e dovrebbe restituire il tipo corretto.

Se stai recuperando le informazioni della persona, il nome getPersonInfo () è ok, ma forse dovresti passare i dettagli di quale persona stai ricevendo. Ad esempio

db.getPersonInfoByName("Mike");

Seguendo il CQS, la firma di getPersonInfoByname dovrebbe restituire PersonInformation .

Nel caso in cui desideri cambiare l'età della persona, avresti un metodo che restituisce nulla perché cambia le informazioni.

void setBirthDate(date birthDate)

TL; DR

Is it better to return the reference type when some value is changed in method or not?

Quando si cambiano i valori, non si deve restituire alcun tipo di riferimento in base al principio di separazione della query di comando. Se una funzione ha effetti collaterali, return void.

Ciò consente a un programmatore di riconoscere immediatamente quali funzioni contengono effetti collaterali e quali no.

    
risposta data 23.02.2015 - 20:12
fonte
1

Penso che avere un metodo void (mutatore) che inizia con "Get" sia un odore di codice da solo. I nomi dei metodi devono essere chiari, descrittivi e affidabili. Il tuo primo esempio è migliore del secondo, tuttavia non lo definirei un buon metodo.

    
risposta data 23.02.2015 - 21:52
fonte

Leggi altre domande sui tag