SEKE 2001 - 14 June
VUB Brussels - Belgium
Supporting Software Development through Declaratively Codified Programming Patterns
Kim Mens, Isabel Michiels and Roel Wuyts
Vrije Universiteit Brussel (VUB), Belgium
Supporting Software Development through Declaratively Codified - - PowerPoint PPT Presentation
Supporting Software Development through Declaratively Codified Programming Patterns Kim Mens, Isabel Michiels and Roel Wuyts Vrije Universiteit Brussel (VUB), Belgium SEKE 2001 - 14 June VUB Brussels - Belgium Table of Contents
SEKE 2001 - 14 June
VUB Brussels - Belgium
Vrije Universiteit Brussel (VUB), Belgium
SEKE 2001 - 14 June
VUB Brussels - Belgium
SEKE 2001 - 14 June
VUB Brussels - Belgium
SEKE 2001 - 14 June
VUB Brussels - Belgium
SEKE 2001 - 14 June
VUB Brussels - Belgium
SEKE 2001 - 14 June
VUB Brussels - Belgium
Rule ule class(?Class) if if constant(?Class), [Smalltalk includes: ?Class name]. Rule Rule class(?Class) if if variable(?Class), generate(?Class,[Smalltalk allClasses]) Query class([Array]).
smalltalk code used as a predication has to return true
smalltalk code used in a generate predicate has to return a collection of results
SEKE 2001 - 14 June
VUB Brussels - Belgium
class(?Class) classImplementsMethod(?Class,?MethodName,?Method) methodArguments(?Method,?Arglist) methodClass(?Method,?Class) methodName(?Method,?Name) methodStatements(?Method,?StatementList) instVar(?Class,?InstVarName) isSentTo(?SenderClass,?ReceiverClass,?MesgName,?Arglist)
SEKE 2001 - 14 June
VUB Brussels - Belgium
Rule gettingMethod(?Class,?Method,?InstVar) if classImplementsMethod(?Class,_,?Method), instVar(?Class,?InstVar), methodName(?Method,?InstVar), gettingMethodStats(?Stats,?InstVars), methodStatements(?Method,?Stats).
SEKE 2001 - 14 June
VUB Brussels - Belgium
Example: Visitor Design Pattern Rule Rule visitor(?Visitor,?El,?AcceptM,?VisitSelector) if if classImplementsMethod(?Visitor,?VisitSelector,_), classImplementsMethod(,?El,?AcceptM,?Meth), methodStatements( ?Meth, <return(send(?V,?VisitSelector,?VisitArgs))>), member(variable([#’self’]),?VisitArgs), methodArguments(?Meth,?AccArgs), member(?V,?AccArgs).
SEKE 2001 - 14 June
VUB Brussels - Belgium
SEKE 2001 - 14 June
VUB Brussels - Belgium
Example: [Riel’s Design Heuristics] All abstract classes must be base classes and all base classes should be abstract classes. Rule Rule abstractClassHeuristic() if if forall(abstractClass(?Class),baseClass(?Class)), forall(baseClass(?Class),abstractClass(?Class)).
SEKE 2001 - 14 June
VUB Brussels - Belgium
Query Query gettingMethod([ApplicationModel],?M,[#’builder’]) Query ry gettingMethod([ApplicationModel],?M,?InstVar) Query ery gettingMethod(?Class,?Method,[#’name’])
SEKE 2001 - 14 June
VUB Brussels - Belgium
Rule accessingviolator(?Class,?Meth,?InstVar,?ViolMsg) if instVar(?Class,?InstVar), classImplementsMethod(?Class,_,?Meth), not(gettingMethod(?Class,?Meth,?InstVar)), isSentTo(?Class,variable(?InstVar),?ViolMsg,_). Query accessingViolator(?Class,?Meth,?InstVar,?Msg)
SEKE 2001 - 14 June
VUB Brussels - Belgium
Rule generateAccessor(?Class,?InstVar) if instVar(?Class,?InstVar), not(classImplementsMethod(?Class,?InstVar,_)), gettingMethodStats(?Stats,?InstVar), generateMethod( method(?Class,?InstVar,<>,<>,?Stats)).
“Generate code from the method parse tree description”
“Check whether ?InstVar not
already exists”
SEKE 2001 - 14 June
VUB Brussels - Belgium
SEKE 2001 - 14 June
VUB Brussels - Belgium
SEKE 2001 - 14 June
VUB Brussels - Belgium