A co v případě, že už mám funkce na získání potřebných dat k dispozici (např. pokud tvořím modul) a potřebuji pouze různá data vzít, poskládat a vrátit výsledek? Mám si je skládat po 20 ti řádcích na funkci do jednoho public array, nebo si mám data rozdělit do několika arrays, ty potom sloučit a vrátit, nebo si mám array naskládat v jednom řádku s délkou několik set až tisíc znaků a s použitím zkrácených ifů, nebo si mám znovu napsat již existující systémové funkce nějak jinak, nebo si mám udělat jednu funkci getDataParts, která bude mít sice třeba 100 řádků a na konci return, ale hlavní funkce getData už bude mít "jenom" $cosi=getDataParts a return, nebo rovnou udělat jednu 100 řádkovou funkci s jedním returnem?
Dlouhé řádky ti nepomohou, když máš soft limit na 65 znacích jako já :-)
Základem je kvalitní dekompozice aplikace. Určitě nemáš sekvenci 200 příkazů, které by nebyly nějak grupovány do podmíněných bloků či cyklů. Vnořené cykly jsou nejviditelnějšími objekty pro refaktorování. Nebývá mnoho důvodů dva vnořené cykly nechávat v jedné funkci.
Stejně tak vnořené switche, tolik typické pro konečné automaty, se dají logicky rozdělit do dvou vrstev, kdy vrchní vrstva podle hodnoty stavu volá funkci druhé vrstvy a předá jí vstupní symbol. Druhá vrstva ten symbol zpracuje a do první vrstvy vrátí returnem hodnotu nového stavu. Každý stav tak má svoji vlastní funkci. Úplně stejně jak máš ten automat rozkreslený na papíře.
Konečný automat se skutečně dá efektně i efektivně řešit na nějaké datové struktuře - nejlépe na kolekci objektů. A není to pomalé - zkus si to změřit. Dokonce to bývá rychlejší než vnořené switche, zejména u nenumerických klíčů. Místo sekvenčního porovnávání jednotlivých case se totiž používá vektor pointerů.
Pokud tedy budeš refaktorovat funkci o 200 řádcích, určitě to nedělej horizontálně, ale vertikálně. Klidně i do tří nebo více vrstev. Každý vnořený scope je kandidátem na nižší vrstvu. Dokonce i dvacetiřádkové funkce se dají rozvrstvit až na jednotlivé řádky, ale v rámci zachování zdravého rozumu je dobré se zastavit právě u těch 5-20 řádků, které by se už dále členit moc neměly, protože pak už se čitelnost nezvyšuje, ale opět snižuje.
Nemusíš se bát, že se tím program nějak zpomalí. Když se podíváš pod pokličku dnešních kompilátorů, tak zjistíš, že jejich optimalizátory často rozbalují volání drobných funkcí tak, jako kdyby to byla makra. Typicky gettery/settery nahrazují přímým přístupem k proměnné, přístupová práva řeší už v době překladu.