Tarin Gamberini

A software engineer and a passionate java programmer

A more communicative Builder

The Builder pattern [1] is a good choice when designing classes whose constructors have more than a handful of parameters, not only because is less error prone in case of identically typed parameter, but also because it is more readable from the client [2]. For example, instead of instantiating an Application object with its constructor:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Client {
    ...
        Person legalRepresentative = getLegalRepresentative();
        Company beneficiary = getBeneficiary();
        Person notary = getNotary();
        Person localOfficial = getOfficial();
        Company centralOffice = getOffice();

        Application application = new Application(
                legalRepresentative,
                beneficiary,
                notary,
                localOfficial,
                centralOffice);
    ...
}

we could use an ApplicationBuilder or, if the builder is an Application inner class, an Application.Builder as:

My Comments about «The Rise of Test Impact Analysis»

I have red the article The Rise of Test Impact Analysis by Paul Hammant finding it very interesting.

I agree on the fact that developers might feel slowed down when tests execution on the development machine takes too long. Comprehensibly they might tend to not executing tests before commit, relying on tests running later on a continuous integration server. That fact might slowly drift developers off good Agile practices.

The article reports some «conventional strategies to shorten test automation» before describing «Test Impact Analysis». Test Impact Analysis (TIA) is a technique that helps determine which subset of tests execute for a given set of source code changes. The way by which the tests subset is determined starts with a code coverage or instrumentation phase, and finishes building a map which associate, for each entry, a test with the source code methods it will cover during its execution. TIA avoids executing all tests because it enables only the execution of the relevant ones.

I have just attended a Scrum Master course

I have just came back from a three days Scrum Master course taught by Craig Larman.

The teacher told us so many things, and some of his experiences and insights, that is quite impossible reporting all of them in a blog post. However I share with pleasure one of his clarification about the meaning of the Scrum value: commitment.

Testing with the appropriate injection

I added some new functionalities to a Spring-based web application.

After some changes a unit test failed. The cause was a missing bean which stopped the auto-wiring process while Spring was loading the application context.

The test declared its own application contest, by using the annotation @Configuration on a static inner class; there were some mocked beans, so I added the missing bean:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class MyClassTest {

    ...

    @Configuration
    static class ContextConfiguration {

        @Bean
        public MissingBean missingBean() {
            return new MockMissingBean();
        }

        @Bean
        public ThatBean thatBean() {
            return new MockThatBean();
        }

        @Bean
        public ThisBean thisBean() {
            return new MockThisBean();
        }

        ...
    }

}

Then I changed other classes adding other auto-wired beans, new methods, etc., until when the same test that had failed before failed again!

ThoughtWorks Technology Radar in Italian

I have always been enthusiastic about the ThoughtWorks Technology Radar both because of the idea in itself and because of its implementation in the form of radar.

The Technology Radar is a document which gathers substantial changes in IT technologies of interest to various ThoughtWorks teams. The Radar is written by the ThoughtWorks Technology Advisory Board (TAB), made up of senior technologists at ThoughtWorks, which regularly meet themselves to talk about technology trends that significantly impact our industry.

The implementation in the form of radar is characterized by four quadrants: techniques, platforms, tools, languages & framework; and four concentric levels (from outside to inside): hold, assess, trial, adopt. The various moving technologies appear on the Radar as blips: the closer the blip is to the center, the more it is qualified to be of worth by ThoughtWorks.

The ThoughtWorks Radar contents summarise the essence of the TAB meetings, and its format effectively communicate contents to a wide range of stakeholders, from CIOs to developers.

Over the years the Thoughtworks Radar has evolved in the contents, in the graphic layout, and in the distribution in various languages; but it hasn’t been available in Italian yet. Last year, when I discovered that ThoughtWorks has an office in Bologna, the city where I work in, I wrote an email asking if I might have contributed to the Italian translation of the ThoughtWorks Radar. I received a reply from Matteo Vaccari:

Method parameters and TOCTOU

I have always been fascinated by the Design by Contract approach:

Software always had bugs and always will”. Tired of this defeatist attitude? With Design by Contract, invented by Eiffel Software and one of the most widely recognized breakthroughs in the history of software engineering, you can write complex software and not wake up at night fearing that something, somewhere will go wrong. Design by Contract brings science to the construction of correct and robust software.

From this point of view, unfortunately, Java is not Eiffel. Therefore, even if I would have follow this Bertrand Meyer valuable concept, I had to cope with the language itself. I know in the past years some Java frameworks which implement Design by Contract have been proposed, but I have never had the chance to try them seriously. So what I do is simply checking input method parameters.

Functional Programming in Java book review

Last January I was selected from Manning as one of the technical reviewers of the book “Functional Programming in Java” by Pierre-Yves Saumont. In these days the book has been released to the public therefore I can publish this post without violating the reviewer agreement.

The book teaches functional concepts by lots of examples and exercises which develop in the reader both a knowledge background and a natural instinct to functional programming paradigm.

Code Templates For Logging

When I want to log a message, a variable, or an exception I would like to write it quickly. Therefore I’ve created some templates which generate logging instruction based on slf4j.

Netbeans IDE

I have created the following code template:

1
private static final ${LOGGER_TYPE type="org.slf4j.Logger" default="Logger" editable=false} LOGGER = ${LOGGER_FACTORY type="org.slf4j.LoggerFactory" default="LoggerFactory" editable=false}.getLogger(${CLASS editable="false" currClassName}.class);

and I have associated it to the abbreviation log. Than at the cursor:

1
2
3
public class MyClass {
    |
    ...

I type log + TAB and NetBeans expands the text:

1
2
3
4
5
6
7
8
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

...

public class MyClass {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyClass.class);
    ...

I have also defined the shortcuts:

  • logd + TAB
  • logw + TAB
  • logi + TAB
  • loge + TAB

defined as:

  • ${LOGGER_CONST default="LOGGER" editable=false}.debug("${logMessage}");
  • ${LOGGER_CONST default="LOGGER" editable=false}.warn("${logMessage}");
  • ${LOGGER_CONST default="LOGGER" editable=false}.info("${logMessage}");
  • ${LOGGER_CONST default="LOGGER" editable=false}.error("${logMessage}", ex);

which generate:

1
2
3
4
LOGGER.debug("logMessage");
LOGGER.warn("logMessage");
LOGGER.info("logMessage");
LOGGER.error("logMessage", ex);