+ All Categories
Home > Software > Repetition is bad, repetition is bad.

Repetition is bad, repetition is bad.

Date post: 12-Apr-2017
Category:
Upload: michele-giacobazzi
View: 20 times
Download: 0 times
Share this document with a friend
29
title subtitle Repetition is bad, repetition is bad Michele Giacobazzi – WellD Sagl Voxxed days Ticino 18 april 2015 www.welld.ch
Transcript
Page 1: Repetition is bad, repetition is bad.

title

subtitle

Repetition is bad, repetition is bad

Michele Giacobazzi – WellD SaglVoxxed days Ticino 18 april 2015www.welld.ch

Page 2: Repetition is bad, repetition is bad.

article

title

A «harder» case of repetition Repeated code is above and below the «Dynamic» part Use of variables and resources makes refactoring harder In our example there are 6 main actions:

1. User retrieval2. Connection to remote system3. Dynamic call4. Exception handling5. Closing the connection6. Action auditing (log)

REPETITION

CODE

REPETITION

Page 3: Repetition is bad, repetition is bad.

public Squid findSquids(String token, Map<String,Object> criteria) {BEConnector connector = null;Squid result = null;//1 Get the operatorVoxxedOperator operator = login.getOperator(token);if (operator == null) {

logger.warn("invalid operator token " + token); return null;

}try {

//2 estabilish connection and get remote service facadeconnector = ConnUtility.getBEConnector();VoxxedFacade service = ConnUtility.getVoxxedFacade(connector);//3 The real action!result = service.findSquidByCriteria(operator, criteria);

} catch (Exception e) { //4 log and handle exceptionlogger.error("Error in findSquids", e);result = null;

} finally {//5 release the connectionConnUtility.releaseBEConnector(connector);

}// 6 audit the action (log)logger.info("findSquids executed with params " + criteria + " and result " + result);return result;

}

Page 4: Repetition is bad, repetition is bad.
Page 5: Repetition is bad, repetition is bad.

article

title

Java reflection - Method java.lang.reflect.Method Obtained with class.getMethod(String name, Class<?>... parameterTypes) Executed with method.invoke(Object context, Object... parameters)

Page 6: Repetition is bad, repetition is bad.
Page 7: Repetition is bad, repetition is bad.
Page 8: Repetition is bad, repetition is bad.

public class BeMethodCall{

//Token. To be provided.private String token;

private Method method;

private Object[] params;

public BeMethodCall(Method method, String token, Object[] params) {

super();this.token = token;

}

//[getters and setters]

}

Page 9: Repetition is bad, repetition is bad.
Page 10: Repetition is bad, repetition is bad.
Page 11: Repetition is bad, repetition is bad.

article

title

Java reflection - Method Standard Java Only single method call Returns Object Needs wrapper object Verbose syntax

Page 12: Repetition is bad, repetition is bad.

article

title

Callable Task java.util.concurrent.Callable Interface Callable<V> A simple method call() that returns V.

Page 13: Repetition is bad, repetition is bad.
Page 14: Repetition is bad, repetition is bad.

public abstract class BeTask<T> implements Callable<T> {

//Token. To be provided.private String token;//Facade. Injected by BetaskExecutor.private VoxxedFacade service;//Operator. Injected by BetaskExecutor.private VoxxedOperator operator;

 public BeTask(String token) {

super();this.token = token;

}

//[..] Getters and setters}

Page 15: Repetition is bad, repetition is bad.

public Squid getSquidsWithTask(String token, final Map<String,Object> criteria) {

Squid result= beTaskExecutor.executeBeCall(new BeTask<Squid>(token) {

@Overridepublic Squid call() throws Exception {

return this.getService().findSquidByCriteria(this.getOperator(),criteria);

}

});

// 6 audit the action (log)logger.info("getSquidsWithTask executed with params " + criteria

+ " and result " + result);return result;

}

Page 16: Repetition is bad, repetition is bad.

article

title

Callable Task Standard Java Simple code in DAO Allows the use of generic Parameters must be final Resources must be injected Does not allow auditing (log)

Page 17: Repetition is bad, repetition is bad.

article

title

Java 8 function java.lang.FunctionalInterface Must have a single method Can be used with lambdas Common function types in java.util.function Create your own

Page 18: Repetition is bad, repetition is bad.

@FunctionalInterfacepublic interface BeFunctionInterface<T> {

T execute(VoxxedOperator operator, VoxxedFacade service);

}

public abstract class BeFunction<T> implements BeFunctionInterface<T>{

private String token;

public BeFunction(String myToken) {super();this.token = myToken;}

public String getToken(){return token;}

 public abstract T execute(VoxxedOperator operator, VoxxedFacade service);

 }

Page 19: Repetition is bad, repetition is bad.
Page 20: Repetition is bad, repetition is bad.

public Squid getSquidsWithFunction(String token, final Map<String,Object> criteria) {

Squid result= beFunctionExecutor.executeFunction(new BeFunction<Squid>(token) { 

@Overridepublic Squid execute(VoxxedOperator operator, VoxxedFacade service) {

return service.findSquidByCriteria(operator, criteria);}

});

// 6 audit the action (log)logger.info("getSquidWithFunction executed with params " + criteria

+ " and result " + result);return result;

}

Page 21: Repetition is bad, repetition is bad.

article

title

Java 8 function Needs Java 8 Better syntax and parameter handling Does not allow auditing (log) Parameters must be final

Page 22: Repetition is bad, repetition is bad.

article

title

Interceptor javax.interceptor.Interceptor Annotate a method with AroundInvoke Access to InvocationContext Returns a result

Page 23: Repetition is bad, repetition is bad.
Page 24: Repetition is bad, repetition is bad.
Page 25: Repetition is bad, repetition is bad.

@LogMethod@BeConnectionpublic Squid findSquids(@BeFacade VoxxedFacade service, String token, Map<String,Object> criteria) {

Squid result = null;//1 Get the operatorVoxxedOperator operator = loginManager.getOperator(token);if (operator == null) {

logger.warn("invalid operator token " + token); return null;

}

//3 The real action!result = service.findSquidByCriteria(operator, criteria);

 //Exception and Connection close handling in interceptor.

//Log handled in interceptor.return result;

}

Page 26: Repetition is bad, repetition is bad.

article

title

Interceptor Needs container support Wraps the method execution Has access to method data Can manipulate parameter Relies on method signature

Page 27: Repetition is bad, repetition is bad.

article

title

A small comparison

Support Syntax Completeness

Method Standard Java Mah.. Full

Task Standard Java Acceptable Partial (no log)

Function Java 8 Good! Partial (no log)

Interceptor Container library Depends Partial

Page 28: Repetition is bad, repetition is bad.

article

title

Our solution: function + interceptor

Page 29: Repetition is bad, repetition is bad.

article

title

Discussion! Questions and suggestions Find me around or at WellD stand Other approaches: dependency injection, decorator, filters… Contacts: [email protected] Twitter: @Smirne WellD: www.welld.ch


Recommended