Upload
gr8conf
View
607
Download
0
Embed Size (px)
Citation preview
GROOVY POWERED CLEAN CODE
Noam Tenne
$WHOAMI
Developing on the JVM for the past 13 years
codefresh.io
Altogether standup guy
@NoamTenne
blog.10ne.org
CODEFRESH.IOBuild your services as Docker images(You don’t even need a Dockerfile)
“Writing clean code is what you must do in order to call yourself a
professional.”
–Robert C. Martin
http
://w
ww.
amaz
on.co
m/d
p/01
3235
0882
/ref=
cm_s
w_r
_tw
_dp_
GuZ
2wb1
ZS9G
XP
WHICH ONE IS YOUR CODE REVIEW?
IS THIS YOUR REFACTORING SESSION?
MEANINGFUL NAMES
def myItemArrayList = []
FUNCTIONS
breedDogAndPutItThroughAstronautTrainingAndSendItToSpace()
COMMENTS
//Construct object, obviouslydef object = new Obvious()
OBJECTS VS. 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 Copenhagen</title>";html += "</head>";...html += "</body>";html += "</html>";
new MarkupBuilder(it).html {head {
title("Noam's Guide To Copenhagen")}body {
...}
}
DocumentBuilderFactorydocFactory = 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 Copenhagen")}
def json = new JsonBuilder()def root = json {
title "Noam's Guide To Copenhagen"}json.toString()
CHECKED EXCEPTIONS
private void readTheStream() {
URI.create("gr8conf.eu").toURL().openStream();
}
throws IOException
private void readTheStream() {
URI.create("gr8conf.eu").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.BigIntegerimport java.math.BigDecimal
import org.slf4j.*import groovy.util.logging.Slf4j@Slf4jclass GroovyDoge { public static void main(String[] args) { log.info "Wow! Much Groovy! So Log!" } }
AST TRANSFORMATION
1. Initialization2. Parsing3. Conversion4. Semantic Analysis 5. Canonicalization6. Instruction Selection7. Class Generation8. Output9. Finalization
List list = []assert list instanceof java.util.ArrayListlist.plus([])
REGISTERED META METHODS
POGO Metaclass
MetaclassRegistry
REGISTERED META METHODS
def fileContents = Paths.get('/path/to/file').text
EXTENSION MODULESclass MyExtension { public static String asString(Integer target) { ... }}
EXTENSION MODULESclass MyExtension { public static String asString(Integer target) { ... }}
Register the class with a descriptor in META-INF/services
EXTENSION MODULESclass MyExtension { public static String asString(Integer target) { ... }}
Register the class with a descriptor in META-INF/services
EXTENSION MODULESclass 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
SCRIPTSimport org.codehaus.groovy.runtime.InvokerHelperclass 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?
TAK!