Recepti za čist kod
Često softverski inženjeri i arhitekte rade sa velikim, kompleksnim bazama koda koje treba da skaliraju i održavaju. U ovom priručniku, autor Maksimilijano Kontijeri vas vodi dalje od koncepta čistog koda pokazujući vam kako da identifikujete mogućnosti za poboljšanje i njihov uticaj na produkcijski kod. Kada je reč o pouzdanosti i evoluciji sistema, ove tehnike pružaju prednosti koje se isplate vremenom.
Koristeći stvarne primere u JavaScript-u, PHP-u, Javi, Pythonu i mnogim drugim programskim jezicima, ovaj priručnik pruža proverene recepte koji vam pomažu da skalirate i održavate velike sisteme. Svaki odeljak pokriva osnovne koncepte uključujući čitljivost, spregu, testabilnost i proširivost, kao i mirise koda - simptome problema koji zahtevaju posebnu pažnju - i recepte za rešavanje istih.
Kako napredujete kroz ovu knjigu, recepti za refaktorisanje i raznovrsnost mirisa koda rastu u složenosti. Vi ćete:
Razumeti prednosti čistog koda i naučiti kako da detektujete mirise koda
Naučiti tehniku refaktorisanja korak po korak
Dobiti ilustrativne primere koda u nekoliko savremenih programskih jezika
Dobiti sveobuhvatan katalog uobičajenih mirisa koda, njihovih uticaja i mogućih rešenja
Koristiti kod koji je direktan, favorizujući čitljivost i učenje
Iz predgovora
Kod je svuda, od razvoja veb aplikacija do pametnih ugovora, ugradnih sistema, blokčejnova, softverskog sistema na brodu teleskopa Džejms Veb, hirurških robota i mnogih drugih domena. Softver efektivno preuzima svet, i trenutno smo svedoci uspona profesionalnih alata za generisanje koda veštačkom inteligencijom. To znači da je čist kod važniji nego ikada. Dok nastavljate da radite na sve većim privatnim ili otvorenim kod bazama, čist kod je način da ih održite svežim i spremnim za evoluciju.
Kome je knjiga namenjena
Ova knjiga vam pomaže da identifikujete uobičajene probleme u kodu i ističe posledice tih problema. Konačno vam pomaže da ih izbegnete uz recepte koji se lako prate. To je dragocen resurs koji može u velikoj meri pomoći programerima, recenzentima koda, arhitektama i studentima u unapređivanju njihovih veština kodiranja i postojećih sistema.
Šta vam je potrebno da biste koristili ovu knjigu
Da biste pokrenuli primere koda, potrebno vam je radno okruženje poput O'Reilly sandbox-a ili Replita. Podstičem vas da prevedete primere koda u vaš omiljeni programski jezik. Danas to možete uraditi besplatno uz generatore koda veštačkom inteligencijom. Koristio sam alate kao što su GitHub Copilot, OpenAI Codex, Bard, ChatGPT i mnoge druge da bih napisao primere koda za ovu knjigu. Korišćenje ovih alata omogućilo mi je da koristim više od 25 različitih jezika u ovoj knjizi iako nisam ekspert za mnoge od njih.
O autoru
Maksimilijano Kontijeri radi u softverskoj industriji već 25 godina i istovremeno predaje na univerzitetu. Već tri godine piše o čistom kodu, refaktorisanju i mirisima koda, pišući par članaka nedeljno na mnogim popularnim blog platformama. On je fan deklarativnog i bihevioralnog koda i oslanja se na softverske osnove za izgradnju elegantnih i robustnih rešenja.
Sadržaj
Predgovor
Uvod
1. Čist kod
1.1 Šta je miris koda?
1.2 Šta je refaktorisanje?
1.3 Šta je recept?
1.4 Zašto čist kod?
1.5 Čitljivost, performanse ili i jedno i drugo
1.6 Tipovi softvera
1.7 Mašinski generisan kod
1.8 Razmatranje o imenovanjima u knjizi
1.9 Obrasci dizajna
1.10 Paradigme programskih jezika
1.11 Objekti naspram klasa
1.12 Prilagodljivost
2. Uspostavljanje aksioma
2.0 Uvod
2.1 Zašto je to model?
2.2 Zašto je apstraktan?
2.3 Zašto je programabilan?
2.4 Zašto je delimičan?
2.5 Zašto je objašnjavajući?
2.6 Zašto je to povezano sa stvarnošću?
2.7 Zaključivanje pravila
2.8 Jedini pravi princip dizajniranja softvera
3. Anemični modeli
3.0 Uvod
3.1 Pretvaranje anemičnih objekata u bogate objekte
3.2 Prepoznavanje suštine vaših objekata
3.3 Uklanjanje metoda za postavljanje iz objekata
3.4 Uklanjanje anemičnih generatora koda
3.5 Uklanjanje automatskih svojstava
3.6 Uklanjanje objekata za prenos podataka
3.7 Kompletiranje praznih konstruktora
3.8 Uklanjanje metoda za dohvatanje
3.9 Sprečavanje raskalašnog ponašanja objekata
3.10 Uklanjanje dinamičkih svojstava
4. Primitivna opsesija
4.0 Uvod
4.1 Kreiranje malih objekata
4.2 Konkretizovanje primitivnih podataka
4.3 Konkretizovanje asocijativnih nizova
4.4 Uklanjanje zloupotreba niske
4.5 Konkretizovanje vremenskih oznaka
4.6 Konkretizovanje podskupova kao objekata
4.7 Konkretizovanje ispravnosti niske
4.8 Uklanjanje nepotrebnih svojstava
4.9 Kreiranje vremenskih intervala
5. Promenljivost
5.0 Uvod
5.1 Menjanje promenljive u konstantu
5.2 Deklarisanje promenljive kao promenljive
5.3 Zabrana promena u suštini
5.4 Izbegavanje promenljivih konstantnih nizova
5.5 Uklanjanje lenje inicijalizacije
5.6 Zamrzavanje promenljivih konstanti
5.7 Uklanjanje sporednih efekata
5.8 Prevencija podizanja
6. Deklarativni kod
6.0 Uvod
6.1 Sužavanje ponovo korišćenih promenljivih
6.2 Uklanjanje praznih linija
6.3 Uklanjanje verzionisanih metoda
6.4 Uklanjanje dvostrukih negacija
6.5 Menjanje pogrešno postavljenih odgovornosti
6.6 Zamena eksplicitnih iteracija
6.7 Dokumentovanje dizajnerskih odluka
6.8 Zamena magičnih brojeva konstantama
6.9 Razdvajanje „štaˮ i „kakoˮ
6.10 Dokumentovanje regularnih izraza
6.11 Prerada Yoda uslova
6.12 Uklanjanje neprofesionalnih metoda
6.13 Izbegavanje problema sa ugnježdenim povratnim pozivima
6.14 Generisanje dobrih poruka o greškama
6.15 Izbegavanje magičnih ispravki
7. Imenovanje
7.0 Uvod
7.1 Proširivanje skraćenica
7.2 Preimenovanje i razbijanje pomoćnih i uslužnih funkcija
7.3 Preimenovanje objekata sa prisvojnom zamenicom u prefiksu imena
7.4 Preimenovanje promenljivih rezultata
7.5 Preimenovanje promenljivih imenovanih po tipovima
7.6 Preimenovanje dugih imena
7.7 Preimenovanje apstraktnih imena
7.8 Ispravljanje grešaka u pisanju
7.9 Uklanjanje imena klasa iz atributa
7.10 Uklanjanje prvog slova iz klasa i interfejsa
7.11 Preimenovanje funkcija koje u svojim imenima imaju Basic/Do
7.12 Pretvaranje množine imena klase u jedninu
7.13 Uklanjanje reči „collectionˮ iz imena
7.14 Uklanjanje prefiksa/sufiksa „Implˮ iz imena klasa
7.15 Preimenovanje argumenata prema ulozi
7.16 Uklanjanje suvišnih imena parametara
7.17 Uklanjanje nepotrebnog konteksta iz imena
7.18 Izbegavanje upotrebe reči „dataˮ u imenu
8. Komentari
8.0 Uvod
8.1 Uklanjanje komentara u kojima se nalazi kod
8.2 Uklanjanje zastarelih komentara
8.3 Uklanjanje komentara sa logičkim vrednostima
8.4 Uklanjanje komentara u metodima za dohvatanje
8.5 Pretvaranje komentara u imena funkcija
8.6 Uklanjanje komentara unutar metoda
8.7 Zamena komentara testovima
9. Standardi
9.0 Uvod
9.1 Praćenje standarda pisanja koda
9.2 Standardizacija uvlačenja linija
9.3 Unifikacija konvencija za velika i mala slova
9.4 Pisanje koda na engleskom jeziku
9.5 Unifikacija redosleda parametara
9.6 Popravljanje postojećih problema
10. Kompleksnost
10.0 Uvod
10.1 Uklanjanje ponovljenog koda
10.2 Uklanjanje podešavanja/konfiguracija i opcija za funkcionalnosti
10.3 Menjanje stanja kao svojstava
10.4 Uklanjanje komplikovanih rešenja iz koda
10.5 Kršenje višestrukih obećanja
10.6 Prekidanje dugih lanaca saradnje
10.7 Izdvajanje metoda u objekat
10.8 Praćenje konstruktora nizova
10.9 Uklanjanje objekata sa nepredvidivim ponašanjima
11. Naduvavanje koda
11.0 Uvod
11.1 Razbijanje predugačkih metoda
11.2 Smanjenje suvišnih argumenata
11.3 Smanjenje suvišnih promenljivih
11.4 Uklanjanje suvišnih zagrada
11.5 Uklanjanje suvišnih metoda
11.6 Razbijanje suvišnih atributa
11.7 Smanjenje listi uvoza
11.8 Razbijanje funkcija koje obavljaju više zadataka
11.9 Razbijanje obilnih interfejsa
12. YAGNI
12.0 Uvod
12.1 Uklanjanje mrtvog koda
12.2 Upotreba koda umesto dijagrama
12.3 Refaktorisanje klasa sa jednom potklasom
12.4 Uklanjanje jednokratnih interfejsa
12.5 Uklanjanje nepravilne upotrebe dizajnerskih obrazaca
12.6 Zamena poslovnih kolekcija
13 Otkrij grešku što pre
13.0 Uvod
13.1 Refaktorisanje ponovnog dodeljivanja vrednosti promenljivih
13.2 Nametanje preduslova
13.3 Upotreba strožih parametara
13.4 Uklanjanje podrazumevanih slučajeva iz naredbi grananja
13.5 Izbegavanje izmena kolekcija tokom iteracije
13.6 Ponovno definisanje heširanja i jednakosti
13.7 Refaktorisanje bez funkcionalnih promena
14. Uslovna grananja
14.0 Uvod
14.1 Zamena slučajnih uslovnih grananja polimorfizmom
14.2 Preimenovanje indikatorskih promenljivih događaja
14.3 Konkretizovanje Bulovih promenljivih
14.4 Zamena switch/case/elseif naredbi
14.5 Zamena fiksiranih if uslova kolekcijama
14.6 Promena logičkih uslova u uslove sa skraćivanjem
14.7 Dodavanje implicitnog else uslova
14.8 Ponovno pisanje stepenasto napisanog uslovnog koda
14.9 Izbegavanje trikova uslova sa skraćivanjem
14.10 Ponovno pisanje ugnježdenog stepenasto napisanog koda
14.11 Sprečavanje povratnih logičkih vrednosti za provere uslova
14.12 Menjanje poređenja sa logičkim vrednostima
14.13 Izdvajanje iz dugih uslovnih izraza sa ternarnim operatorima
14.14 Konverzija nepolimorfnih funkcija u polimorfne
14.15 Menjanje poređenja jednakosti
14.16 Pretvaranje fiksiranih poslovnih uslova
14.17 Uklanjanje nepotrebnih logičkih vrednosti
14.18 Ponovno pisanje ugnježdenih uslova sa ternarnim operatorima
15. Null vrednost
15.0 Uvod
15.1 Kreiranje Null objekata
15.2 Uklanjanje opcionog ulančavanja
15.3 Pretvaranje opcionih atributa u kolekcije
15.4 Upotreba stvarnih objekata za null vrednosti
15.5 Predstavljanje nepoznatih lokacija bez korišćenja null vrednosti
16. Preuranjena optimizacija
16.0 Uvod
16.1 Izbegavanje identifikatora objekata
16.2 Uklanjanje preuranjene optimizacije
16.3 Uklanjanje preuranjene optimizacije sa operatorima nad bitovima
16.4 Smanjivanje preopštenosti
16.5 Menjanje strukturne optimizacije
16.6 Uklanjanje kodova za buduću upotrebu
16.7 Izdvajanje keša iz objekata domena
16.8 Uklanjanje događaja sa povratnim pozivom baziranih na implementaciji
16.9 Uklanjanje upita iz konstruktora
16.10 Uklanjanje koda iz destruktora
17. Povezivanje
17.0 Uvod
17.1 Pretvaranje skrivenih pretpostavki u eksplicitne
17.2 Zamena unikata
17.3 Razbijanje preopterećenih objekata
17.4 Razbijanje divergentnih promena
17.5 Pretvaranje specijalnih indikatorskih vrednosti 9999 u normalne
17.6 Uklanjanje operacije širokog raspona
17.7 Uklanjanje opcionih argumenata
17.8 Prevencija zavisti prema funkcijama
17.9 Uklanjanje posrednika
17.10 Premeštanje podrazumevanih argumenata na kraj
17.11 Izbegavanje efekta talasa
17.12 Uklanjanje slučajnih metoda na poslovnim objektima
17.13 Uklanjanje poslovnog koda iz korisničkog interfejsa
17.14 Menjanje povezanosti u klase
17.15 Refaktorisanje klastera podataka
17.16 Prekidanje neprikladne intimnosti
17.17 Pretvaranje zamenljivih objekata
18. Globalne promenljive
18.0 Uvod
18.1 Pretvaranje globalnih funkcija
18.2 Pretvaranje statičkih funkcija
18.3 Zamena GoTo naredbi strukturiranim kodom
18.4 Uklanjanje globalnih klasa
18.5 Menjanje globalnih datuma bez sadržaja
19. Hijerarhije
19.0 Uvod
19.1 Razbijanje dubokog nasleđivanja
19.2 Razbijanje jo-jo hijerarhija
19.3 Razbijanje potkategorizacije radi ponovne upotrebe koda
19.4 Zamena „is-aˮ relacije ponašanjem
19.5 Uklanjanje ugnježdenih klasa
19.6 Preimenovanje izolovanih klasa
19.7 Pretvaranje konkretnih klasa u konačne
19.8 Eksplicitno definisanje nasleđivanja klase
19.9 Prenošenje praznih klasa
19.10 Odgađanje preuranjene klasifikacije
19.11 Uklanjanje zaštićenih atributa
19.12 Kompletiranje praznih implementacija
20. Testiranje
20.0 Uvod
20.1 Testiranje privatnih metoda
20.2 Dodavanje opisa tvrdnjama
20.3 Prenošenje assertTrue do specifičnih tvrdnji
20.4 Zamena lažnih objekata stvarnim objektima
20.5 Unapređivanje generičkih tvrdnji
20.6 Uklanjanje nestabilnih testova
20.7 Menjanje tvrdnji za brojeve sa pokretnim zarezom
20.8 Menjanje test podataka stvarnim podacima
20.9 Zaštita testova koji krše enkapsulaciju
20.10 Uklanjanje irelevantnih informacija iz testova
20.11 Dodavanje pokrivenosti za svaki zahtev za spajanjem
20.12 Ponovno pisanje testova koji zavise od datuma
20.13 Učenje novog programskog jezika
21. Tehnički dug
21.0 Uvod
21.1 Uklanjanje koda koji zavisi od produkcije
21.2 Uklanjanje sistema za praćenje grešaka
21.3 Uklanjanje upozorenja/striktnog režima rada
21.4 Prevencija i uklanjanje oznaka ToDo i FixMe
22. Izuzeci
22.0 Uvod
22.1 Uklanjanje praznih blokova izuzetaka
22.2 Uklanjanje nepotrebnih izuzetaka
22.3 Ponovno pisanje izuzetaka za očekivane slučajeve
22.4 Ponovno pisanje ugnježdenih try/catch blokova
22.5 Zamena povratnih kodova izuzecima
22.6 Ponovno pisanje izuzetaka u stepenasto napisanom kodu
22.7 Skrivanje grešaka niskog nivoa od krajnjih korisnika
22.8 Sužavanje pokušaja za izuzetke
23. Metaprogramiranje
23.0 Uvod
23.1 Uklanjanje upotrebe metaprogramiranja
23.2 Oživljavanje bezimenih funkcija
23.3 Uklanjanje pretprocesora
23.4 Uklanjanje dinamičkih metoda
24. Tipovi
24.0 Uvod
24.1 Uklanjanje provere tipa
24.2 Rad sa istinitim vrednostima
24.3 Promena Float brojeva u decimalne
25. Bezbednost
25.0 Uvod
25.1 Dezinfekcija unosa
25.2 Promena sekvencijalnih identifikatora
25.3 Uklanjanje zavisnosti paketa
25.4 Zamena zlih regularnih izraza
25.5 Zaštita deserijalizacijer objekata
Rečnik pojmova
Indeks
Detaljni podaci o knjiziNaslov: Recepti za čist kod
Izdavač: Kompjuter biblioteka
Povez: meki
Pismo: latinica
Format: cm
Godina izdanja: 2024
ISBN: 978-86-7310-595-6