Avatar billede vint Nybegynder
28. oktober 2007 - 19:35 Der er 5 kommentarer og
2 løsninger

Gode råd fundet her på eksperten

Hej.

Jeg har fundet et nogle gode råd i en gammel tråd her på eksperten, hvor der stod gode råd inden programmering.

Her er et par udplug, jeg ikke lige fanger:
- Overvej om du vil bruge interfaces
- Brug try-finally, try-except hvor du kan!
- Prøv at lave det objektorienteret fra starten. Lav nogle gode baseobjekter hvorfra man kan nedarve og udvide funktionalitet.

Kan jeg få en til at uddybe, hvad der måske menes med disse 3 ting, inden jeg begynder at kaste mig ud i et project.

vh
Vint
Avatar billede hrc Mester
29. oktober 2007 - 09:04 #2
Det lyder som noget jeg kunne have fundet på at skrive :-)

Om man skal bruge interfaces eller arbejde med "klassisk" objektorientering, kræver lidt baggrundsviden som her mest går på abstrakte klasser. Et eksempel på en abstrakt klasse er TStrings hvorfra bl.a. TStringList nedarver. Her er defineret abstrakte metoder; de er KUN defineret, ikke lavet endnu. Det er opgaven for de klasser der nedarver.

Fordelen er at man kan definere en GemIDatabase i baseklassen, som den kan bruge i andre metoder defineret i klassen. Baseklassen behøver altså ikke vide hvad der sker i metoden. Den skal bare være oprettet af klasserne der nedarver.

Eksempel: En adresseklasse skal lave en GemIDatabase funktion som gemmer adresse, postnr og kommunekode, mens en personklasse skal gemme navn og cpr-nummer.
På den kan kode der ellers skulle kopieres mellem klasserne, flyttes til baseklassen. Det er en stor fordel at man kun retter fejl ét sted.

Men - man kan godt nedarve fra en abstrakt klasse uden at programmere alle de abstrakte metoder der ligger heri. Der kommer kun en advarsel - først når man kører programmet vil det fejle.

Interfaces definerer også funktioner og - med god vilje - gør lidt det samme som abstrakte klasser. To vigtige fordele er, at alle metoderne SKAL programmeres og at man kan lave noget der ligner multipel nedarving, eksempelvis implementere et data og et liste-interface i samme klasse. Det er besværligt at gøre pænt med traditionel OOP.

----------- o -----------

Try-finally sikrer at systemet nulstiller en operation, også selvom den fejler. I nedenstående stump kode bliver cursoren sat tilbage selvom metoden fejlede.

Screen.Cursor := crHourGlass;
try
  MetodeDerFejlerMedEnException;
finally
  Screen.Cursor := crDefault;
end;

Et andet eksempel her:

StringList := TStrinList.Create;
try
  MetodeDerFejlerMedEnException;
finally
  StringList.Free;
end;

Her frigives objektet altid og du har ikke hukommelseslækager.

Med try-except sikrer du at fejl håndteres. Det mest klassiske eksempel er nok dette:

Database.BeginTrans;
try
  DatabaseOperationDerKanFejle;
  Database.CommitTrans;
except
  Database.Rollback;
  raise;
end

Hvis noget går galt blive der absolut intet skrevet i databasen. Dette sikrer konsistente data.

Endelig kan du kombinere de to:

Query := TADOQuery.Create(nil);
try
  Query.Connection.BeginTrans;
  try
    DatabaseOperationDerKanFejle;
    Query.Connection.CommitTrans;
  except
    Query.Connection.TollbackTrans;
    raise; // Send exceptionen videre i systemet
  end;
finally
  Query.Free;
end;

----------- o -----------

Hvad OOP angår så vil jeg henvise til første afsnit, men ellers kigge på Arnes links
Avatar billede hrc Mester
29. oktober 2007 - 09:08 #3
Ulemperne med Interfaces er:

1. Man kan ikke definere attributter (variable). Man kan ikke lave property Attribut : integer read fAttribut write fAttribut. Man bliver nødt til at lave SetAttribut, GetAttribut funktioner og lade implementøren oprette fAttribut.

2. Generelt synes jeg de er ret besværlige at bruge
Avatar billede vint Nybegynder
29. oktober 2007 - 10:40 #4
Hej.

@hrc
Det var faktisk dine egne råd, som jeg fandt, da jeg søgte lidt rundt på gamle spørgsmål her i gruppen. Der var flere råd i posen, men der var lige de ovenstående 3, som jeg kunne bruge lidt uddybning til.

Ud fra besvarelserne er jeg lidt ked af, at jeg ikke har lvoet flere points, da det ikke bare er en "en-linies" besvarelse, der blev givet.

@Arne v og hrc
Ud fra de 30 points, der er udlovet, synes jeg, at en fordeling 10 (arne v) / 20 (hrc) vil være mest fair
Avatar billede hrc Mester
29. oktober 2007 - 13:50 #5
Nu har jeg kun snakket om metoder der er "virtual; abstract;". Man kan sagtens have virtuelle metoder i baseklassen som derved kaldes før koden i de nedarvede klasser.

Jeg har en "procedure FillListItem(aListItem: TListItem); virtual;" der fylder en linje i et TListView. I baseklassen sættes følgende.

begin
  aListItem.SubItems.ClearM
  aListItem.Data := self;
  aListItem.ImageIndex := -1;
end;

mens jeg i den nedarvede klasse kun skal skrive:

begin
  inherited; // Kalder baseklassens metode.

  aListItem.Caption := fNavn
  aListItem.SubItems.Add(fAdresse);
  aListItem.Checked := fChecked;
end;
Avatar billede arne_v Ekspert
29. oktober 2007 - 14:25 #6
svar fra mig
Avatar billede scorpe Nybegynder
30. oktober 2007 - 20:30 #7
Hvad er de andre råd? (Link søges :P)
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

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