Category Archives: Uncategorized

List nebo Iterable?

Dnes budu psát o jedné prkotině, kterou jsme včera řešili s jedním kolegou. Zajímal by mě váš názor na to. Je to opravdu jednoduché. Představte si, že máte následující metodu:

public List<Data> processData(List<Data> data) {
	List<Data> result = new ArrayList<Data>();
	for (Data d:data)
	{
		//do something
	}
	return result;
}

Jak vidíte dostane na vstupu nějaký seznam, ten proiteruje a na základě vstupních dat vrátí nějaký výsledek. Otázka je, jaký typ zvolit pro parametr a potažmo i návratovou hodnotu. Pokud je tato metoda použita na jednom místě není moc co řešit. V našem případě ji ale chceme mít ve veřejném rozhraní. Ba co víc, my počítáme s tím, že programátoři budou vytvářet její různé implementace. Pak už je na místě se pořádně zamyslet. Máme několik možností. Můžeme použít List jako v předchozím případě. Mě by se ale mnohem více líbilo použít Iterable. Samozřejmě můžeme jít zlatou střední cestou a použít Collection.

public Collection<Data> processData(Iterable<Data> data) {
	List<Data> result = new ArrayList<Data>();
	for (Data d:data)
	{
		//do something
	}
	return result;
}

Jaká je ale ta správná volba? Všechno má své pro i proti. Když použiji Iterable, dávám tím jasně najevo, že se argument nechystám nijak měnit, že přes něj chci jenom iterovat. Do metody mohu nacpat jakoukoliv kolekci. Navíc mi to otvírá cestu k tomu, abych použil návrhový vzor Iterator a třeba za pomocí commons-collections nebo Google collections si vstup filtroval. Na druhou stranu mi to může zkomplikovat budoucí implementaci metody. Třeba někdo, kdo bude metodu implementovat, bude chtít zavolat metodu size(). Nebo bude chtít zjistit jestli kolekce obsahuje nějaký prvek. Tím, že v signatuře metody použiji Iterable ho o tuto možnost připravím. Práce s iterátorem je navíc dost nepohodlná.

Když použiji List, tak nebude na první pohled jasné, jestli metoda nebude například do seznamu něco přidávat. Nebude to jasné ani volajícímu, ani implementátorovi. Navíc když budu chtít metodu volat například se Setem, budu ho muset překopírovat do Listu. Já vím, je to na jeden řádek, ale znepřehlední to kód.

Zlatá střední cesta je pravděpodobně nejlepší. Když použiji Collection, zajistím dostatečný komfort jak pro volajícího tak pro implementátora. Sice pořád nebude jasné jestli může být kolekce metodou změněna, ale s tím se asi budeme muset smířit. Navíc nebudeme moci použít vzor Iterator, ale vzhledem k tomu, že ho nikdo beztak nezná, to nebude tak velká škoda.

Zase se dostáváme ke kompromisu, jako všude jinde v programování. Musíme hledat kompromis mezi komfortem a bezpečností, mezi čistotou návrhu a výkonem a nebo jako já, mezi čistotou návrhu a komfortem. V tomto případě je to opravdu jenom prkotina, ale kdo ví, třeba se z ní časem může vyklubat ošklivý problém. A to bohužel ať už zvolíme jakoukoliv variantu.

MvnIndex.org launched

Every good work of software starts by scratching a developer’s personal itch.

I have not written anything to the blog for quite a long time. The reason is simple. I did not have time. The main reason was not my job hunting as you would suspect but my hobby project MvnIndex. It is just another attempt to make Maven more user friendly.

I have written indexer of central repository, implemented small and simple on-line search engine and what is the most important, I wrote simple Eclipse plugin that helps me with writing POMs. Now I think it is stable enough to make it public. (By saying that it is stable enough I do not mean that it is stable:-).

I would appreciate some feedback. I’d like to know what do you think about it. Whether you think that it is useful and if so, what should be done in the next step. Do not hesitate and write it to my JIRA.

Be aware that it is just the very first version, there is some stuff that has to be done to make it completely production ready. Eclipse plugin lacks ability to use customer provided index files to be able to work with inhouse artifacts. Automatic update of data would be also nice. I am planning to implement it in the next iteration.

I am looking for a job

This entry is not about Java. It is personal. Currently I am looking for a new job and I think that blog could be a good way how to find some contacts. Of course that as Java programmer I have no problem to find a decent job. But I have two problematic conditions. First of all I’d like to see Agile development. I have read lot of books about it, I think that it is the only way how to do software. But I have never seen it. Secondly, I want to go abroad for few months. Preferably to London or Geneva. Since I have no contacts there, it is not so easy to find a job there.
So, if you know about someone who is looking for really good Java developer for an Agile project in London, could you send me an email (lukas{at}krecan.net) with contact please? My CV is available here.