Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#37

AW: Übungsprogramm "Kinokarten"

  Alt 19. Dez 2016, 17:49
Bin so frei und meckere ein bisserl rum

Dashier gefällt mir nicht:
Delphi-Quellcode:
procedure TKinokarten.BerechnePreisR1; //Preis R1 berechnen
begin
    if Form1.ckbxR1.Checked then PreisR[1]:=Karten[1] * Rang1erm
          else if not Form1.ckbxR1.checked then
       PreisR[1]:= Karten[1] * Rang1;
end;
Hier ist es zwingend erforderlich, dass die Klasse TKinokarten irgendwie in einem Form1 liegt. Nutzt jemand sie in 'nem Formular fmKino, hat er ein unlösbares Problem.

Lieber sowas in der Art:
Delphi-Quellcode:
procedure TKinokarten.BerechnePreisR1(aErmaessigt : Boolean); //Preis R1 berechnen
begin
  case aErmaessigt of
    true : PreisR[1] := Karten[1] * Rang1erm;
    false : PreisR[1] := Karten[1] * Rang1;
  end;
end;
Oder auch sowas:
Delphi-Quellcode:
procedure TKinokarten.BerechnePreisR1(aErmaessigt : Boolean); //Preis R1 berechnen
begin
  PreisR[1] := IfThen(aErmaessigt,Karten[1] * Rang1erm,Karten[1] * Rang1);
end;
Der Aufruf im Programm sähe dann so aus: Kinokarten.BerechnePreisR1(ckbxR1.checked);

Alles, was zur Klasse TKinokarten gehört, würd' ich in eine Unit Kinokarten auslagern und die dann in die Uses-Anweisung aufnehmen. Dann fallen so unglückliche Zugriffe auf Form1 innerhalb der Klasse sofort auf und man merkt, dass man hier eine ungünstige Konstruktion gewählt hat.

Dashier finde ich schön:

showMessage(format('Es wurden %d Karten im %d. Rang für '+inttostr(Rang1)+' Euro bzw. für ermäßigt '+inttostr(Rang1erm)+' Euro verkauft!',[20,1]));

Ein bisserl Format und ein bisserl auch nicht. Lieber sowas:

showMessage(format('Es wurden %d Karten im %d. Rang für %d Euro bzw. für ermäßigt %d Euro verkauft!',[20,1,Rang1,Rang1erm]));

Wobei: Für die 20 und die 1 (und alle ähnlichen Werte irgendwo im Quelltext) würd' ich zu den bereits vorhandenen Konstanten noch ein paar entsprechende dazu packen.
Wenn denn dann mal was geändert werden muss, dann hat man das alles an einer Stelle. Später könnte man dann noch überlegen, ob man die Werte der Konstanten nicht in der Prozedure Init aus 'ner Ini-Datei (oder Ähnlichem) liest. Dann kann man die Preise und das Platzangebot ändern, ohne das Programm ändern zu müssen.
Dazu gönnt man dann der Klasse entsprechende Attribute, statt auf globale Konstanten zuzugreifen.
  Mit Zitat antworten Zitat