Jak už nadpis říká, podařil se mi v Kotlinu napsat docela slušný blok kódu 😀 . Logika: Představte si, že chcete z chatu načíst nové vzkazy. Věci se však mají tak, že nejdříve načtete, kolik je nových vzkazů, kde odpověď může být null. Pak jen ověříme, že tento počet je více jak 0 a můžeme se do toho pustit. Dříve, než vůbec začneme, pingneme stránku vzkazů, abychom serveru řekli, že už jsou přečtené (anebo to bych asi měl udělat, až je skutečně přečtu, což? 🙂 – opraví se) a pak: zjistíme seznam všech uživatelů, od kterých nám kdy vzkazy přišly (odpověď může být null), pro každé jejich ID načteme seznam vzkazů (včetně našich odpovědí a opět to může být null), odstraníme všechny nully a všechny listy zpráv splaskneme do jediného, odstraníme ty, co jsme poslali my sami, setřídíme je od nejmladšího a z toho celého si vezmeme pouze oněch N nových. Tak, to bychom měli. A nyní už zbýva ověřít, jestli UID zdrojového uživatele není null, a pokud není, tak si ho načteme z keše a pokud ani on není null, tak můžeme směle odeslat IRC klientovi zprávu, že mu přišel vzkaz. No není to paráda? 😀
Kamo … musim ti to rict… NENI TO PARADA. Ani nahodou. Neslysel jsi nekdy poucku (resp. cetl jsi “Code complete”?) – kazda metoda co ma vic jak 20 radku je podezrela! Na tohle to chtelo nejaky trochu objektovy refaktoring. Protoze je desne “cool” ze to jde. Ale ve vysledku jsi svoji paradou stvoril spaghetti code. Jen to porovnej s nejakou spagetou se kterou jsi se v praxi setkal. Nema to do ni daleko. Ma to mozna null-checky a podobne vychytavky ale nakonec je to spaghetti code…
Osobne bych navrhoval nejaky MessageDispatcher a od toho zacit. Protoze toto neeeeee! To ze neco “jde” neznamena, ze je to spravne
Aktuální verze se trochu rozrostla :-))
Ale jo, možná by se to dalo ještě refactorovat, např. celá tato část:
service.getStoredMessagesUsers()
?.asSequence()
?.map { it.uid }
?.map { service.getStoredMessages(it)?.storedMessages }
?.filterNotNull()
?.flatten()
?.filter { !it.fromYourself }
by se mohla schovat pod service.getAllStoredMessages() … to je fakt, ale s těmi null-checky bys měl pořád mnohem méně boilerplatu a to je oč tu kráčí :-). I když i tohle by se dalo udělat jinak, aby tam nemusel být všude ten otazník, kdybych udělal null-check přes if nebo pomocí ?.let { } hned na tom prvním service.getStoredMessagesUsers(). Takže vlastně bych tam těch null-checků ani tolik mít nemusel, kolik jich tam mám teď :-D. Nonic, jdu to opravit … :-))
Jak tak nad tím přemýšlím, tak když u těch servisních metod vrátím emptyList() namísto potenciálního nullu, tak se těch null-checků zbavím úplně :-). A měl jsi pravdu, šlo to udělat mnohem lépe. Takže co na to říkate nyní, šerife? Já myslím, že teď už je to vskutku mega-čitelnější :-D.
Jo to je uplne jina pisnicka najednou. Myslim ze funkcionalni pristup se vzdalene podoba skriptovani kdy to tak trochu “valis jedno na druhe” a je to takove “write once, read-never” programovani.
Myslim, ze je dobre nezapominat na OOP 🙂