Avatar billede lasserasch Juniormester
19. april 2008 - 17:20 Der er 6 kommentarer og
1 løsning

Korrekt klasse designet kode

Hejsa.

Jeg er lidt i tvivl om hvad der er den mest hensigtsmæssige fremgangmåde for et stykke kode.

Min kode virker uanset hvad, men performance vs. fleksibilitet ville jeg gerne høre jeres mening om.

F.eks. :


public static class customers
{
public class customer
{
  private int _id;
  private string _lastname;

  public int id
  {
  get
  {
    return _id;
  }
  set
  {
    _id = value;
  }
  }
public string lastname
  {
  get
  {
    return _lastname;
  }
  set
  {
    _lastname = value;
  }

}
public static customer GetById(int Id)
{

customer result = new customer();
SqlDataReader Sqdr = ....

  while (Sqdr.Read())
  {
    result.id = Convert.Toint32(Sqdr["id"]);
    result.lastname = Sqdr["lastname"].ToString();
  }
  Sqdr.close();
}

public static HashTable GetAllCustomers
{
  get
  {
  HashTable result = new HashTable();
  SqlDataReader Sqdr = ....
  while (Sqdr.read())
  {
    customer c = customers.getbyid(Convert.toint32(Sqdr["id"]));
    result.add(key, c);
  }
  Sqdr.Close();
  return result;
  }
}


Overstående er selvfølgelig strippet vildt meget, men det giver jer nok en ide om hvordan min kode ser ud.

Det som jeg er i tvivl om er når jeg laver min liste over f.eks. alle mine kunder (hashtable).

Her selecter jeg kun id feltet fra Sql databasen lige nu, og lader så metoden, som retunerer en customer lave sin egen forespørgelse ned i sql databasen hvor den selecter alt relevant for at generere kunde objektet.

Men jeg er i tvivl omkring om det er performance mæssigt hurtigere at selecte alle informationerne omkring kunden direkte i den metode, som generer hashtabellen for at spare et sql kald.

Det som jeg bare synes er træls ved at gøre det, er at hvis jeg laver om på database strukturen, så skal jeg også rette i 2 metoder, i stedet for at kunne nøjes med kun at rette i GetById metoden.

Min database er ikke så stor endnu, men når den engang kommer til at indeholder f.eks. 20.000 kunder, så er det 20.000 SQL kald jeg sparer for at hente en hashtable over alle kunder ved at skrive lidt ekstra kode.

Hvad ville i gøre? Ville i skrive kode som skal rettes flere steder eller ville i vægte performance højere? Og hvor stor er forskellen reelt? Er det ½ sek vi snakker om ved 20.000 kunder eller er det 10 sek forskel?
Avatar billede arne_v Ekspert
19. april 2008 - 17:58 #1
Vigtigt for performance:

GetAllCustomers skal ikke kalde GetById - den har allerede en reader hvor den kan
hente alle data
Avatar billede arne_v Ekspert
19. april 2008 - 18:01 #2
Mindre vigtigt:

1) GetById bør nok bruge en if fremfor en while

2) traditionelt vil man nok bruge ArrayList fremfor Hashtable til GetAllCustomers
  (og hvis .NET 2.0 så List<Customer> fremfor Dictionary<Customer> !)

3) jeg vill have Customer klassen som en separat top level klasse
Avatar billede lasserasch Juniormester
19. april 2008 - 18:38 #3
Okay.

Hvordan if?
Kan du give et eksempel?

Tak for input, var jo som jeg nok forventede... :-)
Smid svar for points.

/Lasse
Avatar billede arne_v Ekspert
19. april 2008 - 18:51 #4
while (Sqdr.Read())
  {
    result.id = Convert.Toint32(Sqdr["id"]);
    result.lastname = Sqdr["lastname"].ToString();
  }

->

  if (Sqdr.Read())
  {
    result.id = Convert.Toint32(Sqdr["id"]);
    result.lastname = Sqdr["lastname"].ToString();
  }

possible:

  if (Sqdr.Read())
  {
    result.id = Convert.Toint32(Sqdr["id"]);
    result.lastname = Sqdr["lastname"].ToString();
  }
  else
  {
    // do something here like throw an exception
  }
Avatar billede arne_v Ekspert
19. april 2008 - 18:52 #5
result.id = Convert.Toint32(Sqdr["id"]);
    result.lastname = Sqdr["lastname"].ToString();

ville jeg nok iøvrigt lave som:

    result.id = (int)Sqdr["id"];
    result.lastname = (string)Sqdr["lastname"];

for at være lidt mere type sikker.
Avatar billede arne_v Ekspert
19. april 2008 - 18:53 #6
og et svar
Avatar billede lasserasch Juniormester
19. april 2008 - 20:59 #7
Super. Gav mig også lidt et par fif omkring noget andet i koden og min generelle udviklingsstil. :-) Takker
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