09.07.2015 Aufrufe

Objektorientiertes Programmieren in GAP

Objektorientiertes Programmieren in GAP

Objektorientiertes Programmieren in GAP

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

<strong>Objektorientiertes</strong><strong>Programmieren</strong> <strong>in</strong><strong>GAP</strong>Max NeunhöfferObjekte,Operationen undMethodenselektionDie IdeeTypenOperationen und MethodenKonventionenFamilienKategorien undRepräsentationenVererbungE<strong>in</strong> BeispielDie DeklarationenDie ImplementationBenutzungsbeispielWeitereBequemlichkeitenPropertiesAttribute<strong>Objektorientiertes</strong> <strong>Programmieren</strong> <strong>in</strong><strong>GAP</strong>Max NeunhöfferLehrstuhl D für MathematikRWTH AachenAachen 30.10.2006Debugg<strong>in</strong>g


<strong>Objektorientiertes</strong><strong>Programmieren</strong> <strong>in</strong><strong>GAP</strong>Max NeunhöfferObjekte,Operationen undMethodenselektionDie IdeeTypenOperationen und MethodenKonventionenFamilienKategorien undRepräsentationenDie Idee<strong>GAP</strong> Objekte repräsentieren mathematische Objekte.Es gibt „Operationen“ und „Methoden“.Eigenschaften der Objekte (ihr Typ)⇓Auswahl der „richtigen“ MethodeVererbungE<strong>in</strong> BeispielDie DeklarationenDie ImplementationBenutzungsbeispielWeitereBequemlichkeitenObjekte können während ihrer Lebenszeit „lernen“!(d.h. ihren Typ verändern)Die verwendeten Methoden ändern sich dann!PropertiesAttributeDebugg<strong>in</strong>g<strong>GAP</strong> verwendet also:dynamische Typisierung zur Laufzeitstatische Datenbank von MethodenMethodenselektion „just <strong>in</strong> time“


<strong>Objektorientiertes</strong><strong>Programmieren</strong> <strong>in</strong><strong>GAP</strong>Max NeunhöfferObjekte,Operationen undMethodenselektionDie IdeeTypenOperationen und MethodenKonventionenFamilienKategorien undRepräsentationenVererbungE<strong>in</strong> BeispielDie DeklarationenDie ImplementationBenutzungsbeispielWeitereBequemlichkeitenPropertiesOperationen und MethodenE<strong>in</strong>e Operation ist e<strong>in</strong>e Sammlung von Methoden.Man deklariertden Namen,die Anzahl der Argumente, unde<strong>in</strong>en Filter für jedes der Argumente.DeclareOperation("Size",[IsGroup]);Man <strong>in</strong>stalliert e<strong>in</strong>e oder mehrere Methoden:Das s<strong>in</strong>d Funktionen mit dieser Anzahl Argumente.Man kann weitere E<strong>in</strong>schränkungen machen:AttributeDebugg<strong>in</strong>gInstallMethod(Size,[IsGroup and IsPermGroup],function(p) ... return ...; end);Wir nennen diese E<strong>in</strong>schränkungen „Anforderungen“.


<strong>Objektorientiertes</strong><strong>Programmieren</strong> <strong>in</strong><strong>GAP</strong>Max NeunhöfferObjekte,Operationen undMethodenselektionDie IdeeTypenOperationen und MethodenKonventionenFamilienKategorien undRepräsentationenVererbungE<strong>in</strong> BeispielDie DeklarationenDie ImplementationBenutzungsbeispielWeitereBequemlichkeitenPropertiesAttributeDie MethodenselektionWenn nun jemand Size(g) für e<strong>in</strong> Objekt g aufruft,wird der Typ von g bestimmt,alle Methoden für Size angeschaut,ermittelt, welche passen (applicable methods),und diejenige aufgerufen, diepasst, undam meisten Anforderungen hat(bei gleichen Anforderungen die später <strong>in</strong>stallierte).Geht überhaupt nur effizient durch trickreiches Cach<strong>in</strong>g!Debugg<strong>in</strong>gGenauer: Jeder elementare Filter hat e<strong>in</strong>en „Rang“.Es wird die Methode genommen, für die dieRangsumme der Anforderungen maximal ist.


<strong>Objektorientiertes</strong><strong>Programmieren</strong> <strong>in</strong><strong>GAP</strong>Max NeunhöfferObjekte,Operationen undMethodenselektionDie IdeeTypenOperationen und MethodenKonventionenFamilienKategorien undRepräsentationenVererbungE<strong>in</strong> BeispielDie DeklarationenDie ImplementationBenutzungsbeispielWeitereBequemlichkeitenPropertiesAttributeDebugg<strong>in</strong>gDie Idee an FamilienDie Familien partitionieren die Menge der Objekte.Dagegen bilden die Filter e<strong>in</strong>e Hierarchie von Mengen.z.B.: PermutationsFamily, CyclotomicsFamily.Bei endlich präsentierten Gruppen bilden alle Elementee<strong>in</strong>er solchen Gruppe e<strong>in</strong>e Familie.E<strong>in</strong>e Collection besteht aus Objekten derselben Familie.Zu jeder Familie kann man die „CollectionsFamily“ bilden.und zu jeder Collectionsfamily ihre „ElementsFamily“:gap> f:=CollectionsFamily(CyclotomicsFamily);;gap> CyclotomicsFamily=ElementsFamily(f);truegap> FamilyObj((1,2,3))=PermutationsFamily;true


<strong>Objektorientiertes</strong><strong>Programmieren</strong> <strong>in</strong><strong>GAP</strong>Max NeunhöfferObjekte,Operationen undMethodenselektionDie IdeeTypenOperationen und MethodenKonventionenFamilienKategorien undRepräsentationenVererbungE<strong>in</strong> BeispielDie DeklarationenDie ImplementationBenutzungsbeispielWeitereBequemlichkeitenPropertiesAttributeDebugg<strong>in</strong>gKategorien und Repräsentationen„Kategorien“ und „Repräsentationen“ s<strong>in</strong>d nichts anderesals elementare Filter mit e<strong>in</strong> bisschen Philosophiedah<strong>in</strong>ter!Objekte <strong>in</strong> derselben Kategorie sollen (mathematisch)gleichartige Objekte se<strong>in</strong>.Objekte ändern ihre Kategorie nie!Mathematisch gleiche oder gleichartige Objekte könnenunterschiedlich repräsentiert se<strong>in</strong>, dann sollten sie <strong>in</strong>unterschiedlichen Repräsentationen liegen.IsPerm ist e<strong>in</strong>e Kategorie.IsPerm2Rep und IsPerm4Rep s<strong>in</strong>d Repräsentationen.Kategorien kommen <strong>in</strong> Operationsdeklarationen vor,während Repräsentationen <strong>in</strong> Anforderungen fürMethoden<strong>in</strong>stallationen benutzt werden.


<strong>Objektorientiertes</strong><strong>Programmieren</strong> <strong>in</strong><strong>GAP</strong>Max NeunhöfferObjekte,Operationen undMethodenselektionDie IdeeTypenOperationen und MethodenKonventionenFamilienKategorien undRepräsentationenVererbungE<strong>in</strong> BeispielDie DeklarationenDie ImplementationBenutzungsbeispielWeitereBequemlichkeitenPropertiesAttributeDebugg<strong>in</strong>gVererbung <strong>in</strong> <strong>GAP</strong>Vererbung funktioniert über Subfilter.Man deklariert Subfilter und konstruiert Objekte, die <strong>in</strong>diesen zusätzlichen Subfiltern liegen.Braucht man speziellere Methoden, werden diese mit denSubfiltern als zusätzliche Anforderungen <strong>in</strong>stalliert.Hypothetisches Beispiel:DeclareCategory("IsGroup",IsObject);DeclareCategory("IsAbelianGroup",IsGroup);DeclareOperation("Size",[IsGroup]);InstallMethod(Size,"for arbitrary groups",[IsGroup],function(g) ... end);InstallMethod(Size,"for abelian groups",[IsAbelianGroup],function(a) ... end);


<strong>Objektorientiertes</strong><strong>Programmieren</strong> <strong>in</strong><strong>GAP</strong>Max NeunhöfferObjekte,Operationen undMethodenselektionDie IdeeTypenOperationen und MethodenKonventionenFamilienKategorien undRepräsentationenVererbungE<strong>in</strong> BeispielDie DeklarationenDie ImplementationBenutzungsbeispielWeitereBequemlichkeitenPropertiesAttributeDebugg<strong>in</strong>gDie DeklarationenB<strong>in</strong>dGlobal("BlubbsFamily",NewFamily("BlubbsFamily"));DeclareCategory("IsBlubb",IsComponentObjectRep);DeclareRepresentation("IsBlubbDenseRep",IsBlubb,["wo","p"]);B<strong>in</strong>dGlobal("BlubbDenseType",NewType(BlubbsFamily,IsBlubbDenseRep));DeclareOperation("Blubb",[IsStr<strong>in</strong>g,IsInt]);DeclareOperation("IsShort",[IsBlubb]);DeclareOperation("NrLetters",[IsBlubb]);InstallMethod(Blubb,"constructor",[IsStr<strong>in</strong>g,IsInt], function(s,i)local r;r := rec(wo:=s,p:=i);return Objectify(BlubbDenseType,r);end);


<strong>Objektorientiertes</strong><strong>Programmieren</strong> <strong>in</strong><strong>GAP</strong>Max NeunhöfferObjekte,Operationen undMethodenselektionDie IdeeTypenOperationen und MethodenKonventionenFamilienKategorien undRepräsentationenVererbungE<strong>in</strong> BeispielDie DeklarationenDie ImplementationBenutzungsbeispielWeitereBequemlichkeitenPropertiesAttributeDebugg<strong>in</strong>gDie ImplementationInstallMethod(IsShort,"for dense Blubbs",[IsBlubbDenseRep],function(bl)return Length(bl!.wo)


<strong>Objektorientiertes</strong><strong>Programmieren</strong> <strong>in</strong><strong>GAP</strong>Max NeunhöfferObjekte,Operationen undMethodenselektionDie IdeeTypenOperationen und MethodenKonventionenFamilienKategorien undRepräsentationenVererbungE<strong>in</strong> BeispielDie DeklarationenDie ImplementationBenutzungsbeispielWeitereBequemlichkeitenPropertiesAttributeDebugg<strong>in</strong>gBenutzungMan kann nun Blubb-Objekte wie folgt nutzen:gap> b := Blubb("abac",17);gap> NrLetters(b);3gap> IsShort(b);truegap> b!.wo;"abac"gap> b!.p;17Man sollte Methoden fürViewObj (zum Anschauen für den Benutzer: kurz!),Pr<strong>in</strong>tObj (wenn möglich <strong>GAP</strong>-lesbar),und ev. Display (hübsch formatiert)<strong>in</strong>stallieren.


<strong>Objektorientiertes</strong><strong>Programmieren</strong> <strong>in</strong><strong>GAP</strong>Max NeunhöfferObjekte,Operationen undMethodenselektionDie IdeeTypenOperationen und MethodenKonventionenFamilienKategorien undRepräsentationenVererbungE<strong>in</strong> BeispielDie DeklarationenDie ImplementationBenutzungsbeispielWeitereBequemlichkeitenPropertiesAttributeDebugg<strong>in</strong>gPropertiesE<strong>in</strong>e Property „XYZ“ ist realisiert durch:e<strong>in</strong>en elementaren Filter HasXYZ unde<strong>in</strong>en elementaren Filter XYZ.Deklariert durch:DeclareProperty("IsShort",IsBlubb);Dies def<strong>in</strong>iert automatische<strong>in</strong>en elementaren Filter HasIsShort,e<strong>in</strong>en elementaren Filter IsShort,e<strong>in</strong>e Operation IsShort,e<strong>in</strong>e Methode für IsShort für Objekte im FilterIsBlubb and HasIsShort, die im Typnachschaut, unde<strong>in</strong>e Operation mit Methode SetIsShort.


<strong>Objektorientiertes</strong><strong>Programmieren</strong> <strong>in</strong><strong>GAP</strong>Max NeunhöfferObjekte,Operationen undMethodenselektionDie IdeeTypenOperationen und MethodenKonventionenFamilienKategorien undRepräsentationenVererbungE<strong>in</strong> BeispielDie DeklarationenDie ImplementationBenutzungsbeispielWeitereBequemlichkeitenPropertiesAttributeDebugg<strong>in</strong>gAttributeDeclareAttribute("NrLetters",IsBlubb);def<strong>in</strong>iert automatische<strong>in</strong>en elementaren Filter HasXYZ,e<strong>in</strong>e Operation XYZ.Vererbt man von IsComponentObjectRep andIsAttributeStor<strong>in</strong>gRep, dann sogar noch:E<strong>in</strong>e Operation SetXYZ für [IsBlubb,IsObject],die das 2. Argument <strong>in</strong> die !.XYZ-Komponentespeichert und HasXYZ setzt.Jede Methode für XYZ speichert ihr Ergebnisautomatisch dort und setzt HasXYZ.E<strong>in</strong>e hochrangige Methode für XYZ für Objekte imFilter IsBlubb and HasXYZ, die e<strong>in</strong>fach nur!.XYZ liefert.


<strong>Objektorientiertes</strong><strong>Programmieren</strong> <strong>in</strong><strong>GAP</strong>Max NeunhöfferObjekte,Operationen undMethodenselektionDie IdeeTypenOperationen und MethodenKonventionenFamilienKategorien undRepräsentationenVererbungE<strong>in</strong> BeispielDie DeklarationenDie ImplementationBenutzungsbeispielWeitereBequemlichkeitenPropertiesAttributeDebugg<strong>in</strong>gBeispiel — revisitedWir können <strong>in</strong> unserem Beispiel e<strong>in</strong>fachDeclareCategory("IsBlubb",IsComponentObjectRep);DeclareOperation("IsShort",[IsBlubb]);DeclareOperation("NrLetters",[IsBlubb]);durchDeclareCategory("IsBlubb",IsAttributeStor<strong>in</strong>gRep);DeclareProperty("IsShort",IsBlubb);DeclareAttribute("NrLetters",IsBlubb);ersetzen und dadurch automatisch Cach<strong>in</strong>g erhalten:gap> b := Blubb("abac",17);gap> HasNrLetters(b);falsegap> NrLetters(b);;gap> HasNrLetters(b);true


<strong>Objektorientiertes</strong><strong>Programmieren</strong> <strong>in</strong><strong>GAP</strong>Debugg<strong>in</strong>gMax NeunhöfferObjekte,Operationen undMethodenselektionDie IdeeTypenOperationen und MethodenKonventionenFamilienKategorien undRepräsentationenVererbungE<strong>in</strong> BeispielDie DeklarationenDie ImplementationBenutzungsbeispielWeitereBequemlichkeitenPropertiesAttributeDebugg<strong>in</strong>gWenn man sehen will, welche Methoden verfügbar s<strong>in</strong>d:gap> ApplicableMethod(NrLetters,[b],3,"all");#I Search<strong>in</strong>g Method for NrLetters with 1 \arguments:#I Total: 2 entries#I Method 1: ‘‘NrLetters: system getter’’,\value: 2*SUM_FLAGS+4#I - 1st argument needs \[ "IsAttributeStor<strong>in</strong>gRep",\"Tester(NrLetters)" ]#I Method 2: ‘‘NrLetters: for dense \Blubbs’’, value: 3#I Skipped:[ function( bl ) ... end ]


<strong>Objektorientiertes</strong><strong>Programmieren</strong> <strong>in</strong><strong>GAP</strong>Max NeunhöfferObjekte,Operationen undMethodenselektionDie IdeeTypenOperationen und MethodenKonventionenFamilienKategorien undRepräsentationenVererbungE<strong>in</strong> BeispielDie DeklarationenDie ImplementationBenutzungsbeispielWeitereBequemlichkeitenPropertiesAttributeDebugg<strong>in</strong>gDas Beispiel nochmal komplettB<strong>in</strong>dGlobal("BlubbsFamily",NewFamily("BlubbsFamily"));DeclareCategory("IsBlubb",IsAttributeStor<strong>in</strong>gRep);DeclareRepresentation("IsBlubbDenseRep",IsBlubb,["wo","p"]);B<strong>in</strong>dGlobal("BlubbDenseType",NewType(BlubbsFamily,IsBlubbDenseRep));DeclareOperation("Blubb",[IsStr<strong>in</strong>g,IsInt]);DeclareProperty("IsShort",IsBlubb);DeclareAttribute("NrLetters",IsBlubb);InstallMethod(Blubb,"constructor",[IsStr<strong>in</strong>g,IsInt], function(s,i)local r;r := rec(wo:=s,p:=i);return Objectify(BlubbDenseType,r);end);


<strong>Objektorientiertes</strong><strong>Programmieren</strong> <strong>in</strong><strong>GAP</strong>Max NeunhöfferObjekte,Operationen undMethodenselektionDie IdeeTypenOperationen und MethodenKonventionenFamilienKategorien undRepräsentationenVererbungE<strong>in</strong> BeispielDie DeklarationenDie ImplementationBenutzungsbeispielWeitereBequemlichkeitenPropertiesAttributeDebugg<strong>in</strong>gBeispiel komplett, FortsetzungInstallMethod(IsShort,"for dense Blubbs",[IsBlubbDenseRep],function(bl)return Length(bl!.wo)

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!