Su quale pratica di programmazione che una volta ti piaceva hai cambiato idea? [chiuso]


99

Mentre programmiamo, sviluppiamo tutti pratiche e modelli che utilizziamo e su cui facciamo affidamento. Tuttavia, nel tempo, man mano che la nostra comprensione, maturità e persino l'utilizzo della tecnologia cambiano, ci rendiamo conto che alcune pratiche che una volta pensavamo fossero ottime non sono (o non sono più applicabili).

Un esempio di una pratica che ho usato una volta abbastanza spesso, ma che negli ultimi anni è cambiata, è l'uso del modello di oggetti Singleton .

Grazie alla mia esperienza e ai lunghi dibattiti con i colleghi, sono arrivato a rendermi conto che i singleton non sono sempre desiderabili : possono rendere i test più difficili (inibendo tecniche come il beffardo) e possono creare accoppiamenti indesiderabili tra le parti di un sistema. Invece, ora uso fabbriche di oggetti (in genere con un contenitore IoC) che nascondono la natura e l'esistenza dei singleton da parti del sistema che non si preoccupano o hanno bisogno di sapere. Invece, si basano su una fabbrica (o un localizzatore di servizi) per acquisire l'accesso a tali oggetti.

Le mie domande alla comunità, nello spirito di auto-miglioramento, sono:

  • Quali schemi o pratiche di programmazione hai riconsiderato di recente e ora cerchi di evitare?
  • Con cosa hai deciso di sostituirli?

Risposte:


159


//Coming out of university, we were taught to ensure we always had an abundance 
//of commenting around our code. But applying that to the real world, made it 
//clear that over-commenting not only has the potential to confuse/complicate 
//things but can make the code hard to follow. Now I spend more time on 
//improving the simplicity and readability of the code and inserting fewer yet 
//relevant comments, instead of spending that time writing overly-descriptive 
//commentaries all throughout the code.



+1. Stavo per pubblicare questa stessa risposta. Ho trovato alcuni dei miei vecchi incarichi di programmazione su un disco di archivio poche settimane fa. Sembrava tutto uguale. C'era quasi un rapporto 1: 1 tra righe di commenti e righe di codice.
Michael Moussa

32
Sembra che tu abbia commentato in modo errato , non troppo. Il codice non parla da solo. No. Davvero no. Leggi l'ultimo NT Insider per una bella sfuriata su questo. Se pensi che i commenti saranno ridondanti, allora o ti sbagli o lo stai facendo male. Sembra che le università non insegnino a commentare correttamente (o tracciamento di bug o controllo di versione ... * sigh *). Ci sono troppi pochi commenti là fuori. (e meno buoni)
Thomas

5
Code Complete offre ottimi suggerimenti per i commenti e i dati per eseguirne il backup.
Thomas,

20
I commenti dovrebbero essere usati per descrivere perché il codice fa quello che fa (se non è ovvio), non quello che fa il codice. Una possibile eccezione è un pazzo trucco / linguaggio, come il numero magico di Carmack 0x5f3759df.
Chris Simmons

6
@Thomas: Personalmente penso che il problema sia che insegnare buoni commenti non è qualcosa che un'università può mostrare agli studenti. Quasi tutti i programmi nelle scuole sono cose una tantum; gli studenti non possono provare a guardare indietro al codice che hanno scritto un anno fa e non capirlo affatto. Inoltre, le classi di livello inferiore insegnano concetti di programmazione molto semplici: commentare a questo livello è quasi necessariamente noioso, a causa di ciò che sta accadendo. In altre parole, è come cercare di insegnare a qualcuno a nuotare in una piscina per bambini; semplicemente non è il contesto giusto per loro per capire i movimenti.
Dan Lew

117

Punti di ritorno singoli.

Una volta ho preferito un unico punto di ritorno per ogni metodo, perché con quello potevo garantire che qualsiasi pulizia necessaria dalla routine non fosse trascurata.

Da allora, sono passato a routine molto più piccole - quindi la probabilità di trascurare la pulizia è ridotta e di fatto la necessità di pulizia è ridotta - e ho scoperto che i primi ritorni riducono l'apparente complessità (il livello di annidamento) del codice. Gli artefatti del singolo punto di ritorno - mantenere le variabili "risultato" in giro, mantenere variabili flag, clausole condizionali per situazioni non già eseguite - fanno sembrare il codice molto più complesso di quanto non sia in realtà, rendono più difficile la lettura e la manutenzione. Le uscite anticipate e metodi più piccoli sono la strada da percorrere.


3
Sono d'accordo, se combinato con tipi di dati che si puliscono automaticamente, come autoptr, scoped_ptr, CComPtr, ecc.
i_am_jorf

3
La pulizia del codice è ciò a cui serve {} finalmente {}
provare

@banjollity: ad eccezione delle lingue che non supportano finalmente {}. E nota che anche nelle lingue che lo supportano, infine, l'esecuzione di {} non è SEMPRE garantita.
Chris K

1
@banjollity, Chris: In C ++, la pulizia è lo scopo del distruttore e, tranne in circostanze estreme (exit (), un distruttore che lancia un'eccezione durante lo svolgimento dello stack, gli scoiattoli ti tagliano la potenza) è garantito per funzionare.
David Thornley

4
Concordato. Sostituisci condizionale annidato con clausole di guardia ftw!
Jonik

111
  • Cercando di codificare le cose perfettamente al primo tentativo.
  • Cercando di creare un modello OO perfetto prima della codifica.
  • Progettare tutto per flessibilità e miglioramenti futuri.

In una parola overengineering .


6
Aspetta, ho sempre capito bene al primo tentativo. :)
i_am_jorf

18
Il vero denaro sta nel sbagliare sottilmente la prima volta e nel lasciarlo andare in libertà. Quindi, quando le persone sono abituate alla versione ridotta, piomba con arrogante esibizione e correggi il bug / inefficienza per ottenere ulteriore gloria! ;)
Eric

7
@ jeffamaphone - No, solo Jon Skeet ha capito bene la prima volta.
Jordan Parmer

Mi piace la parola "overengineering"
Neilvert Noval

@ jeffamaphone - Ho sempre capito bene anche al primo tentativo. Ma ulteriori tentativi danno ciò di cui ho bisogno :)
Umbr

78

Notazione ungherese (sia forme che sistemi). Ho usato per prefissare tutto. strSomeString o txtFoo. Ora uso someString e textBoxFoo. È molto più leggibile e più facile per qualcuno nuovo che si avvicina e riprende. Come bonus aggiuntivo, è banale mantenerlo coerente: camelCase il controllo e aggiungi un nome utile / descrittivo. Forms Hungarian ha l'inconveniente di non essere sempre coerente e Systems Hungarian non ti fa guadagnare molto. Il raggruppamento di tutte le variabili insieme non è davvero così utile, specialmente con i moderni IDE.


Che dire dei linguaggi tipizzati dinamicamente, come Python o JavaScript? Trovo ancora utile usare la notazione ungherese in queste lingue in modo che, guardando le variabili, so quale tipo di variabile aspettarsi (se c'è un tipo da aspettarsi - ovviamente, sarebbe sconsiderato trattare un linguaggio digitato dinamicamente esattamente come una lingua tipizzata staticamente.)
Dan Lew

4
Faccio simili eccetto: fooTextBox e string's sono solo, si spera, evidenti: numberOfEntries => int, isGreat => bool, ecc.
rball

+1 per sbarazzarsi della notazione ungherese. Sono d'accordo con rball; fooTextBox, fooService, fooString quando è veramente necessario.
blu

3
@ wuub: direi che con una denominazione corretta, non dovresti aver bisogno di aggiungere alcun prefisso.
Kenny Mann,

4
A proposito, quello che hai menzionato non è un vero ungherese.
Antony Carthy,

67

L'architettura "perfetta"

Ho pensato THE L'architettura un paio di anni fa. Mi sono spinto tecnicamente il più lontano possibile in modo che ci fossero strati accoppiati al 100%, ampio uso di delegati e oggetti leggeri. Era il paradiso tecnico.

Ed era una schifezza. La purezza tecnica dell'architettura ha solo rallentato il mio team di sviluppo puntando alla perfezione sui risultati e ho quasi raggiunto il completo fallimento.

Ora abbiamo un'architettura molto più semplice e meno tecnicamente perfetta e il nostro tasso di consegna è salito alle stelle.


57

L'uso della caffina. Una volta mi teneva sveglio e in uno stato d'animo glorioso di programmazione, dove il codice volava dalle mie dita con febbrile fluidità. Adesso non fa niente e se non ce l'ho mi viene il mal di testa.


55
Devi bere ancora più caffè. Se non funziona, inizia a fumare.
MusiGenesis

7
Brad: Non ti servono quando hai Python: xkcd.com/353
Peter

Bel riferimento a Christmas Story! :-)
Steve Echols

2
Ho rotto l'abitudine e poi l'ho ripresa di nuovo, più volte (questo è ora il mio terzo ciclo). Non c'è niente come scrivere codice nelle fredde mattine con una calda tazza di caffè!
Matthew Iselin

15
"Sembra che ho scelto la settimana sbagliata per smettere di anfetamine."
ShreevatsaR

50

Commentare il codice. Un tempo pensavo che il codice fosse prezioso e che non puoi semplicemente eliminare quelle bellissime gemme che hai creato. Ora elimino qualsiasi codice commentato che trovo a meno che non ci sia un TODO o una NOTA allegata perché è troppo pericoloso lasciarlo dentro. In altre parole, mi sono imbattuto in vecchie classi con enormi porzioni commentate e mi ha davvero confuso il motivo per cui c'erano: sono stati recentemente commentati? è un cambiamento dell'ambiente di sviluppo? perché fa questo blocco non correlato?

Considera seriamente di non commentare il codice e di eliminarlo semplicemente. Se ne hai bisogno, è ancora nel controllo del codice sorgente. YAGNI però.


6
Commento il vecchio codice durante il refactoring, ma solo fino a quando non ho verificato che il codice sostitutivo funzioni. Una volta che la nuova versione è completamente funzionante, elimino le vecchie righe commentate.
muusbolla

In effetti, commento anche il codice, ma solo per pochi giorni. Se torno e mi accorgo che c'è qualcosa che mi è mancato, verrà cancellato prima che il nuovo codice venga elaborato.
Colin Mackay

4
Dico controlla una volta il codice commentato, POI cancellalo. Ci sono molte volte in cui si testano diversi bit di codice e non si desidera controllare il codice rotto ...
DisgruntledGoat

Per non parlare del fatto che il controllo della versione è tuo amico.
David Thornley

+1 Ho lavorato con un programmatore che insisteva nel commentare tutto il codice che aveva refactoring o riscritto. Mi farebbe impazzire perché a volte dovrei scorrere 1k + righe di schifezze per trovare su cosa stavo lavorando.
Evan Plaice,

46

L'uso eccessivo / abuso delle direttive #region. È solo una piccola cosa, ma in C #, in precedenza usavo le direttive #region ovunque, per organizzare le mie classi. Ad esempio, raggrupperei tutte le proprietà della classe insieme in una regione.

Ora guardo indietro al vecchio codice e principalmente mi infastidisco. Non penso che renda le cose più chiare per la maggior parte del tempo, ea volte semplicemente ti rallentano. Quindi ora ho cambiato idea e sento che le classi ben organizzate sono per lo più più pulite senza direttive regionali.


31
Odio la regione. Le persone del mio team li usano in modo frivolo. Li chiamo "cattivi nasconditori di codice".
rball

9
Sono decisamente un odore di codice.
Frank Schwieterman,

3
ODIO le regioni. Attualmente sto mantenendo il codice in cui la funzione è di quasi 500 righe e per gestirlo, lo sviluppatore intelligente ha inserito blocchi di codice in 10-15 regioni.
SoluzioneYogi

6
@Solution Yogi: Non credo che le regioni siano il vero problema nel tuo caso :-)
Ed S.

9
Penso che le regioni possano andare bene se usate con parsimonia.
Gregory Higley,

39

Sviluppo a cascata in generale, e nello specifico, la pratica di scrivere specifiche funzionali e di design complete e complete che in qualche modo dovrebbero essere canoniche e quindi aspettarsi che un'implementazione di quelle sia corretta e accettabile. L'ho visto rimpiazzato con Scrum, e un bel gioco, dico. Il semplice fatto è che la natura mutevole delle esigenze e dei desideri del cliente rende ogni specifica fissa effettivamente inutile; l'unico modo per affrontare veramente correttamente il problema è con un approccio iterativo. Non che Scrum sia un proiettile d'argento, ovviamente; L'ho visto abusato e abusato molte, molte volte. Ma batte la cascata.


3
Ditelo al mio cliente ... Sto scrivendo qualcosa di inutile "Sono un programmatore con una sfera di cristallo, quindi so esattamente come sarà il mio progetto di basso livello tra 6 mesi" documento delle specifiche :)
Igor Brejc

36

Mai schiantarsi.

Sembra una buona idea, non è vero? Agli utenti non piacciono i programmi che si bloccano, quindi scriviamo programmi che non si bloccano e agli utenti dovrebbe piacere il programma, giusto? È così che ho iniziato.

Al giorno d'oggi, sono più propenso a pensare che se non funziona, non dovrebbe fingere che funzioni. Fallisci il prima possibile, con un buon messaggio di errore. Se non lo fai, il tuo programma andrà in crash ancora più difficile solo poche istruzioni dopo, ma con qualche errore anonimo di puntatore nullo che richiederà un'ora per il debug.

Il mio pattern preferito per "non andare in crash" è questo:

public User readUserFromDb(int id){
    User u = null;
    try {
        ResultSet rs = connection.execute("SELECT * FROM user WHERE id = " + id);
        if (rs.moveNext()){
            u = new User();
            u.setFirstName(rs.get("fname"));
            u.setSurname(rs.get("sname"));
            // etc
        }
    } catch (Exception e) {
        log.info(e);
    }
    if (u == null){
        u = new User();
        u.setFirstName("error communicating with database");
        u.setSurname("error communicating with database");
        // etc
    }
    u.setId(id);
    return u;
}

Ora, invece di chiedere ai tuoi utenti di copiare / incollare il messaggio di errore e inviarlo a te, dovrai immergerti nei log cercando di trovare la voce di log. (E poiché hanno inserito un ID utente non valido, non ci sarà alcuna voce di registro.)


Qual è la probabilità che l'utente ti dia il messaggio di errore effettivo, rispetto ai tuoi registri che producono il problema? (Molto basso in questo caso particolare, ma gli utenti non citano quasi mai i messaggi di errore!) Li leggono?
Arafangion

1
Ammetto che la possibilità è bassa che un utente casuale ti invii il messaggio di errore, ma la possibilità è diversa da zero (esempio banale: a volte usi la tua app) e alcuni utenti imparano con il tempo cosa copiare / incollare. Non sto dicendo che non dovresti accedere (dovresti), ma quando l'app è rotta, è rotta. Mostrare un messaggio di errore è molto meglio, molto più onesto per l'utente che fingere che il nome dell'utente sia "errore di comunicazione con il database" (o anche peggio, nullo la stringa vuota).
gustafc

C'è un NullReferenceException sulla linea due
oɔɯǝɹ

Grazie, oɔɯǝɹ, l'ho aggiustato. (Anche se era un po 'più allegro con esso: tutti questi problemi per evitare eccezioni e altri "arresti anomali", e comunque si è bloccato incondizionatamente.)
gustafc

33

Ho pensato che avesse senso applicare modelli di design ogni volta che li ho riconosciuti.

Non sapevo che stavo effettivamente copiando stili da linguaggi di programmazione stranieri, mentre il linguaggio con cui stavo lavorando consentiva soluzioni molto più eleganti o più semplici.

L'uso di più lingue (molto) diverse mi ha aperto gli occhi e mi ha fatto capire che non devo applicare male le soluzioni di altre persone a problemi che non sono miei. Adesso rabbrividisco quando vedo il pattern factory applicato in un linguaggio come Ruby.


2
Per favore scusa la mia ignoranza del rubino, ma perché non dovremmo usare il modello di fabbrica con esso?
Mike Chamberlain

Non un rubyist qui, ma la fabbrica deve evitare di dipendere da un'implementazione, ma ruby ​​è dinamico e puoi deridere o stub qualsiasi cosa. Quindi non dipendi davvero da un'implementazione.
Stéphane

27

Test ossessivo. Ero un fervente sostenitore dello sviluppo test-first. Per alcuni progetti ha molto senso, ma mi sono reso conto che non solo è irrealizzabile, ma piuttosto dannoso per molti progetti aderire pedissequamente a una dottrina di scrittura di unit test per ogni singola funzionalità.

In realtà, aderire pedissequamente a qualsiasi cosa può essere dannoso.


22
Funziona abbastanza bene per i cirripedi.
MusiGenesis

La copertura del test deve essere proporzionale al beneficio. Tutto ciò che fai deve davvero mostrare un vantaggio. La copertura del 100% non ti darà molto. differenza da 80 o 90 in una forma che non è in uno scenario di supporto vitale / lancio di missili.
Spence

+1 dipendenza dal test di unità rispetto al test.
Preet Sangha

25

Questa è una piccola cosa, ma: preoccuparsi di dove vanno le parentesi graffe (sulla stessa riga o sulla riga successiva?), Lunghezza massima suggerita delle righe di codice, convenzioni di denominazione per le variabili e altri elementi di stile. Ho scoperto che tutti sembrano preoccuparsi di questo più di me, quindi mi limito a seguire il flusso di chiunque stia lavorando al giorno d'oggi.

Modifica: L'eccezione a questo è, ovviamente, quando sono io quello a cui importa di più (o quello in grado di impostare lo stile per un gruppo). In tal caso, faccio quello che voglio!

(Nota che questo non è la stessa cosa che non avere uno stile coerente. Penso che uno stile coerente in una base di codice sia molto importante per la leggibilità.)


5
Qualcuno ha dato un voto negativo, ma penso che sia una prospettiva pratica. Qual è il miglior stile del codice? Non importante. Cerca su e giù nello stesso file e duplicalo.
Frank Schwieterman

12
Il miglior stile del codice è qualunque sia lo standard per quel negozio.
David Thornley

Ecco perché adoro le opzioni di formattazione automatica in Visual Studio. Non importa come gli altri sviluppatori abbiano scritto il codice, faccio solo un formato veloce ed è esattamente come mi piace ... la maggior parte delle volte.
corymathews

5
@cory: questo non rovina la capacità del tuo software di controllo della versione di mostrarti la differenza tra le versioni del file che hai appena riformattato?
Steve Melnikoff

Ecco perché sono un po 'attratto dall'apprendimento di Python ... per pensare che devo solo preoccuparmi di ciò su cui sono impostati i miei tabstop e non degli stili di rinforzo. È un po 'avvincente.
Chris K

24

Forse la più importante "pratica di programmazione" su cui ho cambiato idea da allora è l'idea che il mio codice sia migliore di quello di chiunque altro. Questo è comune per i programmatori (soprattutto per i neofiti).


20

Librerie di utilità. Ero solito portare in giro un assembly con una varietà di metodi e classi di supporto con la teoria che avrei potuto usarli da qualche altra parte un giorno.

In realtà, ho appena creato un enorme spazio dei nomi con molte funzionalità mal organizzate.

Ora, le lascio semplicemente nel progetto in cui le ho create. Con ogni probabilità non ne avrò bisogno e, se lo avrò, potrò sempre rifattorizzarle in qualcosa di riutilizzabile in seguito. A volte li contrassegno con un // TODO per una possibile estrazione in un assembly comune.


12
C'è una buona citazione (al momento non riesco a trovare l'originale) che era qualcosa sulla falsariga di "non pensare nemmeno di creare una routine generica finché non hai dovuto risolvere lo stesso problema 3 volte.
DaveR

9
"Tre colpi e tu refactoring" - Refactoring di Martin Fowler. La regola del tre , pagina 58.
Nick Dandoulakis

20

Progettare più di quanto ho programmato. Dopo un po ', si trasforma in paralisi da analisi.


44
Di tanto in tanto invoco la frase "Se trovi che stai pensando troppo, fermati e fallo. Se scopri che stai facendo troppo, fermati e pensa".
Neil N

È carino, ma quanto è troppo?
Hamish Grubijan

Troppa dipendenza da UML (Useless Modeling Language). E di tanto in tanto ha i suoi usi. Ma una volta che vedo qualcuno iniziare a disegnare diagrammi di classe e predicare i benefici di "quanto sarebbe fantastico generare codice dai diagrammi", allaccio le mie scarpe da corsa. Inoltre, Visual Studio ha un generatore di diagrammi di classi interattivo integrato che fa tutto automaticamente e funziona come l'esploratore di oggetti su crack.
Evan Plaice

15

L'uso di un DataSet per eseguire la logica di business. Questo lega troppo strettamente il codice al database, inoltre il DataSet viene solitamente creato da SQL, il che rende le cose ancora più fragili. Se l'SQL o il database cambia, tende a ricadere su tutto ciò che tocca il DataSet.

Esecuzione di qualsiasi logica aziendale all'interno di un costruttore di oggetti. Con l'ereditarietà e la capacità di creare costruttori sovraccarichi tendono a rendere difficile la manutenzione.


15

Abbreviazione di variabile / metodo / tabella / ... Nomi

Lo facevo tutto il tempo, anche quando lavoravo in lingue senza limiti imposti sulla lunghezza dei nomi (beh, probabilmente erano 255 o qualcosa del genere). Uno degli effetti collaterali sono stati molti commenti disseminati in tutto il codice che spiegano le abbreviazioni (non standard). E, naturalmente, se i nomi fossero cambiati per qualsiasi motivo ...

Ora preferisco di gran lunga chiamare le cose per quello che sono realmente, con buoni nomi descrittivi. incluse solo le abbreviazioni standard . Non è necessario includere commenti inutili e il codice è molto più leggibile e comprensibile.


Sì, devo amare questi tipi di dichiarazioni: void Foo (x1, y, x2, y2, p, r, j) ... WTF ?!
Ed S.

O peggio (e sì, l'ho visto davvero), Foo(int arg0, String arg1, float arg2)ecc.
Mac

14

Racchiudere i componenti di accesso ai dati esistenti, come Enterprise Library, con un livello personalizzato di metodi di supporto.

  • Non semplifica la vita a nessuno
  • È più codice che può contenere bug
  • Molte persone sanno come utilizzare i componenti di accesso ai dati EntLib. Nessuno tranne il team locale sa come utilizzare la soluzione di accesso ai dati interna

14

Ho sentito parlare per la prima volta della programmazione orientata agli oggetti mentre leggevo di Smalltalk nel 1984, ma non avevo accesso a un linguaggio oo fino a quando non ho usato il compilatore C ++ cfront nel 1992. Alla fine ho avuto modo di usare Smalltalk nel 1995. Avevo atteso con impazienza oo tecnologia, e ha acquisito l'idea che avrebbe salvato lo sviluppo del software.

Ora, vedo oo solo come una tecnica che ha alcuni vantaggi, ma è solo uno strumento nella cassetta degli attrezzi. Svolgo la maggior parte del mio lavoro in Python e spesso scrivo funzioni autonome che non sono membri di una classe e raccolgo spesso gruppi di dati in tuple o elenchi dove in passato avrei creato una classe. Creo ancora classi quando la struttura dei dati è complicata o ho bisogno di comportamenti associati ai dati, ma tendo a resistere.

In realtà sono interessato a fare un po 'di lavoro in Clojure quando ho tempo, che non fornisce servizi oo, sebbene possa utilizzare oggetti Java se capisco correttamente. Non sono pronto a dire qualcosa come oo è morto, ma personalmente non sono il fan che ero.


13

In C #, utilizzando _notation per i membri privati. Ora penso che sia brutto.

Poi sono passato a this.notationper membri privati, ma ho scoperto che non ero coerente nell'usarlo, quindi ho abbandonato anche quello.


29
Sto ancora usando _notation e penso che sia fantastico.
Arnis Lapsa

3
Odio _notation; Uso ThisNotation per i membri pubblici e thisNotation per i membri privati.
Callum Rogers

Lo odio anche io. Mi confonde :(
Broken_Window

4
Non sono d'accordo. Rende molto più facile gestire i nomi. Utilizzare PascalCase per le proprietà o membri pubblici / interni, _UnderscorePascalCase per i membri esposti tramite una proprietà e camelCase per i nomi dei parametri in metodi / costruttori e membri privati. La parola chiave "this" è necessaria solo se è necessario passare il riferimento della classe corrente al di fuori della classe o è necessario accedere a un membro generato automaticamente all'interno della classe (come nome, controlli, ecc ...).
Evan Plaice

@Evan: Faccio esattamente quello che stai descrivendo tranne l'ultima parte. Tendo a usare thiso Me(rispettivamente C # e VB.NET) quando chiamo metodi e proprietà. IMO, rende il mio codice più facile da leggere e comprendere in seguito, soprattutto quando ci sono quattro o più oggetti all'interno di quel particolare ambito.
Alex Essilfie

11

Ho smesso di seguire il metodo di progettazione raccomandato dall'università prima dell'implementazione. Lavorare in un sistema caotico e complesso mi ha costretto a cambiare atteggiamento.

Ovviamente faccio ancora ricerche sul codice, specialmente quando sto per toccare un codice che non ho mai toccato prima, ma normalmente cerco di concentrarmi su implementazioni il più piccole possibile per ottenere qualcosa prima. Questo è l'obiettivo principale. Quindi affina gradualmente la logica e lascia che il design appaia da solo. La programmazione è un processo iterativo e funziona molto bene con un approccio agile e con molto refactoring.

Il codice non guarderà affatto come avevi pensato inizialmente. Succede ogni volta :)


10

Ero grande nel design-by-contract. Ciò significava mettere un sacco di controllo degli errori all'inizio di tutte le mie funzioni. I contratti sono ancora importanti, dal punto di vista della separazione delle preoccupazioni, ma piuttosto che cercare di imporre ciò che il mio codice non dovrebbe fare, cerco di utilizzare i test unitari per verificare cosa fa.


Mi è stato insegnato a programmare in questo modo. Naturalmente, mi è stato insegnato da un insegnante di matematica HS, quindi suppongo abbia senso che volesse che le sue funzioni si autoverificassero.
Alex

10

Userei static in molti metodi / classi perché era più conciso. Quando ho iniziato a scrivere test quella pratica è cambiata molto rapidamente.


10

Eccezioni verificate

Un'idea straordinaria sulla carta: definisce il contratto in modo chiaro, senza possibilità di errore o dimenticanza di verificare alcune condizioni di eccezione. Sono stato venduto quando ne ho sentito parlare per la prima volta.

Naturalmente, in pratica si è rivelato un tale casino. Al punto da avere oggi librerie come Spring JDBC, che nasconde le eccezioni verificate legacy come una delle sue caratteristiche principali.


9

Che qualcosa di utile fosse codificato solo in una lingua particolare. Nel mio caso credevo che il C fosse il miglior linguaggio in assoluto e non ho mai avuto motivo di codificare nulla in nessun'altra lingua ... mai.

Da allora ho imparato ad apprezzare molte lingue diverse e i vantaggi / funzionalità che offrono. Se voglio codificare qualcosa di piccolo - velocemente - userei Python. Se voglio lavorare su un progetto di grandi dimensioni, dovrei scrivere codice in C ++ o C #. Se voglio sviluppare un tumore al cervello, codificherei in Perl .


8

Quando ho dovuto fare un po 'di refactoring, ho pensato che fosse più veloce e più pulito iniziare subito e implementare il nuovo design, fissando le connessioni fino a quando non funzionavano. Poi ho capito che è meglio fare una serie di piccoli refactoring per progredire lentamente ma in modo affidabile verso il nuovo design.


posso ricordare il numero di volte che questo mi ha morso ....
Preet Sangha

8

Forse la cosa più grande che è cambiata nelle mie pratiche di codifica, così come in altre, è l'accettazione di classi esterne e librerie scaricate da Internet come base per comportamenti e funzionalità nelle applicazioni. A scuola all'epoca in cui frequentavo il college eravamo incoraggiati a capire come migliorare le cose tramite il nostro codice e fare affidamento sul linguaggio per risolvere i nostri problemi. Con i progressi in tutti gli aspetti dell'interfaccia utente e del consumo di servizi / dati, questa non è più una nozione realistica.

Ci sono alcune cose che non cambieranno mai in una lingua e avere una libreria che racchiude questo codice in una transazione più semplice e in meno righe di codice che devo scrivere è una benedizione. La connessione a un database sarà sempre la stessa. La selezione di un elemento all'interno del DOM non cambierà. L'invio di un'e-mail tramite uno script lato server non cambierà mai. Dover scrivere questa volta spreca tempo che potrei usare per migliorare la mia logica di base nell'applicazione.


7

Inizializzazione di tutti i membri della classe.

Ho usato per inizializzare esplicitamente ogni membro della classe con qualcosa, di solito NULL. Mi sono reso conto che questo:

  • normalmente significa che ogni variabile viene inizializzata due volte prima di essere letta
  • è sciocco perché nella maggior parte delle lingue inizializza automaticamente le variabili su NULL.
  • effettivamente impone un leggero calo delle prestazioni nella maggior parte delle lingue
  • può gonfiare il codice su progetti più grandi

4
A volte, però, le conseguenze di NON inizializzare tutti i membri della classe possono davvero morderti in un $$.
muusbolla

A meno che tu non stia utilizzando un linguaggio basato su prototipi che crea nuove istanze mediante la clonazione. L'inizializzazione di tutti i membri può davvero farti risparmiare un sacco di problemi.
Wojciech Bederski

6

Come te, ho anche abbracciato i modelli IoC nel ridurre l'accoppiamento tra i vari componenti delle mie app. Rende la manutenzione e lo scambio di parti molto più semplici, purché riesca a mantenere ogni componente il più indipendente possibile. Sto anche utilizzando più framework relazionali a oggetti come NHibernate per semplificare le faccende di gestione del database.

In poche parole, sto usando framework "mini" per aiutare a creare software in modo più rapido ed efficiente. Questi mini-framework consentono di risparmiare molto tempo e, se eseguiti correttamente, possono rendere un'applicazione estremamente semplice da mantenere lungo la strada. Plug 'n Play per vincere!


-1 Non sopporto la proliferazione di IoC e framework. Disaccoppiare bene, IoC e framework = complessità inutile
Paul Hollingsworth

Come puoi lodare il disaccoppiamento e tuttavia odiare l'IoC e altri framework? Questo è ciò che fanno molti framework IoC e modelli di progettazione per cominciare.
ajawad987
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.