GR8Conf 2009: Industrial Strength Groovy by Paul King
-
Upload
gr8conf -
Category
Technology
-
view
2.171 -
download
1
description
Transcript of GR8Conf 2009: Industrial Strength Groovy by Paul King
Industrial Strength Groovy
Tools for the Professional Groovy Developer
Dr Paul KingASERT
Brisbane, Australia
Draft Only – Updated Version will be on gr8conf site and/or SlideShare
Topics
Testing: JUnit, TestNG, EasyB, Spock, Instinct
Mocking: MockFor, GMock, Spock, EasyMock
Injection: Spring, Guice
Coverage: Cobertura
Code style: CodeNarc, IntelliJ
Duplication: Simian
Documentation: GroovyDoc
Builds: Maven, Ant, Gant, Graven, Gradle, Hudson
Modularisation: Grapes, OSGi
Groovy’s Appeal
Innovators/Thought leaders
Ideas, power, flexibility, novelty, thinking community
Early adopters
Productivity benefits and collegiate community
Leverage JVM and potential for mainstream
Mainstream
Leverage existing Java skills, low learning curve
Leverage JVM and production infrastructure
Professional community
Tools, tools, tools
Testing: JUnit, TestNG, EasyB, Spock, Instinct
Mocking: MockFor, GMock, Spock, EasyMock
Dependency Injection
Hollywood Principle
Don’t call us, we’ll call you
“All problems in computer science canbe solved by another level of indirection”
"...except for the problem of too many layers of indirection“
For attributions, seehttp://en.wikipedia.org/wiki/Inversion_of_control
Dependency Injection
Pattern for loosely coupled & testable objects
class Client {Calculator calcdef executeCalc(a, b) {
calc.add(a, b)}
}
class Client {Calculator calc =
new CalculatorImpl()def executeCalc(a, b) {
calc.add(a, b)}
}
Service locator/factory
Tightly coupled?
Hard to test?
Easy to understand?
Refactoring/navigation?
Need to select setter, constructor, field style
Can add complexity
Manage configuration
Direct or framework
Consistency/lifecycle
Dependency Injection: Guice
import com.google.inject.*
@ImplementedBy(CalculatorImpl)interface Calculator {
def add(a, b)}
@Singletonclass CalculatorImpl implements Calculator {
private total = 0def add(a, b) { total++; a + b }def getTotalCalculations() { 'Total Calculations: ' + total }String toString() { 'Calc: ' + hashCode()}
}
class Client {@Inject Calculator calc// ...
}
def injector = Guice.createInjector()// ...
Dependency Injection: Metaprogramming Style
class Calculator {def total = 0def 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) == 3assert c2.add(3, 4) == 7
assert c1.is(c2)assert [c1, c2].total == [2, 2]
Coverage: Cobertura
Code style: CodeNarc, IntelliJ
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/WritableRaster.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
Documentation: GroovyDoc
Builds: Maven, Ant, Gant, Graven, Gradle, Hudson
Modularisation: Grapes, OSGi