33
25 Aug 2003 Lang-Indep Detection of OO DP 1 Language-Independent Detection of Object-Oriented Design Patterns Johan Fabry Vrije Universiteit Brussel, Programming Technology Lab [email protected]

Language-Independent Detection of Object-Oriented Design Patterns

  • Upload
    esug

  • View
    364

  • Download
    1

Embed Size (px)

Citation preview

Page 1: 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

[email protected]

Page 2: Language-Independent Detection of Object-Oriented Design Patterns

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

Page 3: Language-Independent Detection of Object-Oriented Design Patterns

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

Page 4: Language-Independent Detection of Object-Oriented Design Patterns

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

Page 5: Language-Independent Detection of Object-Oriented Design Patterns

25 Aug 2003 Lang-Indep Detection of OO DP 5

‘Uses’ Layering:

Soul Layering

InferenceEngine LiCoR MLI Code

Repository

Page 6: Language-Independent Detection of Object-Oriented Design Patterns

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

Page 7: Language-Independent Detection of Object-Oriented Design Patterns

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

Page 8: Language-Independent Detection of Object-Oriented Design Patterns

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

Page 9: Language-Independent Detection of Object-Oriented Design Patterns

25 Aug 2003 Lang-Indep Detection of OO DP 9

ß Investigate the code:allClasses…

Code Repository

InferenceEngine LiCoR MLI Code

Repository

Page 10: Language-Independent Detection of Object-Oriented Design Patterns

25 Aug 2003 Lang-Indep Detection of OO DP 10

We discuss changes in inverse order.

Soul to SoulJava

InferenceEngine LicoR MLI Code

Repository

Page 11: Language-Independent Detection of Object-Oriented Design Patterns

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

Page 12: Language-Independent Detection of Object-Oriented Design Patterns

25 Aug 2003 Lang-Indep Detection of OO DP 12

Java Code Browser

Page 13: Language-Independent Detection of Object-Oriented Design Patterns

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

Page 14: Language-Independent Detection of Object-Oriented Design Patterns

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

Page 15: Language-Independent Detection of Object-Oriented Design Patterns

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

Page 16: Language-Independent Detection of Object-Oriented Design Patterns

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

Page 17: Language-Independent Detection of Object-Oriented Design Patterns

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

Page 18: Language-Independent Detection of Object-Oriented Design Patterns

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

Page 19: Language-Independent Detection of Object-Oriented Design Patterns

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)

Page 20: Language-Independent Detection of Object-Oriented Design Patterns

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

Page 21: Language-Independent Detection of Object-Oriented Design Patterns

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

Page 22: Language-Independent Detection of Object-Oriented Design Patterns

25 Aug 2003 Lang-Indep Detection of OO DP 22

ß 4 patterns in 4 apps

Pattern Detection

JRefactoryRefactoringBrowser

DrawletsHotDraw

JavaSmalltalk

Page 23: Language-Independent Detection of Object-Oriented Design Patterns

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

Page 24: Language-Independent Detection of Object-Oriented Design 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

Page 25: Language-Independent Detection of Object-Oriented Design 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

Page 26: Language-Independent Detection of Object-Oriented 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

Page 27: Language-Independent Detection of Object-Oriented Design Patterns

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

Page 28: Language-Independent Detection of Object-Oriented 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

Page 29: Language-Independent Detection of Object-Oriented 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

Page 30: Language-Independent Detection of Object-Oriented Design Patterns

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

Page 31: Language-Independent Detection of Object-Oriented Design Patterns

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

Page 32: Language-Independent Detection of Object-Oriented Design Patterns

25 Aug 2003 Lang-Indep Detection of OO DP 32

LiCoR Structure

Page 33: Language-Independent Detection of Object-Oriented Design Patterns

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;}