Avatar billede treogtyve Nybegynder
20. juli 2007 - 10:41 Der er 9 kommentarer

Best Practices Properties vs Constructor

Jeg er i tvivl om hvad der er best practices af de følgende 2 eksempler, og hvorfor:

Eks. 1.

List<User> userList = new List<User>();
while (reader.Read())
{
    User user = new User();

    user.UserID = (int)reader["UserID"];
    user.UserName = (string)reader["UserName"];
    user.FirstName = (string)reader["FirstName"];
    user.LastName = (string)reader["LastName"];

    userList.Add(user);
}


Eks. 2.

List<User> userList = new List<User>();
while (reader.Read())
{
    User user = new User(
        (int)reader["UserID"],
        (string)reader["UserName"],
        (string)reader["FirstName"],
        (string)reader["LastName"]
        );

    userList.Add(user);
}
Avatar billede erikjacobsen Ekspert
20. juli 2007 - 11:20 #1
Jeg bruger gerne eks 1, men jeg har også typisk mange properties, og nogle, der skal "regnes på" mellem DB og objekt.

Men man skal have parametre med i constructoren i eet tilfælde, nemlig hvor der kun er en get-metode til en property. Det kan fx være et id, man ikke må kunne ændre i objektet.
Avatar billede treogtyve Nybegynder
20. juli 2007 - 12:14 #2
List<User> userList = new List<User>();
Vil det sige at hvis UserID eks. ikke må ændres ville du gøre det på følgende måde?

while (reader.Read())
{
    User user = new User(
        (int)reader["UserID"]
        );

    user.UserName = (string)reader["UserName"];
    user.FirstName = (string)reader["FirstName"];
    user.LastName = (string)reader["LastName"];

    userList.Add(user);
}

Og hvad hvis der er flere værdier der ikke må ændres?
Avatar billede treogtyve Nybegynder
20. juli 2007 - 12:15 #3
Ups:

Vil det sige at hvis UserID eks. ikke må ændres ville du gøre det på følgende måde?

List<User> userList = new List<User>();
while (reader.Read())
{
    User user = new User(
        (int)reader["UserID"]
        );

    user.UserName = (string)reader["UserName"];
    user.FirstName = (string)reader["FirstName"];
    user.LastName = (string)reader["LastName"];

    userList.Add(user);
}

Og hvad hvis der er flere værdier der ikke må ændres?
Avatar billede erikjacobsen Ekspert
20. juli 2007 - 12:20 #4
Ja, det ville være sådan jeg ville gøre. Der er så ingen Set-metode til UserID-property.

Det er vel mest normalt netop med een, men er der flere af samme slags, der ikke må ændres undervejs, så skal der flere parametre på constructoren.

Man kan sige at men nemt kommer til at "glemme" en tilordning til en property på eks-1-måden, som man ikke ville på eks-2-måden, hvor det vil være en syntaksfejl at glemme en parameter.
Avatar billede bitmatic Nybegynder
20. juli 2007 - 13:46 #5
Jeg ville nok også primært bruge metode 2.

1. Fordi man får et compile-time check på om man husker at sætte alle properties.
2. Fordi man ikke kører redundant kode i den tomme konstructor.
3. Fordi det håndterer eventuelle read-only parametre.
Avatar billede erikjacobsen Ekspert
20. juli 2007 - 13:51 #6
"1." Til gengæld skal man huske rækkefølgen i kaldet af constructoren ;) Man får ingen fejl her, hvis man bytter om på UserName og FirstName.  Compiletime tjek er selvfølgelig ok, alt andet lige, men det får jo ikke programmet til at være korrekt - der skal man have en passende automatisk test, unittest af en slags, og så vil fejl i både metode 1 og 2 opdages.
Avatar billede treogtyve Nybegynder
20. juli 2007 - 21:04 #7
Hej I må gerne smide nogle svar, men jeg vil stadigvæk også gerne høre om der er andre der har nogle kommentar/svar
Avatar billede erikjacobsen Ekspert
20. juli 2007 - 21:22 #8
Jeg samler ikke på point, tak.
Avatar billede arne_v Ekspert
20. juli 2007 - 22:37 #9
Jeg laver rent rutinemæssigt altid:
  - en constructor som sætter alle værdier fra ragument listen
  - en constructor uden argumenter som kalder den første constructor med nogle default værdier
  - settere

Så kan brugeren af klassen selv vælge om de vil det ene eller det andet.

Hvis jeg selv skal oprette en instans vil jeg vælge metode #2 hvis antal argumenter
er tilpas lille til at man kan overskue argument listen. Det er så de fleste
tilfælde. Ellers vil jeg falde tilbage på metode #1.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester