Server vbnet.cz v těchto dnech pořádá soutěž .NET Challenge 2008, a ačkoliv je můj vztah k Visual Basicu velmi vlažný (a to jsem ještě přehnal :), rozhodl jsem se se svými C# výtvory zúčastnit.
Úkolem prvního kola bylo vytvořit aplikaci pro vyhledávání duplicitních souborů a na můj výtvor se můžete podívat zde (pozor, jsou to zdrojáky, ne exáč).

Z programátorského pohledu jsou na kódu zajímavé 2 věci – algoritmus samotný a pak jeho implementace pomocí návrhového vzoru Strategy.
Použitý algoritmus je velmi efektivní, protože každý soubor zpracovává pouze jednou (v kontrastu s naivní metodou, která by každý soubor porovnávala se všemi ostatními). Základní myšlenkou je, že dva soubory jsou stejné, pokud generují stejný hash (string o nějaké rozumné délce). Aplikace tedy funguje tak, že projde všechny soubory, pro každý spočítá hash, který si někam uloží, a na konci se jen podívá, které soubory vygenerovaly stejnou hodnotu – ty jsou vzájemně duplicitní.
V kódu je tento algoritmus implementován pomocí návrhového vzoru Strategy, což je ona druhá zajímavá věc. Strategy pattern je zhruba o tom, že kód sice definuje nějakou funkčnost, ale určité věci deleguje na jiné objekty. V případě této aplikace metoda findDuplicates() definuje obecný algoritmus pro vyhledávání duplicit (projdi soubory, pro každý spočítej hash a ten si ulož do tabulky), ale detaily generování hashe neimplementuje – to mají na starost třídy jako BinaryComparisonStrategy, CRCComparisonStrategy a podobně. Připadá mi to jako krásný use-case pro tento návrhový vzor.
Pokud se rozhodnete aplikaci kromě zkoumání jejího kódu třeba i používat (no, co kdyby :), neměli byste narazit na vážnější problémy – binární porovnání funguje i pro několika-gigabajtové soubory bez problémů s OutOfMemoryException (což byla vlastnost jedné z vývojových verzí :).
UI samozřejmě není dotažené (a ani není moc dobré – byl to můj první souboj s WPF), ale což, je to spíš ukázková aplikace než cokoliv jiného. Třeba se to někomu bude hodit aspoň jako ukázka reálné implementace návrhového vzoru Strategy.
strategy jak u učebnice, pěkné