Archive for January 19th, 2010

Design by similarity

Jag blir så glad när ens kloka kolleger i branschen kommer på så tunga saker som nya designprinciper. Det är inte ofta!

I koden nedanför illustreras hur Struts har använts som språngbräda för att skapa en helt nytt sätt att designa interna interface på, nämligen design by similarity.

 För att problemet ska bli uppenbart måste dock sägas att íngen av metodernadisplayCustomerFormprocessNewCustomerprocessExistingCustomer eller searchSsnnågonsin använder parametrarna mappingrequest och actionForward. Författaren tyckte dock att koden blev bättre om alla metoder “såg typ lika ut”, fastän de gör helt olika saker. Eller så var han kanske en ny överlagring på spåren…

 Metoden nedan innehåller också några andra bonusar för oss som gillar WTFs :)

 public ActionForward executeAction(ActionMapping mapping, ActionForm form, HttpServletRequest request,
        HttpServletResponse response, TransferObject to) throws Exception {

    if (customerForm.getOperationFlag().equals("1")) {
        actionForward = displayCustomerForm(customerForm, mapping, request, session, messages);
    } else if (customerForm.getSelectedAction() != null
        && customerForm.getSelectedAction().equals("join_us")) {
        actionForward = processNewCustomer(customerForm, mapping, request, session, messages, actionForward);
    } else if (customerForm.getSelectedAction() != null
        && customerForm.getSelectedAction().equals("already_joined")) {
        actionForward = processExistingCustomer(customerForm, mapping, request, actionForward, messages);
    } else if (customerForm.getSelectedAction() != null
        && customerForm.getSelectedAction().equals("findBySsn")) {
        actionForward = searchSsn(customerForm, mapping, request, actionForward, messages);
    } else {
        customerForm.setSelectedAction("join_us");
        customerForm.setDisplayMandateApprovedByPlayer(true);
        customerForm.setMandateApprovedByPlayer(true);
    }
    saveMessages(request, messages);
    return actionForward;
}

No Comments

Låt inte Lasse Koskela lära er allt ni vet om test doubles

Jag är en varm förespråkare av boken Test Driven: TDD and Acceptance TDD for Java Developers. Det är en otroligt bra bok, och när jag läste den för första gången, innehöll den precis det jag behövde. Den var också min primära källa för EasyMock, och det är också därför jag nu måste lämna en liten brasklapp.

Boken är bra på att lära ut EasyMock, men den gör inte till 100% rätt. Lasse missar avsiktligt eller med mening att betona skillnaden mellan förväntade returns och stubs, och visar inte att man kan skippa verify i vissa fall.

Detta leder till en mockningsstil som ger väldigt sköra (brittle) tester, om man inte fördjupar sig i EasyMock och användning av test doubles på annat håll. Det kan kanske låta självklart, men i mitt fall lyckades jag tillverka ett 150-tal dåliga test av bara farten.

No Comments