Gesetzt den Fall, ich habe mehrere Listen mit verschiedenen Objekten.
- Personenliste
- Adressliste
- Autoliste
Die Objekte verwalten dann u.a. ggf. Instanzen auf andere Objekte.
Z.B. unterhält eine Person eine Liste von Autos (real eine Liste von Id´s, die dann zur Laufzeit bei Bedarf zur Objektbeschaffung (
GetAuto(Id)
) genutzt werden).
Nun möchte ich alle Listen unterschiedlich sortieren können (bzw. dies dem User ermöglichen).
Suchen und sortieren realisiere ich derzeit erst mal über BinarySearch mit einem Comparer, der sich derzeit nur auf die ID bezieht:
Delphi-Quellcode:
function TssObjectComparer.Compare(const O1, O2: TssObject): Integer;
begin
Result := CompareStr(O1.Id, O2.Id);
end;
...
procedure TssIO_Custom.RegisterObject(ssObj: TssObject);
var
Index: Integer;
begin
if not Assigned(ssObj) then
Exit;
if not ssObjectList.BinarySearch(ssObj, Index) then
ssObjectList.Insert(Index, ssObj);
end;
Wenn ich jetzt nach anderen Eigenschaften sortieren/suchen/filtern will (z.B. Person.FirstName(aufsteigend) UND Person.LastName(absteigend)) und beliebigen sonstigen Varianten, wie realisiert man das am besten?
Für jeden Sortierfall eine eigene Liste mit eigenem Comparer?
Man muss dann natürlich jeden Einfüge- und Löschvorgang für eine Objektmenge für mehrere Listen durchführen.
Ist das als zweckmäßig und sicher anzusehen? Der Speicherverbrauch ist natürlich auch höher.
Der umfangreichere Quelltext wäre nicht das Problem, da dieser durch einen Experten erzeugt wird.
Ich müsste dann in den Metadaten nur definieren, welche "Indizes" benötigt werden.
Alternativ könnte man eine Liste immer umsortieren, was allerdings bei größeren Listen dann etwas dauern kann.
Ein Problem ist z.B. auch, wenn ich alle Personen suchen will, deren Adressobjekt den Ort "Halle" beinhaltet.
Das ist wohl dann der Nachteil gegenüber einer
SQL-Abfrage.
Grundsätzlich will ich das dann so organisieren, dass alternativ zu Objektlisten ein ORM verwendet werden kann.
In dem Fall würde die Sortierung/Filterung dann über
SQL realisiert.
Für die Anwendung soll sich dann keine Änderung ergeben, egal ob die Daten in Objektlisten oder über einen ORM verwaltet werden.