GR8Conf 2009: Industrial Strength Groovy by Paul King
1. Industrial Strength
Groovy
Tools for the Professional
Groovy Developer
Dr Paul King
ASERT
Brisbane, Australia
Draft Only – Updated Version will be on gr8conf site and/or SlideShare
6. Dependency Injection
Hollywood Principle
Don’t call us, we’ll call you
“All problems in computer science can
be solved by another level of indirection”
"...except for the problem of too many
layers of indirection“
For attributions, see
http://en.wikipedia.org/wiki/Inversion_of_control
7. Dependency Injection
Pattern for loosely coupled & testable objects
class Client { class Client {
Calculator calc = Calculator calc
new CalculatorImpl() def executeCalc(a, b) {
def executeCalc(a, b) { calc.add(a, b)
calc.add(a, b) }
} }
}
Need to select setter,
Service locator/factory constructor, field style
Tightly coupled? Can add complexity
Hard to test? Manage configuration
Easy to understand? Direct or framework
Refactoring/navigation? Consistency/lifecycle
8. Dependency Injection: Guice
import com.google.inject.*
@ImplementedBy(CalculatorImpl)
interface Calculator {
def add(a, b)
}
@Singleton
class CalculatorImpl implements Calculator {
private total = 0
def add(a, b) { total++; a + b }
def getTotalCalculations() { 'Total Calculations: ' + total }
String toString() { 'Calc: ' + hashCode()}
}
class Client {
@Inject Calculator calc
// ...
}
def injector = Guice.createInjector()
// ...
9. Dependency Injection:
Metaprogramming Style
class Calculator {
def total = 0
def add(a, b) { total++; a + b }
}
def INSTANCE = new Calculator()
Calculator.metaClass.constructor = { -> INSTANCE }
def c1 = new Calculator()
def c2 = new Calculator()
assert c1.add(1, 2) == 3
assert c2.add(3, 4) == 7
assert c1.is(c2)
assert [c1, c2].total == [2, 2]
12. Duplication: Simian
Similarity Analyser 2.2.23 -
http://www.redhillconsulting.com.au/products/simian/index.html
Copyright (c) 2003-08 RedHill Consulting Pty. Ltd. All rights reserved.
Simian is not free unless used solely for non-commercial or evaluation
purposes.
{failOnDuplication=true, ignoreCharacterCase=true, ignoreCurlyBraces=true,
ignoreIdentifierCase=true, ignoreModifiers=true, ignoreStringCase=true,
threshold=6}
Found 6 duplicate lines in the following files:
Between lines 201 and 207 in
/Users/haruki_zaemon/Projects/redhill/simian/build/dist/src/java/awt/image/W
ritableRaster.java
...
Found 66375 duplicate lines in 5949 blocks in 1260 files
Processed a total of 390309 significant (1196065 raw) lines in 4242 files
Processing time: 9.490sec