TOMÁŠ HUBÁLEK BLOG: BAVTE SE PŘIMĚŘENĚ…

Množící se parametry metod (Change Method Signature Hell)

Written By: Tomáš Hubálek - Aug• 04•04

V aplikaci, na které teď pracuju, se mi teď začaly množit parametry filtračních metod (metoda typu vraťMiZbožíNaZákladěPodmínek(filter1, filter2, …)). Jak se návrh aplikace mění, postupně filtrů a upřesňujících podmínek přibývá.

Z počátku se to dalo vydržet, hlavně díky funkci Eclipse, která se jmenuje Change Method Signature a přidání parametrů bylo naprosto v pohodě 🙂 Bohužel jsem se nechal zlákat a z dobrého sluhy se stal špatný pán, protože teď mají metody celkem dost parametrů, je tam hodně přetížených metod a přehlednost kódu prudce klesá…

Joshua Bloch v knížce Effective java píše o tom, že ve správně navrženém API by metoda měla mít rozumný počet parametrů (tak do pěti, spíše pak 3) a má naprostou pravdu.

Já jsem díky lákavé funkci Change Method Signature přidával parametry, až se stalo že některá metoda měla třeba i deset parametrům, existovalo k ní několik přetížených metod a i tak se volala se spoustou nullů.

Řešení je opět v Blochovi a říká že bychom měli přemýšlet nad tím jak parametry zaobalit do nějaké třídy.

Takže metodu

/** Vrací seznam zboží na základě parametrů */
public Collection vraťSeznamZboží(
String maskaKódu,
int SkupinaID,
int cenaOd,
int cenaDo,
boolean vynechejAkčníZboží,
UživatelInfo uživatel) {
...
}

můžeme nahradit takto

/** Vrací seznam zboží na základě parametrů */
public Collection vraťSeznamZboží(
Omezení omezení, UživatelInfo uživatel) {
...
}

a mnohé se zjednoduší. Rozhodně ubyde přetížených metod a omezení můžeme logicky sdružovat.

Teď k implementaci třídy (nebo lépe interfacu a třídy, ale pro jednoduchost budu implementovat třídu) Omezení.

public class Omezení {
public Omezení odDo(String property, int od, int do) { ... }
public Omezení hodnota(String property, Object hodnota) { ... }
public Omezení maska(String property, String maska) { ... }
....
}

Omezení se pak dá vytvořit např. takto:

Omezení omezení = new Omezení()
.odDo("cena", 0, 20)
.maska("kodZbozi", "A%");
 

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

Leave a Reply

Your email address will not be published. Required fields are marked *