È possibile rendere il codice lungo che rappresenta un calcolo più facile da leggere?


9

I metodi lunghi sono generalmente considerati cattivi, tuttavia nel mio codice ho alcuni metodi lunghi di difficile comprensione (più di 50 righe). Ho difficoltà a rendere più facili da leggere quei metodi perché una singola istruzione all'interno è già lunga più di 50 righe e quella singola istruzione difficile da leggere è costruire una query di database usando un ORM per fare un lavoro specifico in cui il lavoro svolto è chiaramente indicato sul nome del metodo. Il motivo per cui l'istruzione è così lunga perché si unisce su più colonne, applica più posizioni e seleziona più colonne distinte per creare un formato di output documentato richiesto.

Tale codice difficile da leggere è considerato un codice errato? Allo stesso modo, se scrivo codice per un algoritmo complicato che risulta in un codice difficile da leggere racchiuso in un metodo ben definito, quel codice è un codice errato?


Non c'è un modo per parametrizzare la query in qualche modo? Immagino che questa query vari a seconda di ciò che sta accadendo all'interno del metodo che crea. Forse puoi dividerlo in pezzi più piccoli e costruirlo in più passaggi per facilitare la lettura.
Zalomon,

Il tuo ORM supporta le visualizzazioni? È possibile estrarre un (gruppo di) join in una vista e quindi selezionare la vista. Anche se la vista non viene utilizzata altrove, ciò può aiutare a spezzare una grande istruzione SQL
Caleth,

Il tuo ORM supporta un linguaggio di query simile a SQL? In caso affermativo, è possibile spostare la query nel proprio file e abilitare l'evidenziazione della sintassi IDE. Nella tua applicazione carica la query dal file. Se il tuo IDE non supporta esattamente quel linguaggio di query specifico, potresti andare d'accordo con la formattazione SQL anche se potrebbe non essere perfetto. Tuttavia la leggibilità è ampiamente aumentata da una buona formattazione. Questo ha anche il vantaggio che è facile copiare la query su uno scratchpad e apportare modifiche lì.
SpaceTrucker,

Risposte:


17

Hai scritto

Un codice così difficile da leggere è considerato un codice errato?

quindi sei assolutamente d'accordo sul fatto che sia un codice difficile da leggere , e se è difficile da leggere, è difficile da mantenere ed evolvere - quindi immagino che consideri il codice come "cattivo" dalle tue stesse misure. Tuttavia, a volte non è ovvio come migliorare qualcosa come un'istruzione SQL a 50 righe. I semplici refactoring del "metodo di estrazione" non funzionano e probabilmente non hai idea di dove iniziare a rendere il codice più leggibile. In questi casi, puoi ancora provare una o tutte le seguenti

  • mostra il codice a qualcun altro che ha più esperienza di te nella pulizia del codice. Se non hai qualcuno nella tua organizzazione che puoi chiedere, prova codereview.stackexchange

  • prova a google per il problema specifico. Per il tuo esempio, cose come "clean up long sql statement" potrebbero essere un buon inizio. Rimarrai stupito dal numero di articoli che trovi su quell'argomento e anche se non riesci a trovare una ricetta intricata per il tuo caso, potresti avere delle idee originali

  • invece di chiedere una giustificazione per le cose che non puoi fare, concentrati sulle cose che puoi fare per ripulire il codice almeno un po ', come aggiungere le giuste interruzioni di riga, il rientro corretto, aggiungere alcuni commenti esplicativi, dare ad alcune variabili un migliore nome. Non è improbabile, durante questo processo, costringendoti a rileggere i dettagli del codice, trovi un modo per riformattare il codice in unità più piccole

  • pratica, pratica, pratica. "Clean coding" non è qualcosa che impari in un giorno, diventa più facile con più esperienza. Forse non trovi una soluzione al tuo problema oggi, ma quando torni al codice tra qualche mese, ti sembrerà diverso.


In qualche modo non sono d'accordo con la parte dei commenti, se esiste una parte complessa del codice che è complessa perché non può essere diversamente E non ha trovato il modo di semplificarlo, è improbabile che i commenti forniscano un quadro generale di ciò che viene fatto. Documentarlo con qualche diagramma sarebbe molto meglio. E un commento che si riferisce a tale documentazione esterna dovrebbe essere lasciato. Naturalmente, tale situazione deve essere eccezionale perché sappiamo tutti che raramente viene eseguita la documentazione esterna, quindi meno è, meglio è. Per il resto, una buona risposta come sempre.
Walfrat,

@Walfrat: la mia intenzione era quella di fornire una linea guida generale sul processo, non esclusivamente per "50 righe di codice SQL", e non come soluzione "pronta all'uso" con tutti i potenziali approcci.
Doc Brown,

Lo so, volevo solo suggerire che se qualcosa dopo essere stato rivisto più volte non potesse essere abbastanza semplificato (qualunque cosa sia), molto probabilmente i commenti non aiuteranno ciò che rende questa cosa complessa, quindi sarà probabilmente richiesta una documentazione esterna minima. Nel caso specifico dell'interrogazione del database questo è ancora più semplice mostrando un diagramma che mostra come ogni parte della query è correlata tra loro.
Walfrat,

4

Difficile da leggere non è male - inutilmente difficile da leggere è cattivo.

Alcune cose sono difficili. In tal caso, devi comprendere completamente il problema, scrivere il codice e commentarlo il più bene possibile in modo che il prossimo sviluppatore abbia una possibilità.

Ma alcune cose sono difficili solo perché le hai rese difficili. Se il problema può essere semplificato e semplificato, semplificarlo. Se è difficile da capire ma può essere ragionevolmente suddiviso in sottoproblemi, quindi dividerlo in sottoproblemi per semplificarlo.


Esattamente. Fai del tuo meglio per rendere il codice auto-documentante, quindi usa i commenti per colmare le lacune. (a cura: dopo aver pubblicato il mio commento mi sono reso conto che l'OP faceva riferimento alle query del database ORM, non a SQL.)
Kyle A

1

ORM per creare un rapporto? Sul serio? Impara un po 'di SQL, amico. I linguaggi procedurali sono terribili in questo genere di cose.

SQL è un linguaggio molto meglio progettato per gestire join e selezioni complicate. E anche se non riesci a far sembrare bello l'SQL, ci sono tutti i tipi di strumenti di visualizzazione disponibili in cui puoi trascinare e rilasciare oggetti di database su un diagramma e l'SQL verrà generato per te. Per non parlare del fatto che sarai in grado di ottimizzare e ottimizzare la query, visualizzare il suo piano di query, ottenere la piattaforma per suggerire ulteriori opzioni di indicizzazione, ecc. È solo molto più flessibile.

Sono sicuro che alcune persone qui non saranno d'accordo con me, ma ORM non è adatto per scopi di reporting complicati. Se possibile, prenderei in considerazione l'idea di allontanarmi da quello e di spostarmi verso il linguaggio delle query strutturate .


2
Onestamente, il fatto che non ti piacciano gli ORM è del tutto irrilevante per la domanda.
Doc Brown,

Mi piacciono gli ORM. Sto affermando che non sono un buon strumento quando il codice "si unisce su più colonne, applica più posizioni e seleziona più colonne distinte per creare un formato di output documentato richiesto", che è l'argomento di questo thread.
John Wu,

0

In generale il codice difficile da leggere è una cattiva idea ovunque - anche se sei l'unico manutentore - ho avuto diverse occasioni di tornare ad alcuni codici anni o addirittura settimane dopo e trovarmi difficile farmi girare la testa.

Se devi fare molto in una singola query, prova a suddividerla su più righe con commenti incorporati:

query(join(map(condition1, condition2), blah, blah, something(bah, blah, blah))) 

diventa:

// Why are we doing such an awful single query rather than a sequence of selects?
query( // Description of query
  join( // Why are you doing a join here
    map( // Why a map
      condition1, // What is this
      condition2  // And this
   ), // End Map
   blah, // What, Why?
   blah, // What, Why?
   something( // What does this do?
      bah, // What, Why?
      blah, // What, Why?
      blah // What, Why?
      ) // End Something
   ) // End Join
) // End Query

Sono ambiguo riguardo al tuo esempio. i commenti dovrebbero spiegare perché il codice è come è. Quello che dovrebbe essere espresso dagli identificatori ...
Timothy Truckle,

@TimothyTruckle Concordo sul fatto che gli identificatori dovrebbero identificare chiaramente ciò che sono, ma a tutti spesso non sono chiari nel codice normale - nel caso dei nomi dei campi dei record c'è spesso una mancanza di chiarezza a causa di vincoli storici che ho riscontrato casi in cui i nomi dei campi erano limitati a 5 caratteri che dovevano essere tutti lettere maiuscole ASCII e non potevano essere modificati a causa dei requisiti di compatibilità, ad esempio con lo strumento di reporting preferito degli MD.
Steve Barnes,

0

Oltre all'eccellente risposta di @ DocBrown, penso che valga la pena riconoscere che nessuno scrive codice "buono" in ogni momento. La codifica sta facendo dei compromessi e spesso è meglio accettare di aver scritto qualcosa di un po 'meno pulito di quello che vorresti e tornarci più tardi. Il refactoring è il processo di miglioramento del codice nel tempo - e nella mia esperienza, questo è ciò che rende una buona base di codice, non "ottenerlo giusto la prima volta".

E tu valuti il ​​codice a livello dell'applicazione, non a livello di singoli metodi / linee di codice. Quindi, se hai un metodo complesso, ma ha un nome chiaro, non penso che tu abbia un codice "cattivo" fintanto che il metodo è coerente.

La denominazione è l'arma più grande che hai nel rendere intelligibile il codice: dai un nome al tuo metodo che consente alle persone che leggono il codice di saltare il corpo se necessario. Assegna un nome alle tue variabili ecc. In modo tale che i lettori possano vedere ciò che rappresentano senza dover leggere le loro dichiarazioni di assegnazione.

La prossima cosa è assicurarsi che il tuo metodo faccia davvero solo una cosa: gli effetti collaterali rendono il codice difficile da capire. Quindi, se il tuo metodo restituisce dati per un formato di output, non dovrebbe anche aggiornare lo stato del tuo database su "stampato", o altro.

La stratificazione / componentizzazione è la prossima cosa che potresti fare - se hai un sacco di metodi complessi che generano risultati ORM, raggruppali insieme in modo che i lettori del tuo codice possano assumere che si comportino tutti allo stesso modo, senza effetti collaterali ecc.

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.