Esiste una linea guida comune per l'invio di un intero oggetto come argomento rispetto all'invio di proprietà rilevanti?

0

Diciamo che ho una classe Person :

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string IdCard { get; set; }
    public string Phone { get; set; }
    public string Address { get; set; }
    public string Email { get; set; }
    public string Credit { get; set; }
    public Bank Bank { get; set; }
    public Job Job { get; set; }
    // etc.
}

Quando sono istanziati, le proprietà ottengono i loro valori da un database.

Un'altra classe sta visualizzando un Person . Tuttavia, visualizza solo alcune delle proprietà disponibili. Cosa dovrebbe ottenere come argomenti?

class Program
{
    void ShowPerson(string firstName, string LastName, string phone)
    {
        Console.WriteLine(firstName);
        Console.WriteLine(lastName);
        Console.WriteLine(phone);
    }
}

o

class Program
{
    void ShowPerson(Person person)
    {
        Console.WriteLine(person.FirstName);
        Console.WriteLine(person.LastName);
        Console.WriteLine(person.Phone);
    }
}

Il vantaggio di inviare solo proprietà rilevanti è l'efficienza della memoria e SQL più preciso. Il vantaggio di inviare un'intera istanza è un codice molto più pulito e potenzialmente più semplice da modificare.

Quindi, quale dovrei usare? Grazie.

Nota:

  1. Questa domanda riguarda gli oggetti dati in particolare. La mia domanda è più generale e riguarda qualsiasi tipo di oggetto. Non sono uguali.
  2. Non sto chiedendo opinioni. Mi sto chiedendo se esiste una linea guida, un approccio o uno schema molto ben definito per affrontare questa situazione.
posta Sipo 23.04.2017 - 18:29
fonte

2 risposte

3

Se l'efficienza della memoria è la tua preoccupazione, la seconda opzione è migliore. La maggior parte delle lingue OOP passa per riferimento, quindi non passa 3 stringhe rispetto a passare 7 stringhe, 2 oggetti di dimensioni sconosciute e altri campi sconosciuti passa 3 riferimenti a stringhe rispetto al passaggio di un riferimento a un oggetto. E i riferimenti sono sempre della stessa dimensione. A meno che la tua lingua non usi grossi puntatori per le stringhe, il che rende la prima opzione ancora più pesante ...

Anche le lingue che non passano per riferimento come predefinito, come C ++, di solito hanno una sintassi speciale per il passaggio per riferimento, che dovresti usare.

Ma questa è l'ottimizzazione e ti preoccupi del principio. Credo che il principio rilevante è singola fonte di verità (molto vicino al DRY ). SSoT non riguarda solo i dati, ma riguarda anche il codice. Quando definisci un comportamento, dovresti cercare di avere tutte le definizioni di quel comportamento in un unico posto. E la seconda opzione lo fa meglio.

Il comportamento qui sta stampando le informazioni di una persona. Hai una funzione ShowPerson , che dovrebbe essere la SSoT per quel comportamento. (Oppure, come raccomandato da Ewan, Person.Show dovrebbe essere quello SSoT). Ma nella prima opzione si perde parte di quella definizione di comportamento al chiamante:

  • Il fatto che stampa 3 campi. Nella seconda opzione solo il chiamato deve sapere che - nel primo
  • L'identità di questi 3 campi. Nella prima opzione, viene deciso fuori ShowPerson . I nomi degli argomenti non stanno decidendo i campi: sono solo una raccomandazione.
    • BTW - questo può causare bug, se chiami ShowPerson con i campi sbagliati, o con i campi nell'ordine sbagliato. Questo è esattamente il tipo di errore che SSoT aspira a prevenire.
  • Il fatto che Person abbia questi campi! Il fatto che il chiamante abbia bisogno di conoscerli è un vero problema se si desidera utilizzare modelli o riflessioni ...
risposta data 23.04.2017 - 19:18
fonte
3

1: Il design OO sarebbe Person.Show ()

2: Il problema con la tua prima funzione è in realtà solo la denominazione. non ha più relazione con la Persona.

Ma allora come si chiama? ThreeStringWriterToConsole? il vantaggio di ShowPerson (Person p) è la sua indeterminatezza. È possibile aggiungere il secondo nome più tardi o passare dalla console a un file o un'immagine e non cambia nulla.

    
risposta data 23.04.2017 - 18:48
fonte

Leggi altre domande sui tag