Programeri često raspravljaju o dilemi – da li treba pisati kod koji rešava trenutni problem ili praviti opšte rešenje koje će pokriti i buduće potrebe. Pronalaženje balansa između ova dva pristupa ključ je uspešnog razvoja softvera.
Ako se fokusiraš samo na trenutni problem, kod može postati neuredan i teško održiv. S druge strane, prekomerna generalizacija može doneti nepotrebnu složenost. U oba slučaja, postoje rizici koji mogu otežati dalji razvoj i održavanje koda.
Primeri iz stvarnog sveta, kao što su sistemi za kupovinu i iznajmljivanje vozila, pokazuju kako nedostatak balansa između specifičnosti i fleksibilnosti može stvoriti dugoročne probleme.
Jedan od primera je sistem za korpu u online prodavnici. Ako praviš rešenje koje se fokusira samo na trenutni problem, kao što je uklanjanje predmeta iz korpe, kod može postati neefikasan jer će se dodavati sve više specifičnih metoda za različite scenarije. Ovaj pristup može brzo dovesti do neurednog koda koji je teško proširivati i održavati.
Sa druge strane, preterana generičnost može učiniti kod previše složenim. Na primer, sistem koji pokriva sve moguće scenarije uklanjanja predmeta iz korpe može postati noćna mora za korišćenje. U pokušaju da se obuhvati svaki potencijalni slučaj, uvode se eksterni filteri, pravila i povratne funkcije, što dodaje nepotrebnu kompleksnost za jednostavne operacije. Prekomerna generalizacija može uzrokovati mentalni zamor i otežati rad sa kodom.
Rešenje je u pronalaženju balansa. Umesto da praviš previše specifičan ili previše generičan sistem, potrebno je stvoriti fleksibilan i jednostavan kod. Korišćenje uslova koji definišu šta treba ukloniti iz korpe omogućava dovoljno fleksibilnosti bez prekomerne složenosti. Tako, recimo, možeš ukloniti artikle iz korpe po različitim kriterijumima, bez potrebe za dodatnim metodama i komplikacijama.
Sličan problem se javlja u sistemima za iznajmljivanje vozila. Ako pokušavaš da predvidiš buduće potrebe i kreiraš apstrakciju koja pokriva i vozila koja kompanija trenutno ne iznajmljuje, kao što su čamci ili avioni, možeš završiti sa lošim dizajnom. Na primer, kada kompanija odluči da iznajmljuje bicikle, naići ćeš na problem jer bicikli nemaju motor, dok tvoja apstrakcija predviđa pokretanje i gašenje motora. Loša apstrakcija stvara rigidnost i otežava prilagođavanje novim zahtevima.
Bolje rešenje je koristiti interfejse koji omogućavaju različitim vrstama vozila da implementiraju samo one funkcionalnosti koje su im potrebne. Na primer, bicikli ne moraju imati metode za pokretanje motora, dok električni skuteri mogu imati opciju za punjenje baterije. Pravilna apstrakcija pruža fleksibilnost bez suvišne komplikacije.
Zaključak je jasan – ne treba preterano generalizovati kod, već treba naći balans između trenutnih potreba i mogućnosti za buduće proširenje. U suprotnom, kod postaje težak za održavanje i prilagođavanje, što može dovesti do potrebe za velikim refaktorisanjem.
Dok dizajniraš module, zapitaj se: kako mogu da napravim fleksibilno rešenje, a da ne preteram?