Recenzije koda: najčešći izvori ekstremnih kršenja pravila i kako izbjeći argumente o njihovom fiksiranju

Noževi su izvučeni. Oštrice su zaoštrene zbog sukoba. Razvojni programer vodi spor. Strasti koderi se upale ne preko buggy softvera, nego preko oštro jezgrovitog ili višestrukog koda. Te su crte znakovi haka. Svaki programer koji se ne slaže, amater je. Samo bi neofit proizveo metode i blokove koji tako jasno narušavaju dobar ukus. Ipak, različiti preferenci, a ne prirodni zakoni, izvor su tog sukoba i vitriola. U ovom slučaju, mržnja između programera rezultat je različitih sklonosti trgovanju sažetosti za različite ciljeve. Ovi ciljevi i tendencija za njima različiti su za svakog razvojnog programera, što vodi stalnom sukobu na određenim područjima. Jedno takvo mjesto je wordy ili kithy code. Da bi se borba svela na najmanju moguću mjeru, tim može upotrijebiti preglede koda kako bi istaknuo najagresivije segmente, a grupa se može prepirati oko tih dijelova, umjesto da se svađaju preko svakog retka i bloka baze koda.

Određene konstrukcije koda ili tehnike vjerojatno će proizvesti ekstremna kršenja i voditi argumente o ispravljanju tih prekršaja. Ispravljanje tih zlostavljanja dovodi do intenzivnih prepirki. Ta se neslaganja mogu razriješiti ili barem deeskalirati zbog posebnih dolje navedenih jezičnih značajki i tehnika.

Uvjetni operater vs ako izjava

Lingvistički elementi, uvjetno-operator i if-izjava, vode u svađe, s različitim taborom tvrdeći da je svaki od njih superiorna tehnika za određene operacije. Ove se akcije mogu provesti na bezbroj načina, a svaka tehnika donosi prednosti i nedostatke.

Ako Izjava: Izjava if može doprinijeti oštroumno voluminoznom kodu kada je gustoća uvjeta velika. Velika gustoća čini da blok ili metoda izgledaju podmuklo. Ipak, kôd napisan s if-izjavama također je visoko moguće ukloniti, jer programer može preći svaki redak.

if (label1IsRequired) {
 label1.Color = "crveni";
} else {
 label1.Color = "crno";
}
if (label2IsRequired) {
 label2.Color = "crveni";
} else {
 label2.Color = "crno";
}
if (label3IsRequired) {
 label3.Color = "crveni";
} else {
 label3.Color = "crno";
}

Uvjetni operater: Uvjetni operator može dovesti do nekih grubo kratkih linija, kada se koristi kao zamjena za nekoliko if-izjava. Ugrađeni uvjetni operatori čine kôd, kad ih izvedemo do krajnosti, vrlo teško za čitanje, testiranje ili uklanjanje pogrešaka. Bilo koji blok ili metoda koja je teška za uvjetne operatore također je vrlo kompaktna, smanjuje količinu koda koju programer mora skenirati.

healthIndicatorColor = (zdravlje == "Dobro")? "Green": (zdravlje == "fer")? "Žuto": (zdravlje == "loše")? "Crveno": (zdravlje == "život_support")? "Narančasta": "ljubičasta";

Potencijalna razlučivost: Uvjetni operatori su korisni kada zamjenjuju visoku gustoću vrijednosti postavljenih na temelju uvjeta implementiranih putem if-izraza. Operateri uvjetnog djelovanja destruktivni su kada zamjenjuju čak i par odluka ugrađenih u jedan drugog. Imperativi koji se lako uklapaju u jednu liniju glavni su cilj za uvjetne operatore, dok su uvjeti koji zahtijevaju nekoliko redaka domena if-izraza. Svako neprimjereno korištenje if-izjava ili uvjetnih operatora treba ispraviti kako bi se primijenila odgovarajuća upotreba jednog od tih konstrukata. (Napomena: Modifikacija može zahtijevati značajno ponovno faktoriranje.)

ako (zdravlje == "dobro") {
 healthIndicatorColor = "zeleni";
} else if (zdravlje == "fer") {
 healthIndicatorColor = "žuto";
} else if (zdravlje == "loše") {
 healthIndicatorColor = "crveni";
} else if (zdravlje == "life_support") {
 healthIndicatorColor = "narančasta";
} else {
 healthIndicatorColor = "ljubičasta";
}
label1.Color = (label1IsRequired)? "crveno-crno";
label2.Color = (label2IsRequired)? "crveno-crno";
label3.Color = (label3IsRequired)? "crveno-crno";

Više izjava o povratu u odnosu na jednu izjavu o povratu

Dva određena stila koji vode u argumente su višestruki povratci i pojedinačni povratci. Nastaju neslaganja oko toga treba li metoda imati jednu izjavu povrata ili je li višestruke izjave povrata prihvatljivo. Svaki pristup ima pozitivnosti i negativnosti.

Višestruki izvještaji o povratu: Izjave višestrukog povrata mogu pridonijeti kodu koji je teško razumjeti, pratiti i testirati. Međutim, metode s višestrukim povratima mogu biti kraće od funkcija s jednim povratkom.

SomeDataType nekiMethod (param1, param2, param3) {
 RetVal SomeDataType;
 ako je (param1 == null) {
 retVal = nula
 }
 ako je (retVal == null) {
 povratni retVal;
 }
 
 ako je (param2! = nula) {
 retVal = param2;
 }
 if (retVal.Equals (param2)) {
 povratni retVal;
 }
 
 retVal = param3;
 povratni retVal;
}

Jedna izjava o povratu: Jedna povratna izjava može voditi dugim metodama. Ipak, ovi postupci imaju izlaz iz jedne točke, pojednostavljujuće testiranje i uklanjanje pogrešaka.

SomeDataType nekiMethod () {
 RetVal SomeDataType;
 // Kod stotina ili tisuća linija
 povratni retVal;
}

Potencijalna razlučivost: Višestruki povratci otežavaju razumijevanje, praćenje i testiranje koda ako se koriste nedosljedno. Pojedinačne povratne izjave dovode do dugih metoda, kad ih nastave dugim dijelovima koda. Ovi izvučeni rasponi mogu se skratiti, ili barem učiniti čitljivim, koristeći nekoliko povratnih izjava umjesto jedne. Pojedini povratci potpuno su prihvatljivi kada slijede kratke tragove koda. Svaka velika zloupotreba jedne izjave povrata ili višestrukih povrata treba popraviti da se primijeni slučaj upotrebe jednog od tih stilova. (Napomena: za ispravljanje bi mogao biti potreban značajan refaktoring.)

SomeDataType nekiMethod (param1, param2, param3) {
 ako je (param1 == null || param3 == null) {
 vratiti null;
 }
 
 SomeDataType retVal = null;
 if (param2! = null {
 retVal = param2;
 } else if (param1! = null) {
 retVal = param1;
 } ele if (param3! = null) {
 retVal = param3;
 }
 povratni retVal;
}
SomeDataType nekiMethod (param1, param2) {
 SomeDataType retVal = null;
 za (int i = 0; i  if (param1 [i] .equals (param2)) {
 retVal = param1 [i];
 pauza;
 }
 }
 povratni retVal;
} Prekini i nastavi upotrebu u petlji

Konstrukti prekida i nastavka tema su intenzivnih rasprava. S jedne strane teorije, programeri tvrde da prekid i nastavak mogu pojednostaviti kontrolni tijek. Drugi programeri tvrde da te značajke kompliciraju logiku programa. Prekid i nastavak definitivno se mogu koristiti za pojednostavljivanje ili kompliciranje koda. Ove se crte mogu uočiti.

Prekid i nastavak upotrebe: Elementi mogu pojednostaviti kod, ali mogu i bespotrebno komplicirati.

SomeDataType nekiMethod (param1, param2) {
 SomeDataType retVal = null;
 za (int i = 0; i  if (param1 [i] == null) {
 nastaviti;
 }
 if (param1 [i] .equals (param2)) {
 retVal = param1 [i];
 pauza;
 }
 }
 povratni retVal;
}
SomeDataType nekiMethod (podaci, param1) {
 SomeDataType retVal = null;
 učini nešto:
 for (int i = 0; i  ako je (i> = data.length) {
 pauza;
 }
 if (podaci [i] .equals (param1)) {
 retVal = podaci [i];
 } else {
 nastaviti;
 }
 }
ako je (retVal == null) {
 podaci - refreshData ();
 goto dosomething;
 }
povratni retVal;
}

Potencijalna razlučivost: Većina programera tvrdi da kôd treba koristiti jednostavne mehanizme za upravljanje protokom. Koji su konkretni mehanizmi jednostavni, izvor je rasprave. Ovaj se argument postaje mnogo rjeđi kada se svaki instrument koristi na široko prihvaćen način. Prihvaćeni pristupi postoje za prekid i nastavak. Pridržavajte se tih konvencija kako biste spriječili nesuglasice i pojednostavili tijek kontrole. Svako sredstvo kontrole koje grubo krši te standarde trebalo bi ispraviti bez rasprave.

SomeDataType nekiMethod (podaci, param1) {
 SomeDataType retVal = null;
 za (int i = 0; i  if (podaci [i] == null) {
 nastaviti; // preskočite ostatak petlje
 }
 if (podaci [i] .equals (param2)) {
 retVal = podaci [i];
 pauza; // ne petljajte više b / c što sam završio
 }
 }
 povratni retVal;
}

Iznimne obrane

Iznimke su način da se ukaže na problem ili da se odbaci budući problem. Koje bi glavobolje trebale biti naznačene ili oduzete dijelovima koda tema je žestoke rasprave. Na jednom kraju neslaganja, koderi tvrde da prodorni obrambeni izuzeci sprječavaju pogreške i olakšavaju ih pronalaženju. Međutim, obrana popisa rublja može učiniti kôd oteženim i teško razumljivim, kao što tvrde neki programeri. Razvijači s obje strane rasprave imaju poantu. Obrambene iznimke imaju i koristi i štete.

Prednosti i štete odbrambenih izuzetaka: Zaštita od pogrešaka i drugih problema može se zaštititi, uz minimalne nedostatke, koristeći iznimke obrane. Te se mane povećavaju kada je tehnika neselektivna.

void someMethod (param1, param2) {
 ako je (param1 == null || param2 == null) {
 bacite novu ArgumentNullException ("Jedan ili više parametara nedostaje");
 }
 // učiniti stvari stvari
}
void someMethod (param1, param2) {
 // desetine linija obrambenih provjera… ..
 // učiniti ostatak metode
}

Potencijalna rezolucija: nedostaci obrambenih izuzetaka najmanji su kada su raspoređeni u prihvaćenim područjima. Svako korištenje tehnike koja odstupi od tih konvencija treba ispraviti, osim ako nije naveden uvjerljiv razlog.

public void someMethod (param1, param2) {
 // provjerite svaki parametar u javnoj metodi
 ako je (param1 == null || param2 == null) {
 bacite novu ArgumentNullException ("Jedan ili više parametara nedostaje");
 }
 
 // izbjegavati probleme uzrokovane nevaljanim podacima
 if (! isValid (param1) ||! isValid (param2)) {
 izbaci novo InvalidParameterException ("Jedan ili više parametara nije valjano");
 }
 
 // napraviti nešto s parametrima
}

Zamotati

Ove konstrukcije kodova i tehnike koriste i dobri i zli programeri. Programeri su ljudi. Ljudska bića imaju tendencije. Te se sklonosti očituju u kodu. Povremeno se impulsi programera natjeraju da napiše kôd koji drugi koderi s pravom kritiziraju. Programer u kojem se nalazi na začelju nije nužno loš programer. Koder koji ga kritizira nije nužno dobar programer. Obje osobe vjerojatno su, u jednom trenutku, zalutale po svojim sklonostima. Te želje ne bi trebale voditi razvoj da bi se izrodio u neprekidni tok uvreda koje su se međusobno udarale. Umjesto toga, programeri bi trebali međusobno pregledati kôd, ograničiti svoje bitke na najgore dijelove i pristati na rješavanje određenih argumenata putem gore navedenih pravila.