Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Record im Array nutzen? - Sinnvollere Wege?

  Alt 10. Jul 2015, 18:39
Also zunächst mal ist zu sagen, dass es in Delphi seit Version 4 bereits dynamische Arrays gibt. Es gibt also keinen Grund, eine Maximalgröße wie „1000“ fest vorzugeben. Feste Größen sind schlecht, weil sie erstens beliebig sind (warum gerade 1000? Was ist, wenn es 1001 Mitarbeiter gibt?) und zweitens, weil sie Platz verschwenden. Schreibe statt Employees: array[1..1000] of TEmployee also besser Employees: array of TEmployee . Die Größe kannst du mit SetLength zur Laufzeit verändern.

Da es aber mühsam ist, jedes mal beim Hinzufügen eines Elements (vom Löschen fangen wir gar nicht erst an) folgendes zu schreiben
Delphi-Quellcode:
SetLength(Employees, length(Employees)+1);
Employees[length(Employees)-1] := NewEmployee;
verwendet man besser eine TObjectList oder TList.

Das mit der festen Höchstlänge gilt auch für Strings. Wenn es nicht wirklich einen guten Grund gibt, dann sollte man nicht String[100] schreiben, sondern einfach String .

Als Grundproblem sehe ich bei dir die aber die mangelnde Modellierung an.

Zunächst mal solltest du die Geschäftslogik strikt von der Darstellung trennen. Du solltest also Termine, Uhrzeiten etc. z.B. intern niemals als String speichern. Statt einen einzelnen Termin ("15:00-17:30") als String zu repräsentieren, der immer wieder geparst werden muss, bastel dir einen speziellen Typen, der genau die Information abbildet:
Delphi-Quellcode:
TAppointment = record
  StartTime: TTime;
  EndTime: TTime;
end;
[...]

Availability : Array[1..7] of TAppointment;
Dann der nächste Punkt: Array[1..7] . Zunächst mal fangen Arrays normalerweise bei 0 an und nicht bei 1. Davon abzuweichen führt eher zu Verwirrungen und Fehlern. Noch wichtiger: Die Zahlen sagen mir nichts über die Bedeutung. Ich kann nur mutmaßen, dass es sich hier um Wochentage handelt. Aber dann ist immer noch die Frage, welche Zahl welchem Tag entspricht. Entspricht die 1 z.B. dem Montag oder dem Sonntag?

Besser wäre:

Delphi-Quellcode:
TWeekday = (wdMonday, wdTuesday, wdWednesday, wdThursday, wdFriday, wdSaturday, wdSunday);

Availability: Array[TWeekday] of TAppointment;
Das sieht schon besser aus.

Allerdings ist diese Modellierung jetzt natürlich immer noch darauf eingeschränkt, dass es pro Wochentag nur einen Termin gibt. Da kann ich jetzt ohne nähere Informationen zu deinem Anwendungsfall nicht sagen, ob das zu deinem Anwendungsfall passt oder nicht.

Aber selbst dann wäre es eventuell besser, einfach eine flache Liste von Terminen zu speichern, die nicht nach Wochentagen gruppiert ist:

Delphi-Quellcode:
TAppointment = record
  StartTime: TDateTime; // Beachte: Nun DateTime
  EndTime: TDateTime;
end;

[...]

Availability: array of TAppointment;
// οder bei neueren Delphis
Availability: TList<TAppointment>;
So ist man, falls sich die Anforderungen später doch mal ändern, flexibler mit der Art von Terminen, die möglich sind. Man könnte z.B. mehrere Termine an einem Tag haben. Durch hinzufügen eines zusätzlichen Feldes zu TAppointment könnte man sogar unterscheiden zwischen einmaligen Terminen und solchen, die sich jede Woche wiederholen.
  Mit Zitat antworten Zitat