Language-Independent Detection of Object-Oriented Design Patterns
-
Upload
esug -
Category
Technology
-
view
369 -
download
1
Transcript of Language-Independent Detection of Object-Oriented Design Patterns
25 Aug 2003 Lang-Indep Detection of OO DP 1
Language-IndependentDetection of Object-Oriented
Design Patterns
Johan FabryVrije Universiteit Brussel, Programming Technology Lab
25 Aug 2003 Lang-Indep Detection of OO DP 2
ß Research Goalß DMP and Soulß Soul to SoulJavaß Base-Level Reificationß Design Pattern Detectionß Conclusion & Future Work
Overview
25 Aug 2003 Lang-Indep Detection of OO DP 3
ß Language-agnostic reasoning about OOprogramsß Validate research in different OO -
languagesß Soul: Reasoning about Smalltalk (coding
conventions, DP, bad smells, …)ß Clear separation language indep / depß Validation: ST + Java detect BPP, DP
Research Goal
25 Aug 2003 Lang-Indep Detection of OO DP 4
ß DMP:ß Declarative language at meta-levelß OO language at base levelß Meta-level programs reason about structure of
base-level
ß Soul:ß Meta-level prolog-like programming languageß Smalltalk code can be embedded in prolog code
DMP and Soul
25 Aug 2003 Lang-Indep Detection of OO DP 5
‘Uses’ Layering:
Soul Layering
InferenceEngine LiCoR MLI Code
Repository
25 Aug 2003 Lang-Indep Detection of OO DP 6
ß Logic query with a variable:If class(?x)
Inference engine
InferenceEngine LiCoR MLI Code
Repository
25 Aug 2003 Lang-Indep Detection of OO DP 7
ß Appropriate rule is triggered:class(?c) if variable(?c),
generate(?c,[ExplicitMLI current allClasses)])
LiCoR
InferenceEngine LiCoR MLI Code
Repository
25 Aug 2003 Lang-Indep Detection of OO DP 8
ß Link to the base-level:allClasses
^Smalltalk allClasses
Meta Level Interface
InferenceEngine LiCoR MLI Code
Repository
25 Aug 2003 Lang-Indep Detection of OO DP 9
ß Investigate the code:allClasses…
Code Repository
InferenceEngine LiCoR MLI Code
Repository
25 Aug 2003 Lang-Indep Detection of OO DP 10
We discuss changes in inverse order.
Soul to SoulJava
InferenceEngine LicoR MLI Code
Repository
25 Aug 2003 Lang-Indep Detection of OO DP 11
ß Use Frost to parse Java Codeß Assume correct java code !ß Java 1.0 (+epsilon) parser
ß Java Code = parse treesß .java ‘File in’ in File Browserß Java Code Browser
Java Code Repository
25 Aug 2003 Lang-Indep Detection of OO DP 12
Java Code Browser
25 Aug 2003 Lang-Indep Detection of OO DP 13
ß Uses Java Code Repository
ß Implementsß all methods of ST MLIß methods for interface support
MLI For Java
25 Aug 2003 Lang-Indep Detection of OO DP 14
ß Namespace [name|super|sub|classes]ß ->Through MLI
ß Class [name|super|sub|ns|methods|iv]ß ->Through MLI
ß InstVar [name|inClass|type]ß ->Through MLI
ß Method [name|arglist]ß ->Through MLI
Base-Level Reification
25 Aug 2003 Lang-Indep Detection of OO DP 15
ß Method bodies = logic parse tree formß Smalltalk: count set: 0 =send(variable([#count])),[#set:],<[0]>)
ß Java: count.set(0) =send(variable([#count])),[#set],<[0]>)
ß Allows for easy verification:isMessageSend(send(?receiver,?message,?arguments))
Method Body Reification
25 Aug 2003 Lang-Indep Detection of OO DP 16
ß But Java has more PT elements!ß if-then-else, while, for, …
ß Introduce new logic functor for eachß Logic Java Parse trees have different form!ß No transformation to ‘ST-compatible’ formß Logic PT as similar as possible to Java codeß Needed for later work: Java PT manipulations
ß Users of parse tree must take this intoaccount
Method Body Reification
25 Aug 2003 Lang-Indep Detection of OO DP 17
ß PTT: Specific layer in LiCoRß Recursively traverses parse treesß Called with:ß ?found predicateß ?process predicateß ?env for results
ß Provide lang-spec implementation
Parse Tree Traversal Layer
25 Aug 2003 Lang-Indep Detection of OO DP 18
ß PTT: Specific layer in LiCoRß Recursively traverses parse treesß Called with:ß ?found predicateß ?process predicateß ?env for results
ß Provide lang-spec implementation
Parse Tree Traversal Layer
isMessageSend
25 Aug 2003 Lang-Indep Detection of OO DP 19
ß PTT: Specific layer in LiCoRß Recursively traverses parse treesß Called with:ß ?found predicateß ?process predicateß ?env for results
ß Provide lang-spec implementation
Parse Tree Traversal Layer
messageSendMessage(send(?rec,?msg,?args),?args)
25 Aug 2003 Lang-Indep Detection of OO DP 20
ß PTT: Specific layer in LiCoRß Recursively traverses parse treesß Called with:ß ?found predicateß ?process predicateß ?env for results
ß Provide lang-spec implementation
Parse Tree Traversal Layer
25 Aug 2003 Lang-Indep Detection of OO DP 21
ß Lang specific naming and codingconventions
ß Accessor method name:ß Smalltalk: var nameß Java: ‘get’ + capitalized var name
Idioms
25 Aug 2003 Lang-Indep Detection of OO DP 22
ß 4 patterns in 4 apps
Pattern Detection
JRefactoryRefactoringBrowser
DrawletsHotDraw
JavaSmalltalk
25 Aug 2003 Lang-Indep Detection of OO DP 23
Double Dispatch
ß One language-independent ruleß Two idiom rulesß selfReferenceß varName
ß HotDraw: 0, Drawlets:3ß RefactoringBrowser: 17, JRefactory 174
Best Practice Patterns
25 Aug 2003 Lang-Indep Detection of OO DP 24
Getting Method
ß One language-independent ruleß Two idiom rulesß methodSelectorß gettingMethodName
ß HotDraw: 35/75, Drawlets:33/270ß RBrowser: 125/531, JRefactory 134/721
Best Practice Patterns
25 Aug 2003 Lang-Indep Detection of OO DP 25
Template Method
ß Three language-independent rulesß Three idiom rulesß abstractSelector, abstractMethodß selfReference
ß HotDraw Fig: 3, Drawlets Fig: 42 (19 I)ß RBrowser: 43, JRefactory: 50
Design Patterns
25 Aug 2003 Lang-Indep Detection of OO DP 26
Template Method
ß Three language-independent rulesß Three idiom rulesß abstractSelector, abstractMethodß selfReference
ß HotDraw Fig: 3, Drawlets Fig: 42 (19 I)ß RBrowser: 43, JRefactory: 50
Design Patterns
Takes care of interfaces in Java
25 Aug 2003 Lang-Indep Detection of OO DP 27
Template Method
ß Three language-independent rulesß Three idiom rulesß abstractSelector, abstractMethodß selfReference
ß HotDraw Fig: 3, Drawlets Fig: 42 (19 I)ß RBrowser: 43, JRefactory: 50
Design Patterns
25 Aug 2003 Lang-Indep Detection of OO DP 28
Visitor
ß Two language-independent rulesß Use double-dispatch rule
ß Zero idiom rules
ß HotDraw: 0, Drawlets: 0ß RBrowser: 14, JRefactory: 174
Design Patterns
25 Aug 2003 Lang-Indep Detection of OO DP 29
ß Feasible to reason about OO software in alanguage-independent way
ß Soul to SoulJavaß Source Code Repository (Parser & Storage)ß Meta-level Interface (Implement API)ß Parse tree & traversal (Convertor & Logic Rules)ß Idiom layer (As Needed)
ß Growth Idiom Layer < growth Detectionlayer
Conclusion
25 Aug 2003 Lang-Indep Detection of OO DP 30
ß More pattern detection rulesß Easy / Tricky / Too language-specific
ß New languagesß Small impact on current language-indep rules
ß New language versionsß Reasoning about Java Bytecodesß Type inferencingß Language-Independent code generationß From UML, pattern descriptions
Future Work
25 Aug 2003 Lang-Indep Detection of OO DP 31
ß Static Typing vs Dynamic Typingß No Type Inferencing (Yet)ß Types in var declarations: 1 idiom rule
ß Interfacesß Not widely used in patterns: 1 idiom rule
ß Accuracy of detectionß No false positives, no false negativesß Similar limitations as other approaches
FAQ
25 Aug 2003 Lang-Indep Detection of OO DP 32
LiCoR Structure
25 Aug 2003 Lang-Indep Detection of OO DP 33
public void getFoo(){if (foo == null)foo = factory.boot();
return foo;}
public void getFoo() {foo = factory.boot(foo == null);return foo;}