„Berličkařit” nebo „podepřít berličkami” — znamená vytvořit dočasné řešení problému, které uzavírá chybu nebo přidává funkcionalitu, ale neodstraňuje hlavní příčinu a neodpovídá architektonickým standardům projektu. Berličky jsou nevyhnutelné v každém vývoji: termíny, neúplné pochopení systému a vnější omezení nutí k přijímání kompromisních rozhodnutí. Podle Refactoring Guru je klíčový rozdíl mezi pragmatickou berličkou a technickým dluhem — ve vědomí rozhodnutí a existenci plánu na její odstranění. Správné používání dočasných řešení vyžaduje disciplínu a dokumentování.
Hlavní body
Berlička (crutch) — softwarové řešení, které funguje, ale je vytvořeno „narychlo”: uzavírá konkrétní problém, ale neodstraňuje jeho příčinu, nedrží se architektury projektu a může se rozbít při sebemenších změnách prostředí. Metafora je přesná — jako skutečná berlička, takový kód pomáhá „jít”, ale neléčí „nohu”.
Vývojáři „podpírají berličkami” chyby, nekompatibility verzí, vlastnosti platformy a naléhavé požadavky klienta. Typická berlička — berlička-podmínka: pokud iOS 15, přidej mezeru; pokud Huawei — skryj tlačítko. Takové kontroly se množí a mění kód na „vrstvený dort” z platforem a verzí větvení.
Berličky mohou být různého rozsahu: od jednoho řádku s berličkou-podmínkou až po celý modul-prostředník, který „opravuje” chování knihovny. Je důležité pochopit, že berlička není vždy zlo: ve správných rukou je to nástroj, který umožňuje vydat produkt včas. Problém začíná, když berlička zůstane v kódu navždy.
Hlavní příčinou vzniku berliček je konflikt mezi ideálním řešením a skutečnými omezeními projektu. Vývojář ví, jak to udělat správně, ale čas, peníze nebo technická omezení to neumožňují. Výsledkem je kompromisní řešení, které „prostě funguje”.
Podívejme se na čtyři hlavní příčiny, proč vývojáři vědomě sahají po berličkách. Pochopení těchto příčin pomáhá pohlížet na berličky ne jako na chybu, ale jako na pragmatický nástroj, který vyžaduje řízení.
Nejčastější příčina. Vydání je zítra, chyba se reprodukuje pouze na konkrétním modelu, architektonická oprava trvá dva týdny. Berlička-podmínka trvá hodinu a uzavírá problém. Po vydání tým slibuje, že se vrátí a přepíše to správně. „Nic není stálejšího než dočasné" — právě o takových berličkách.
Knihovna A vyžaduje Android 12, ale vaše aplikace podporuje Android 10. Řešení — napsat prostřední vrstvu, která kontroluje verzi OS a vybírá cestu provádění. To je berlička, protože při aktualizaci knihovny bude nutné prostřední vrstvu přepsat. Ale alternativa — opuštění knihovny nebo podpory starých zařízení — může být horší.
// Berlička pro kompatibilitu s API 29
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
useModernApi()
} else {
useLegacyFallback()
}
Knihovna, na které projekt závisí, obsahuje chybu, ale její aktualizace může trvat týdny (je potřeba PR, code review, publikace). Místo čekání tým píše wrapper, který opravuje chování knihovny za běhu. Po vydání opravené verze knihovny je wrapper odstraněn. Pokud není odstraněn — to je již architektonický problém.
Nový vývojář v legacy projektu nechápe, proč kód funguje právě tak. Místo aby to zjistil, přidává novou podmínku na stávající. To je nejnebezpečnější typ berličky, protože autor si neuvědomuje, že je to berlička. Jediný lék — code review a párové programování pro nové členy týmu.
Ne každá berlička je zlo. V reálném vývoji je absolutní čistota kódu nedosažitelná a často neúčelná. Pragmatický přístup uznává, že dočasná řešení jsou součástí procesu, ale vyžaduje jejich vědomí, dokumentování a plánování odstranění. Berlička je oprávněná, když řeší obchodní úkol rychleji než čisté architektonické řešení.
Kritéria oprávněné berličky: uzavírá konkrétní problém, má vlastníka (kdo je odpovědný za její odstranění) a existuje plán refaktorování. Pokud alespoň jedna ze tří podmínek není splněna — berlička se mění v technický dluh. Nástroje jako TODO-komentáře s ticketem v trackeru — minimální způsob dokumentování.
Kritická chyba ve vydané větvi, kterou je třeba uzavřít do zítřejšího nasazení. Čisté řešení vyžaduje refaktorování architektury a bude trvat dva týdny. Berlička — přidat kontrolu na nil a odeslat opravu jako hotfix. Podmínky oprávněnosti: v trackeru byl vytvořen ticket na refaktorování, určena odpovědná osoba, berlička označena komentářem. Za dva týdny se tým vrací k úkolu.
// TODO: IT-1234 — odstraňte tuto berličku po refaktorování AuthService
guard let userId = session.user?.id else {
return Result.failure(.notAuthenticated)
}
Hranice mezi vědomou berličkou a architektonickým problémem (technickým dluhem) prochází dvěma parametry: vědomí rozhodnutí a existence plánu na odstranění. Berlička je vždy dočasné řešení se známou životností. Technický dluh — důsledek mnoha berliček ponechaných bez pozornosti.
| Parametr | Vědomá berlička | Technický dluh |
|---|---|---|
| Vědomí | Tým ví, že je to dočasné řešení | Nikdo si nepamatuje, proč je kód takový |
| Dokumentace | Je TODO, ticket v trackeru | Žádné komentáře, odkazy, popis |
| Plán odstranění | Určen sprint pro refaktorování | „Jednou to přepíšeme” |
| Dopad | Lokální, nebrání nové funkcionalitě | Blokuje změny, zpomaluje vývoj |
Situace se zhoršuje, když počet berliček překročí kritickou hmotu. Každá nová berlička zvyšuje „křehkost” systému: změna na jednom místě rozbije jiné. Výsledkem je zpomalení vývoje, množení chyb a nový vývojář nerozumí kódu bez pomoci autora. V tomto okamžiku berličky přestávají být dočasnými řešeními a stávají se architektonickým problémem.
Pokud je v kódu pět vnořených kontrol na verzi OS, výrobce zařízení a přítomnost konkrétní knihovny — to není berlička, to je architektonický problém. Pokud přidání jedné opravy způsobí tři regrese v sousedních modulech — berličky přestaly být lokální. Pokud je code review pravidelně zamítáno kvůli „další berličce” — je načase plánovat refaktorování.
Refaktorování berliček — proces nahrazování dočasných řešení architektonicky správnými. To vyžaduje čas, proto je potřeba strategie prioritizace: ne všechny berličky je třeba okamžitě odstranit. Dobrá strategie — hodnotit každou berličku podle dvou parametrů: četnost změn v této oblasti kódu a dopad na uživatele.
Vysoká priorita — berličky v často měněných modulech (obchodní logika, UI obecného určení), které zpomalují vývoj a způsobují regrese. Střední priorita — berličky ve zřídka měněných modulech, ale s potenciálním dopadem na uživatele (zpracování plateb, autorizace). Nízká priorita — berličky v legacy kódu, který stabilně funguje a není plánován k úpravě.
Krok 1: inventarizace — najděte všechny TODO a FIXME související s berličkami. Krok 2: posouzení — určete, které jsou stále aktuální. Krok 3: plánování — přiřaďte refaktorování berliček do sprintu, počínaje vysokou prioritou. Krok 4: nahrazení — implementujte čisté řešení, odstraňte berličku a její TODO-komentář. Krok 5: verifikace — ujistěte se, že testy procházejí a nejsou žádné regrese.
# Najděte všechny TODO-berličky v projektu
grep -r "TODO\|FIXME\|HACK\|XXX" --include="*.kt" --include="*.swift" .
Nejlepší způsob boje s berličkami je nevytvářet je bez potřeby. Než napíšete berličku, položte si tři otázky: lze udělat čisté řešení v rozumném čase? Existuje alternativa, která není berličkou? Bude mít tým čas vrátit se a přepsat to? Pokud je alespoň na jednu otázku odpověď „ne” — zamyslete se znovu, než „podepřete” kód.
Často kladené otázky
Berličkařit — napsat dočasné řešení, které uzavírá problém, ale neodstraňuje jeho příčinu. Kód funguje, ale neodpovídá architektuře projektu a může se rozbít při změnách.
Berlička — vědomé dočasné řešení s plánem odstranění. Technický dluh — důsledek mnoha zapomenutých berliček. Berlička je lokální, dluh systémový a blokuje vývoj.
Když je termín kritický, čisté řešení vyžaduje čas a berlička je zdokumentována TODO-komentářem a ticketem v trackeru. Podmínka: berlička má plán odstranění v dohledné době.
Přidejte TODO nebo FIXME s číslem ticketu a stručným popisem správného řešení. Příklad: // TODO: IT-567 — přepsat pomocí Factory pattern. Bez ticketu bude berlička zapomenuta.
Proveďte inventarizaci všech TODO, ohodnoťte prioritu, začněte od často měněných modulů. Nahraďte berličku čistým řešením, odstraňte komentář a zkontrolujte testy.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také