GROOVY POWERED CLEAN CODE
Noam Tenne
$WHOAMI
Developing on the JVM for the past 14 years
codefresh.io
Altogether standup guy
@NoamTenne
blog.10ne.org
CODEFRESH.IO
Docker oriented CI/CD that goes to 11
CODEFRESH.IO
Build your services as Docker images
(You don’t even need a Dockerfile)
CODEFRESH.IO
Instantly launch your services
(Solo or part of a composition)
“Writing clean code is what you must
do in order to call yourself a
professional.”
–Robert C. Martin
http://www.amazon.com/dp/0132350882/ref=cm_sw_r_tw_dp_GuZ2wb1ZS9GXP
WHICH ONE ISYOUR CODE REVIEW?
ISTHISYOUR REFACTORING SESSION?
MEANINGFUL NAMES
def myItemArrayList = []
FUNCTIONS
breedDogAndPutItThroughAstronautTrainingAndSendItToSpace()
COMMENTS
//Construct object, obviously

def object = new Obvious()
OBJECTSVS. DATA-STRUCTS
planetSmasher.getPlanetContext().planet = "Earth"

planetSmasher.smash()
ERROR HANDLING
catch (Exception e) {

//noop

}
TESTS
//TODO: Write tests
HUMANS
<ENTER GR8BEER>
WHAT MAKES GROOVY CLEAN?
NATIVE JSON SUPPORT
ScriptEngineManager sem = new ScriptEngineManager();



ScriptEngine jse = sem.getEngineByName("javascript");

String script = "Java.asJSONCompatible(" + json + ")";



Object rawJsonObject = javascriptEngine.eval(script);

Map contents = (Map) rawJsonObject;
Nashorn?
import groovy.json.JsonSlurper

…


def contents = new JsonSlurper().parse(json)
JSON/MARKUP BUILDERS
String html = "<html>";
html += "<head>";
html += "<title>Noam's guide to Tel Aviv</title>";
html += "</head>";
...
html += "</body>";
html += "</html>";
new MarkupBuilder(it).html {
head {
title("Noam's Guide To Tel Aviv")
}
body {
...
}
}
DocumentBuilderFactory
docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder =
docFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement("gah");
doc.appendChild(rootElement);
def xml = new MarkupBuilder()
xml.guide(type:"guide"){
title("Noam's Guide To Tel Aviv")
}
def json = new JsonBuilder()
def root = json {
title "Noam's Guide To Tel Aviv"
}
json.toString()
CHECKED EXCEPTIONS
private void readTheStream() {
URI.create(“Java.IL").toURL().openStream();

}
throws IOException
private void readTheStream() {
URI.create(“Java.IL").toURL().openStream();

}
WHAT MAKES GROOVY REALLY CLEAN?
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

…
Reader isr = new InputStreamReader(it);
def isr = new InputStreamReader(it);
DEFAULT IMPORTS
import java.lang.*

import java.util.*

import java.io.*

import java.net.*

import groovy.lang.*

import groovy.util.*

import java.math.BigInteger

import java.math.BigDecimal


import org.slf4j.*

import groovy.util.logging.Slf4j



@Slf4j

class GroovyDoge {



public static void main(String[] args) {

log.info "Wow! Much Groovy! So Log!"

}

}

ASTTRANSFORMATION
1. Initialization
2. Parsing
3. Conversion
4. Semantic Analysis
5. Canonicalization
6. Instruction Selection
7. Class Generation
8. Output
9. Finalization
List list = []

assert list instanceof java.util.ArrayList

list.plus([])
REGISTERED META METHODS
POGO Metaclass
MetaclassRegistry
REGISTERED META METHODS
def fileContents = Paths.get('/path/to/file').text
EXTENSION MODULES
class MyExtension {

public static String asString(Integer target) {

...

}

}
EXTENSION MODULES
class MyExtension {

public static String asString(Integer target) {

...

}

}
Register the class with a descriptor in META-INF/services
EXTENSION MODULES
class MyExtension {

public static String asString(Integer target) {

...

}

}
Register the class with a descriptor in META-INF/services
EXTENSION MODULES
class MyExtension {

public static String asString(Integer target) {

...

}

}
Register the class with a descriptor in META-INF/services
1337.asString()
SCRIPTS
def message = "Much script! Wow! So code!"

println message
SCRIPTS
import org.codehaus.groovy.runtime.InvokerHelper



class DogeScript extends Script {

def run() {

def message = "Much script! Wow! So code!"

println message

}

static void main(String[] args) {

InvokerHelper.runScript(DogeScript, args)

}

}
SCRIPTS
LANGUAGE
QUESTIONS?
TODA!

Groovy Powered Clean Code