úterý 8. července 2008

Hledáme inspiraci v dynamických jazycích

Dlouhou dobu jsem, a teď použiju možná silné slovo, opovrhoval dynamickými jazyky jako je Groovy či Ruby. Postupem času mi v nich ovšem, některé věci přijdou kouzelné. Část jejich oblíbenosti určitě vychází z toho jak je výsledný kód čitelný. Můžete namítnout, že to je dané jejich syntaxí, kterou budeme v Javě těžko měnit, ale ono to není jenom tou syntaxí. V těchto jazycích se totiž vytváří častěji API, které nese označení FluentInterface.

Martin Fowler rozdíl mezi klasickým a fluent (plynulým, tekoucím) API ukazuje na následujícím příkladu.

    private void makeNormal(Customer customer) {
        Order o1 = new Order();
        customer.addOrder(o1);
        OrderLine line1 = new OrderLine(6, Product.find("TAL"));
        o1.addLine(line1);
        OrderLine line2 = new OrderLine(5, Product.find("HPK"));
        o1.addLine(line2);
        OrderLine line3 = new OrderLine(3, Product.find("LGV"));
        o1.addLine(line3);
        line2.setSkippable(true);
        o1.setRush(true);
    }
    private void makeFluent(Customer customer) {
        customer.newOrder()
                .with(6"TAL")
                .with(5"HPK").skippable()
                .with(3"LGV")
                .priorityRush();
    }

Líbí se mi na tom, že se nikde neopakuje kontext, ten je daný uspořádáním - tokem kódu. Kód je tak pěkně odizolován od zbytečného smetí. Pak platí myslím význam fráze "samokomentující se kód". Na druhou stranu, jak píše Fowler, boří se některé zažité idiomy např. setter bez návratové hodnoty.

K tomu, abychom vytvářeli API tímto způsobem, nepotřebujeme dynamické jazyky. Při troše šikovnosti a vhodného návrhového vzoru (Method Chaining) to dokážeme i v Jave.

FluentInterface je pro mě způsob jak přemýšlet o návrhu API, tak aby dávalo smysl a bylo čitelné, když jej člověk používá anebo čte jeho použití. Asi určitě se nehodí úplně všude, ale minimálně pro doménový model aplikace se o něm sluší přemýšlet.