Objektorientiertes Programmieren in GAP
Objektorientiertes Programmieren in GAP
Objektorientiertes Programmieren in GAP
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)