Einzelnen Beitrag anzeigen

Dejan Vu
(Gast)

n/a Beiträge
 
#27

AW: Logische Operatoren als Aufzählungstyp

  Alt 18. Dez 2014, 18:59
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.
  Mit Zitat antworten Zitat