Jedna taková příhoda z praxe: Příbližně před rokem jsem si začal dělat takový jednoduchý interpret assembleru pro Intel 8051. Lexikální analyzátor vygenerovaný pomocí flexu, parser pomocí bisonu, zbytek v C99 a jednotlivé interpretační funkce byly přímo volány z parseru. Zhruba za 3 měsíce bylo hotovo.
Před půl rokem jsem k tomu začal dělat rozšíření - kompilátor. Lexikální analyzátor, parser a pomocné funkce zůstaly skoro beze změn. Zato systém volání interpretačních/kompilačních funkcí se výrazně změnil. Místo přímého volání parser dostal strukturu, ve které je seznam funkcí interpretu/kompilátoru. Tedy v podstatě rozhraní "třídy" (stále v C99), hlavním důvodem byla možnost mít kompilátor i interpret v jednom programu a výběr se provede podle parametrů z příkazové řádky. Dál jsem udělal úklid kódu sdíleného mezi interpretem i kompilátorem, takže všechno, co kompilátor nepotřeboval, jsem přesunul mezi zdrojáky interpretu, kam to skutečně patří. Opět za nějaké 2 měsíce hotovo.
A teď dělám další rozšíření - emulátor. Z původního kódu toho příliš nezbyde, protože všechno postupně přepíšu do C++. Paměťový systém už je hotový a oproti předchozím dvěma verzím očesaný na nutné minimum (přímý a nepřímý bytový zápis a čtení a bitový zápis a čtení). Práci se zásobníkem a překlady bitových adres mezi vnitřní reprezentací Intel 8051 a dvojicí indexů byte-bit budou provádět statické metody abstraktního rodiče interpretu a kompilátoru. Samotný emulátor pak bude jen disassembler propojený s původním interpretem.
Řeším sice tři skoro stejné úlohy, ale navzájem se liší strukturou řešení. Teprve potřeba stávající program rozšířit o nové funkce člověka donutí uklidit starý kód, aby vůbec bylo možné ten nový svinčík přidat. Co bych ale opravdu nikdy nechtěl dělat, je měnit strukturu programu, který byl z větší části vygenerován podle nějaké grafické reprezentace tříd.