Ich wollte mit Klassenfabriken kommen, aber so ist das schön leichtgewichtig.
Eine Class Factory wäre vielleicht ein wenig oversized für die kleine Geschichte, aber als Übung vielleicht nett
(Kann kein Delphi mehr, daher bitte kleine Fehler entschuldigen).
Delphi-Quellcode:
Type
ILogicalArrayCompressor = interface
function Execute (array : TSomeArray);
end;
TAndArrayCompressor = class (ILogicalArrayCompressor)
public function Execute (array : TSomeArray);
end;
TOrArrayCompressor = class (ILogicalArrayCompressor)
public function Execute (array : TSomeArray);
end;
TArrayCompressorFactory = class
class function Create (logicalOperator : TLogicalOperator) : ILogicalArrayCompressor;
end;
class function TArrayCompressorFactory.Create (logicalOperator : TLogicalOperator) : ILogicalArrayCompressor;
begin
case logicalOperator of
laOr : result := TOrArrayCompressor.Create();
laAnd : result := TAndArrayCompressor.Create();
// Add new operators here
else raise ArgumentException.Create('Unknown logical Operator');
end;
End;
---
Function TUserClass.Calculate (logicalOperator : TLogicalOperator; SomeArray : TSomeArray) : Integer;
Begin
result := TArrayCompressorFactory.Create(logicalOperator).Execute(SomeArray);
End;
Hä? Eben meint der Typ doch, 'case' ist Müll, und dann klatscht er das doch rein? Ja. 'Case' ist sollte vermieden werden, außer in Klassenfabriken (da ist das legitim). Sagen andere Puristen. Wie schön, wenn sich Softwaretechniker so einig sind
Das Schöne an so einer Methode (oder der von Stevie) ist doch die: Der Anwender hat ein Array und eine Operation (egal welche) und will, das die Arrayelemente entsprechend verknüpft/verdichtet werden. Welche Operationen es gibt, ist im wurscht.
Wenn Du das so umsetzt, kannst Du die Anwenderklasse zu machen, d.h. Du musst sie nicht mehr anfassen, bloß weil eine neue logische Operation hinzugekommen ist. Das bedeutet aber auch, das Du keinen Bockmist mit der Klasse (aus Versehen!) machen kannst (weil Du sie noch nicht einmal neu kompilierst). Sie läuft, ist getestet und der Quellcode ist im Tresor. Du erweiterst trotzdem die Mächtigkeit der Klasse.
Natürlich musst Du den Code anfassen, wenn ein logischer Operator dazukommt. Aber die Änderungen sind viel simpler und bergen vor allen Dingen nicht die Gefahr, Code in der Nähe aus Versehen zu zerballern oder kaputt zu optimieren (ein beliebtes Hobby).
Also ich find das praktisch.