Archive for January, 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

Avancerad flödeskontroll med rollback

Att styra programflödet är inte alltid lätt. De flesta är väl överens om att det är jättedåligt att använda exceptions för att styra flödet, men författaren av denna snutt håller nog inte med, och har dessutom tagit nästa steg genom att styra med serverns context och status på rollbacken: 

try {
    // ... Hundratals rader kod
} catch (ThingException pe) {
    logger.info("Could not create customer for this thing with thing_id: " + thing.getThingId() + ", " + pe.getMessage());
    noOfImportedInvalidThings++;
    if (ctx.getRollbackOnly()) {
        throw new BatchJobException("Transaction was rolled back in sub routine for thing_id: " + thing.getThingId(), pe);
    }
}

Har bytt ut några variabelnamn för att skydda den skyldige. “ThingException” och “thing” heter något annat i verkligneten.

No Comments

Varför ingenting har hänt på ett tag

Jag har inte skrivit på bloggen på ett tag. Detta av två anledningar:
1) Jul och en del förändringar i privatlivet
2) Funderar på att höja kvaliteten på bloggen genom att byta motor (den har man hört några gånger), men framför allt skriva färre, men bättre inlägg. Eller kanske blanda lite genom att ha en “blogg” och en artikelkategori. Vi får se.

Jaja. Vill inte att bloggen ska dö, så jag lägger ut en liten WTF i nästa inlägg i alla fall.

No Comments