Scrierea codului redundant este o practică greșită?


Cel mai bun răspuns

Da, veți scrie aceleași tipuri și căutări și funcții de manipulare a șirurilor de mii de ori, fiecare doar un minor variație de ultima dată.

Acest lucru este atât de adevărat încât a apărut o filosofie de economisire a sănătății care neagă acest lucru în mediul academic numit „Nu te repeta” care pretinde că există o modalitate de a nu scrie același cod peste și peste.

Această mantră stupidă trebuie într-adevăr eliminată de oameni.

Proiectarea inteligentă înseamnă să nu trebuie să începi de la zero de fiecare dată, iar codarea inteligentă înseamnă să știi când să scrii ceva nou și când să reutilizați codul.

Reutilizarea codului ca măsură de economisire a timpului, de depanare, are meritele sale, atunci când este disponibilă. Acest lucru a evoluat în instrumente utile, cum ar fi generice și șabloane și conceptul de moștenire și API-uri universale, astfel încât sortarea și căutarea devin generice în loc să fie nevoie de o nouă funcție de căutare care să fie scrisă pentru fiecare tip de matrice sau listă.

Copierea textului codului este considerată cea mai gravă eroare, deoarece copiază erori și umflă cod și este în primul rând ceea ce este considerat redundant.

Aici moștenirea strălucește ca strategie de reducere a codului. Subclasele nu trebuie să fie rescrieri scumpe ale claselor lor de bază dacă majoritatea funcționalității comune tuturor subclaselor este plasată în clasa de bază. De multe ori subclasa poate apela funcția clasei de bază și apoi poate efectua câteva modificări în sine, mai degrabă decât să reimplementeze întreaga funcție. Despre asta vorbesc.

Dar „Nu te repeta” a câștigat statutul de cult în forumuri ca acesta ca un fel de mod ideal de codificare și proiectare și pur și simplu nu este adevărat sau practic sau parte a oricărui corp major de cod din lumea reală.

Proiectarea excesivă este destinată dezvoltatorilor de limbă, teoreticienilor și creatorilor de cadru. Codificatorii practici scriu doar cod care funcționează, iar dacă programul dvs. are două clase care implementează ambele căutări binare, atunci ce? Chiar aveți nevoie de o a treia clasă cu subclasele pentru a gestiona căutările binare pentru celelalte două clase de date? Poate, dar este vorba despre extinderea unei mărimi de clase de date cu nevoie de căutare binară, atunci devine un economizor de timp real și bug pentru a avea o clasă care să facă asta corect, care poate fi subclasată pentru a face față nevoilor claselor de date. Vedeți?

Programarea în mare necesită mult mai multă planificare și analiză a diviziunii muncii decât programarea unor locuri de muncă și instrumente mici. Deci da, dacă aveți un proiect cu peste 1000 de linii de cod, căutați peste design și găsiți algoritmi și funcții redundante și decideți dacă le puteți aduna într-o singură clasă de utilități funcționale sau două și să partajați codul pentru toate obiectele de date. Dar nu vă faceți într-o căutare religioasă pentru eliminarea finală a redundanței. Și nu credeți pe cei care cred.

Răspundeți

Dacă este cea mai eficientă opțiune, atunci nu este o practică rea. A face orice care are o soluție mai simplă, mai elegantă, ușor disponibilă, totuși, este o practică proastă .

În acest caz, un comutator gigant poate fi adesea înlocuit de o interfață sau care permite unei clase să aibă propria responsabilitate etc.

De exemplu, dacă aveți ceva de genul acesta :

Acest va funcționa . Codul va fi un fel de robust atâta timp cât valorile vor fi adăugate și nu vor fi editate și, de fapt, chiar destul de eficient, deoarece comparațiile de biți durează practic zero. Dar acest lucru va scăpa de sub control, este dificil de navigat, iar tu deja trebuie să definești oricum aceste clase de mașini.

În schimb, să începem cu ceva de genul acesta:

Din nou, probabil am avut asta oricum, doar fără metoda numberOfCylinders și, așadar, acum prima noastră metoda arată doar așa:

Acum imaginați-vă pentru o clipă că suntem un magazin național de piese auto și că avem literalmente mii de mașini de diferite mărci, modele, garnituri etc. Că dacă / altfel ar deveni un monstru enorm, imposibil de citit, extrem de greu de adăugat sau de eliminat în siguranță, etc.

Deci din nou , nu este întotdeauna o practică proastă și uneori vom avea nevoie de un comutator mare sau ceva de genul acesta, ci de obicei există un mod mai ușor de ascuns acolo.

EDIT: Există multe comentarii despre a avea un n un număr extrem de mare de combinații de mașini (potențial milioane de-a lungul istoriei) și clase care implementează Mașina eșuează aici. Bineînțeles, la un moment dat, cursurile nu vor funcționa și ar fi să stocați fișiere plate într-o bază de date și să utilizați un accesor.

Răspunsul meu a fost menit să arate capcana utilizării foarte lungi declarații condiționale, nu ca o încercare reală de a construi o arhitectură de magazin de piese auto.Dacă lucrați la un distribuitor auto important, vă rugăm să nu luați răspunsul meu simplu ca bază a arhitecturii software 🙂

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *