spada u ona književna ostvarenja koja svojom važnošću nadilaze jezik i zemlju u kojima su stvarana i prerastaju u svevremena dela evropske književnosti. Smutna vremena uoči i za vreme Drugog svetskog rata, galerija živopisnih likova i jedan dečak koji preživljava sve muke i lepote odrastanja te odlučuje da postane pisac, okosnica su najpoznatijeg romana Huga Klausa. To je remek-delo pripovedačke veštine, čudo intertekstualne veštine citiranja, autentično svedočanstvo pripadnosti jednom narodu, jednoj zemlji, i potvrda koliko to poslednje osećanje može da bude dvosmisleno. Dobitnik brojnih književnih nagrada, s delima prevedenim na preko trideset svetskih jezika, Klaus jednako privlači nove naraštaje čitalaca da uživaju u prefinjenom stilu i slojevitom pripovedanju ovog majstora pisane reči.
SadržajPredgovor, xv
Uvod, xxi
Na korici, xxv
Poglavlje 1: Jasan kod, 1
Neka bude kod, 2
Loš kod, 2
Ukupan trošak nereda, 3
Veliko redizajnirnje na pomolu, 4
Stav, 5
Početni problem, 5
Umetnost jasnog koda, , 6
Šta je jasan kod? , 6
Škole mišljenja , 11
Mi smo autori, 12
Pravilo izviđača, 13
Prethodište i principi, 13
Zaključak, 14
Bibliografija, 14
Poglavlje 2: Smislena imena, 15
Uvod, 15
Koristite imena koja otkrivaju namenu, 16
Izbegavajte dezinformacije, 17
Pravite smislene razlike, 18
Koristite izgovorljive nazive, 19
Koristite pretraživa imena, 20
Izbegavajte kodiranje, 21
Mađarska notacija, 21
Prefiksi, 21
Interfejsi i implementacije , 22
Izbegavajte mentalno mapiranje, 22
Imena klase, 23
Nazivi metoda, 23
Ne budite slatki, 23
Izaberite jednu reč po konceptu, 24
Ne igrajte se rečima, 24
Koristite imena prema gotovim rešenjima, 25
Koristite imena koja se odnose na problem koji rešavate, 25
Dodajte smisleno značenje, 25
Nemojte dodavati nepotrebno značenje, 28
Završne reči, 28
Poglavlje 3: Funkcije, 29
Mala!, 32
Blokovi i uvlačenja, 33
Činite jednu stvar, 33
Sekcije u okviru funkcija, 34
Jedan nivo apstrakcije po funkciji, 34
Čitanje koda od vrha ka dnu: Pravilo silaska, 35
Switch naredbe, 35
Koristite opisna imena, 37
Argumenti funkcije, 38
Uobičajeni jednoargumentni oblici, 39
Argumenti pokazivači, 39
Dvoargumentne fukcije, 40
Troargumentne funkcije, 40
Argument objekti, 41
Spisak argumenata, 41
Glagoli i ključne reči, 41
Bez nuspojava, 42
Izlazni argumenti, 43
Razlaganje komandi upita, 43
Dajte prednost izuzecima a ne vraćanju poruke o grešci, 44
Izdvajanje Try/Catch blokova, 44
Obrada grešaka je jedna stvar, 45
Magnetna zavisnost klase Error.java, 45
Ne ponavljajte se, 46
Strukturirano programiranje, 46
Kako pišete ovakve funkcije?, 47
Zaključak, 47
SetupTeardownIncluder, 48
Bibliografija, 50
Poglavlje 4: Komentari, 51
Komentari ne popravljaju loš kod, 52
Izražavajte se kodom, 53
Dobri komentari, 53
Pravni komentari, 53
Informativni komentari, 53
Objašnjenje namere, 54
Razjašnjenje, 55
Upozorenje na posledice, 55
Komentari TODO, 56
Naglašavanje, 57
Generatori dokumentacije (Javadocs) u javnim API-jima, 57
Loši komentari, 57
Mrmljanje, 57
Suvišni komentari, 58
Komentari koji vode na pogrešan put, 60
Obavezni komentari, 61
Komentari u vidu dnevnika , 61
Komentari koji predstavljaju „šum“, 62
Zastrašujući „šum“, 64
Ne koristite komentar kada možete koristiti funkciju
ili promenljivu, 64
Oznake položaja, 64
Komentari na zatvarajućim zagradama, 65
Prateća objašnjenja, 65
Kod pretvoren u komentar, 66
HTML komentari, 66
Informacije od opšteg značaja, 67
Previše informacija, 67
Neočigledna veza, 68
Funkcije zaglavlja, 68
Javadocs u kodu koji nije javan , 68
Primer, 68
Bibliografija, 72
Poglavlje 5: Formatiranje, 73
Svrha formatiranja, 74
Vertikalno oblikovanje, 74
Novinska metafora, 75
Vertikalna otvorenost između pojmova, 76
Vertikalna gustina, 77
Vertikalna udaljenost, 78
Vertikalni redosled, 82
Horizontalno formatiranje, 83
Horizontalna otvorenost i gustina, 83
Horizontalno poravnanje, 84
Uvlačenja, 86
Jednoredni opseg, 87
Timska pravila, 87
Pravila oblikovanja ujka Boba, 88
Poglavlje 6: Objekti i strukture podataka, 91
Apstrakcija podataka, 91
Antisimetrija podataka/objekata, 93
Zakon Demetera, 96
Sudar vozova, 96
Hibridi, 97
Sakrivajuća struktura, 97
Objekti za prenos podataka, 98
Aktivni zapisi, 99
Zaključak, 99
Bibliografija, 99
Poglavlje 7: Rad sa greškama, 101
Koristite izuzetke, a ne povratne kodove, 102
Napišite svoj Try-Catch-Finally kod, 103
Koristite neproverene izuzetke, 104
Obezbedite kontekst sa izuzecima, 105
Definišite klase izuzetaka prema potrebama pozivaoca, 105
Definišite normalan protok, 107
Ne vraćajte Null, 108
Ne prosleđujte Null, 109
Zaključak, 110
Bibliografija, 110
Poglavlje 8: Granice, 111
Korišćenje koda drugih proizvođača, 112
Istraživanje i spoznaja granica, 114
Spoznaja log4j, 114
Testovi za učenje su bolji nego besplatni, 116
Korišćenje koda koji još ne postoji, 116
Jasne i čiste granice, 118
Bibliografija, 118
Poglavlje 9: Testiranje, 119
Tri zakona programiranja zasnovanog na testiranju, 120
Održavanje testova jasnim, 121
Testovi omogućavaju sve, 122
Jasni testovi, 122
Jezik za testiranje za određeni domen, 125
Dvostruki standard, 126
Jedna tvrdnja po testu, 128
Jedan koncept po testu, 129
F.I.R.S.T., 130
Zaključak, 131
Bibliografija, 131
Poglavlje 10: Klase, 133
Organizacija klase, 134
Enkapsulacija, 134
Klase treba da budu male!, 134
Princip jednoodgovornosti, 137
Kohezija, 138
Održavanje rezultata kohezije u mnogo malih klasa, 139
Organizovanje za promene, 145
Izolovanje od promene, 148
Bibliografija, 149
Poglavlje 11: Sistemi, 151
Kako biste izgradili grad?, 152
Odvojite izgradnju sistema od njegove upotrebe, 152
Razdvajanje glavnog, 153
Abstract Factory, 153
Uvođenje zavisnosti, 154
Proporcionalno uvećanje, 155
Nadležnosti unakrsnog preseka, 158
Java proksiji, 159
Čist Java AOP radni okvir, 161
AspectJ aspekti, 164
Test sistemske arhitekture, 164
Optimizujte donošenje odluka, 165
Koristite standarde mudro, onda kada dodaju vidljivu vrednost, 165
Sistemima je potreban određeni jezik domena, 166
Zaključak, 166
Bibliografija, 167
Poglavlje 12: Nastajanje, 169
Biti jasan pomoću dizajna u nastajanju, 169
Jednostavno dizajniranje, pravilo 1: Izvršava sve testove, 170
Jednostavno dizajniranje, pravila 2–4: Refaktorisanje, 170
Bez duplikata, 171
Izražajno, 173
Što manji broj klasa i metoda, 174
Zaključak, 174
Bibliografija, 174
Poglavlje 13: Paralelnost, 175
Zašto paralelnost?, 176
Mitovi i zablude, 177
Izazovi, 177
Principi odbrane paralelnosti, 178
Princip jedinstvene odgovornosti , 178
Posledica: Ograničite opseg podataka, 178
Zaključak: Koristite kopije podataka, 179
Posledica: Niti moraju biti što je moguće više nezavisne, 179
Upoznajte svoju biblioteku, 180
Kolekcije koda sigurne za rad sa nitima, 180
Upoznajte svoje modele izvršenja, 180
Proizvođač-korisnik, 181
Čitaoci-upisivači, 181
Filozofi za stolom, 182
Pazite na zavisnosti između sinhronizovanih metoda, 182
Održavajte sinhronizovane delove malim, 183
Pisanje tačnog koda za isključivanje je teško, 183
Testiranje koda za nitni rad, 183
Lažne propuste tretirajte kao kandidate za probleme, 184
Prvo učinite da radi kod koji nije nitni, 184
Učinite da kod sa nitima bude uklopljiv, 184
Učinite da kod sa nitima bude prilagodljiv, 185
Radite sa više niti nego procesora, 185
Izvršavajte kod na različitim platformama, 185
Pokušajte da „opteretite“ kod da biste ga naterali na grešku, 185
Ručno kodiranje, 186
Automatizovano menjanje, 186
Zaključak, 187
Bibliografija, 188
Poglavlje 14: Uzastopno usavršavanje, 189
Implementacija Argova, 190
Kako sam to uradio?, 197
Args: Gruba skica, 197
Tako da sam stao, 210
O inkrementiranju, 211
Argumenti String, 213
Zaključak, 253
Poglavlje 15: JUnit iznutra, 255
JUnit radni okvir, 256
Zaključak, 270
Poglavlje 16: Refaktorisanje klase SerijalDate, 271
Prvo, učinite da radi, 272
Zatim ispravite, 274
Zaključak, 288
Bibliografija, 289
Poglavlje 17: „Mirisi“ i heuristika, 291
Komentari, 292
C1: Neodgovarajuće informacije, 292
C2: Nepotreban komentar, 292
C3: Suvišan komentar, 292
C4: Loše napisan komentar, 293
C5: Isključen kod, 293
Okruženje, 293
E1: Za izgradnju je potrebno više od jednog koraka, 293
E2: Testovi zahtevaju više od jednog koraka, 293
Funkcije, 294
F1: Previše argumenata, 294
F2: Izlazni argumenti, 294
F3: Argumenti pokazivači, 294
F4: Mrtva funkcija, 294
Uopšteno, 294
G1: Više jezika u jednoj izvornoj datoteci, 294
G2: Očigledno ponašanje je neimplementirano, 294
G3: Netačno ponašanje u graničnim slučajevima, 295
G4: Zaobilaženje bezbednosti, 295
G5: Udvostručavanje, 295
G6: Kod na pogrešnom nivou apstrakcije, 296
G7: Osnovne klase zavise od njihovih derivata, 297
G8: Previše informacija, 297
G9: Mrtav kod, 298
G10: Vertikalno odvajanje, 298
G11: Nedoslednost, 298
G12: Nered, 299
G13: Veštačko povezivanje, 299
G14: Osobina zavisti, 299
G15: Argumenti selektori, 300
G16: Nejasna namera, 301
G17: Pogrešno postavljena odgovornost, 301
G18: Neprikladna statika, 302
G19: Koristite objašnjavajuće promenljive, 302
G20: Imena funkcija treba da kažu šta one rade, 303
G21: Razumite algoritam, 303
G22: Učinite logičke zavisnosti fizičkim, 304
G23: Dajte prednost polimorfizmu u odnosu na If/Else
ili Switch/Case, 305
G24: Pridržavajte se standardnih konvencija, 306
G25: Zamenite čarobne brojeve sa imenovanim konstantama, 306
G26: Budite precizni, 307
G27: Struktura pre konvencije, 307
G28: Enkapsuliranje uslova, 307
G29: Izbegavajte negativne uslove, 308
G30: Funkcije bi trebalo da urade jednu stvar, 308
G31: Skrivena vremenska povezivanja, 309
G32: Nemojte biti proizvoljni, 310
G33: Granični uslovi enkapsuliranja, 310
G34: Funkcije treba da se spuštaju samo na jedan
nivo apstrakcije, 310
G35: Čuvajte podatke koji se mogu konfigurisati
na visokim nivoima, 312
G36: Izbegavajte tranzitivnu navigaciju, 313
Java, 313
J1: Izbegavajte duge spiskove uvoza koristeći džokere, 313
J2: Ne nasleđujte konstante, 314
J3: Konstante naspram Enumeratora, 315
Imena, 316
N1: Izaberite opisna imena, 316
N2: Izaberite imena na odgovarajućem nivou apstrakcije, 317
N3: Koristite standardnu nomenklaturu gde god je to moguće, 318
N4: Jednoznačna imena, 318
N5: Koristite dugačka imena za velike opsege, 319
N6: Izbegavajte kodiranje, 319
N7: Imena treba da opisuju sporedna dejstva, 319
Testovi, 319
T1: Nedovljni testovi, 319
T2: Koristite alat za prikrivanje!, 320
T3: Ne preskačite jednostavne testove, 320
T4: Zanemareni test je pitanje o nejasnoći, 320
T5: Testiranje graničnih uslova, 320
T6: Detaljno testiranje u blizini grešaka, 320
T7: Obrasci otkazivanja se otkrivaju, 320
T8: Obrasci ispitivanja mogu se otkriti, 320
T9: Testovi treba da budu brzi, 321
Zaključak, 321
Bibliografija, 321
Dodatak A: Paralelnost II, 323
Primer klijent/server, 323
Server, 323
Dodavanje niti, 324
Nadgledanje servera, 325
Zaključak, 327
Mogući putevi izvršenja, 327
Broj putanja, 328
Kopanje dublje, 329
Zaključak, 332
Upoznajte svoju biblioteku, 332
Izvršni radni okvir, 332
Neblokirajuća rešenja, 333
Nenitne bezbedne klase, 334
Zavisnosti između metoda mogu pokvariti paralelan kod, 335
Tolerisanje otkazivanja, 336
Zaključavanje na strani klijenta, 336
Zaključavanje na strani servera, 338
Povećanje propusnosti, 339
Proračun protoka sa jednom niti , 340
Proračun protoka sa više niti, 340
Zastoj, 341
Uzajamno isključivanje, 342
Zaključaj i sačekaj, 342
Nema preko reda, 342
Kružno čekanje, 342
Prekid uzajamnog isključivanja, 343
Prekidanje zaključavanja i čekanja, 343
Prekidanje prekorednosti, 344
Prekid kružnog čekanja, 344
Testiranje višenitnog koda, 344
Alati za podršku testiranja višenitnog koda, 347
Zaključak, 348
Vežba: Primeri punog koda, 348
Klijent/server bez niti, 348
Klijent/server pomoću niti, 352
Dodatak B: org.jfree.date.SerialDate, 355
Dodatak C: Uporedne reference poglavlja i heuristika, 427
Epilog, 429
Indeks, 431