Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: TObjectlist in TObjectList

  Alt 2. Jul 2006, 08:58
Ok,
sorry wenn ich das jetzt mal so sage, aber an deinem Code solltest du noch etwas arbeiten. Ich weiß nicht wie groß das Grafikprogramm ist oder werden soll, aber gerade bei etwas größeren Projekten zahlen sich ein paar Dinge aus. Es gibt nette (kleine) Bücher dazu, die haben so ein paar Grundregeln über guten Codestil drin. Gibt sicherlich auch online etwas..
Die sollte man (imho) berücksichtigen. Also mir hat das echt eine Menge gebracht (nicht falsch verstehen, ist wirklich als Tipp gemeint und hilft häufig Fehler zu vermeiden, Code lesbarer zu machen und auch wartbar und ist gerade bei der Arbeit von mehreren am selben Programm unabdingbar).

Kurz dazu dann ein paar Worte:
  • Variablennamen sollten immer selbst erklären sein (was obj ist weiß doch keiner der es liest)
  • Methodennamen auch (s. BitBnt1.Click, gibt dem Button lieber einen Namen)
  • With solltest du ruhig weglassen. Ist zwar praktisch, führt aber nicht gerade zu leicher lesbarem Code

Ist wirklich nicht so schlimm wie es jetzt vielleicht klingt, aber diese Kleinigkeiten machen Code schnell unübersichtlicher als er sein muss.
Kommen wir zu deinem eigentlichen Problem:


Zitat von mimi:
Delphi-Quellcode:
  if Obj.Count > 0 then
  begin
    for i := 0 to Obj.Count - 1 do
    begin
      if assigned(TFigure(obj.Items[i]).Style.obj1) then
      begin
        // Prüfen ob überhaupt was in der Liste steht!
        if TFigure(obj.Items[i]).Style.obj1.Count > 0 then
        begin
          // Zählvariablen sollten einheitlich mit i, j, k, ... benannt werden
          for x := 0 to TFigure(obj.Items[i]).Style.obj1.Count - 1 do
          begin
          
            // prüfen ob an der Stelle überhaupt etwas steht
            if assigned(TFigure(Obj[i]).Style.obj1.Items[x]) then
            begin
              TFigure(TFigure(Obj[i]).Style.obj1.Items[x]).draw(bmp);
            end; // if assigned(TFigure(Obj[i]).Style.obj1.Items[x])
          end; // for x := 0 to TFigure(obj.Items[i]).Style.obj1.Count - 1
        end; // if TFigure(obj.Items[i]).Style.obj1.Count > 0
    end; // for i := 0 to Obj.Count - 1
  end; // if Obj.Count > 0
Ist trotz allem nicht gerade der schönste Code. Besser ist es, wenn du wirklich getrennte Container und normale Objekte hast. Dann kannst du wirklich das Bewegen automatisieren und hast nicht mehr diese doppelten Casts wie hier. An sich solltest du immer schauen, ob eine Liste zugewiesen ist (assigned(deinObjekt)) und ob sie auch mindestens 1 Element enthält (deinObjekt.Count > 0). Bevor du castest kannst du natürlich auch schauen ob das Element überhaupt vom richtigen Typ ist (deinObjekt is TDeineKlasse). Natürlich musst du das immer nur dann machen, wenn es nicht sichergestellt wird. Hast du also eine Methode, die öffentlich ist oder irgendwie Argumente von "aussen" bekommt, so solltest du solche Tests immer einbauen. Alles was von "aussen" (ausserhalb deiner Klasse) kommt, kann alles beinhalten. Arbeitest du nur mit selbst in der Klasse Erzeugtem, kannst du hier natürlich gewisse Bedingungen garantieren. Damit kannst du dann Prüfungen wegfallen lassen (musst es aber nicht).
Vorteile liegen dann wirklich darin, dass du diese Klassen (die immer die Eingabe prüfen) auch woanders weiter verwenden kannst.
  Mit Zitat antworten Zitat