DOMANDA Come scrivere un codice pulito?

Pubblicità

Hero467

Utente Attivo
Messaggi
695
Reazioni
406
Punteggio
75
Salve a tutti,
facendo esaminare un mio programma ad un mio amico è venuto fuori che programmo male, difatti quel programma (da 150 righe e più) il mio amico l'ha riscritto in meno di 40.
La mia domanda è: dove, e soprattutto come posso imparare a scrivere un codice pulito e leggibile? Io ho imparato a programmare così da un misto di vari forum, YouTube, libri ed esaminando codice da me e ricostruendone la funzione, quindi i miei programmi sono scritti in modo disordinato e senza una logica, ma non riesco a capire come imparare a scrivere un codice decente.
 
Ah, “clean code”. Non è semplice, non esiste UN metodo, esiste tutta una serie di metodi e ci hanno scritto tonnellate e tonnellate di articoli e libri (anche romanzi). E non tutti sono in accordo sulla importanza e priorità.
Un buon libro di referenza è chiamato appunto “Clean Code” del famoso Robert Martin. È un po’ datato ma è un buon punto di partenza, e non so se sia tradotto in italiano (mi spiace, ma più di entra nei dettagli e più si trova documentazione solo in inglese).
È comunque un concetto molto vasto che non si può trattare in un semplice messaggio in un forum. Sappi comunque che è un punto cardine della programmazione, aziende serie hanno tutta una serie di concetti chiave a cui occorre aderire. Io personalmente seguo molto il concetto di programmazione SOLID che venne introdotta per la programmazione ad oggetti, ma che è valida in generale.
Io avevo intenzione di scrivere piccole guide in questo forum per introdurre ai concetti base per scrivere “buon” codice (ho usato gli apici intenzionalmente ) ma mi sono fermato dopo la prima (come scegliere buoni nomi a variabili e funzioni, la trovi nella lista delle guide)
Prima di tutto, ripeto, non è facile, è qualcosa che si impara con il tempo. È quasi un’arte.
 
Salve a tutti,
facendo esaminare un mio programma ad un mio amico è venuto fuori che programmo male, difatti quel programma (da 150 righe e più) il mio amico l'ha riscritto in meno di 40.
La mia domanda è: dove, e soprattutto come posso imparare a scrivere un codice pulito e leggibile? Io ho imparato a programmare così da un misto di vari forum, YouTube, libri ed esaminando codice da me e ricostruendone la funzione, quindi i miei programmi sono scritti in modo disordinato e senza una logica, ma non riesco a capire come imparare a scrivere un codice decente.

Se il codice di quell’amico tuo che la fatto in 40 righe è complicato da modificare è meglio il tuo peggio da 150 righe che il suo….

Mi spiego meglio , la definizione di codice pulito e leggibile non si misura in base al numero di righe ma un giorno, qualcuno metterà mano al tuo codice per lavorarci sopra e continuare il lavoro dove ti lo hai lasciato, per assurdo meglio avere un codice pessimo male leggibile che uno perfetto ma illeggibile..


Inviato da iPhone tramite App ufficiale di Tom\'s Hardware Italia Forum
 
La cosa ideale comunque sarebbe avere le tue 150 righe e le sue 40 per vedere modifiche e correzioni. Capire (eventuali) tuoi errori di concetto e iniziarti a spiegare quelli ?
 

Misure della complessità del codice​


Derivano dall'analisi del codice statico sono:

  • Lines of code LOC
  • Livelli di nidificazione NL
  • Complessita ciclomatica McCabe
  • complessità halstead
  • Accoppiamento
  • Coesione
  • Duplicazione del codice
  • Punti funzione

Ci sono anche quelle relative alll'analisi dinamica
  • Code coverage
  • Bugs per linee di codice
  • Feature
Puoi provare a dare un occhiata a queste misure. La loro comprensione ti porterà a scrivere codice più pulito
 
Grazie a tutti per le risposte.
I due codici sono questi:
Python:
from random import *

def sceltafilm():
    genres = ['animazione', 'avventura', 'azione', 'biografico', 'giallo', 'grottesco', 'mitologico', 'noir', 'politico', 'poliziesco', 'sentimentale', 'spionggio', 'sportivo', 'storico', 'commedia', 'drammatico', 'erotico', 'pornografico', 'fantascienza', 'fantasy', 'guerra', 'horror', 'thriller', 'western']
    a = str(input('Vuoi procedere con l\'estrazione del genere? [S/N]\n'))
    if a.lower() == 's':
        b = choice(genres)
        print('\nIl genere estratto è', b)
        z = int(input('\n\nVuoi procedere con la scelta del film (1) o vuoi cambiare genere (2)? [1/2]\n'))
        if z == 1:
            print('\n')
            if b == 'animazione':
                films = ['\nInside Out']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'avventura':
                films = ['Jumanji']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'azione':
                films = ['Bourne']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'biografico':
                films = ['Bohemian Rhapsody']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'giallo':
                films = ['Assassinio sull\'Orient Express']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'grottesco':
                films = ['Meglio di no, abbiamo anime sensibili qui dentro']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'mitologico':
                films = ['Percy Jackson']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'noir':
                films = ['Non c\'è nulla di decente dal 2000in poi, e dubito vogliate vedere film in bianco e nero']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'politico':
                films = ['Ok che eravamo in periodo di elezioni fino a poco fa, ma per carità di Dio']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'poliziesco':
                films = ['Gli Intoccabili']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'sentimentale':
                films = ['']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'spionaggio':
                films = ['Mission: Impossible 1']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'sportivo':
                films = ['Coach Carter']

                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'storico':
                films = ['L\'Ultimo Samurai']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'commedia':
                films = ['']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'drammatico':
                films = ['NO']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'erotico':
                films = ['Per carità']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'pornografico':
                films = ['PER CARITÀ']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'fantascienza':
                films = ['Ready Player One']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'fantasy':
                films = ['']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'guerra':
                films = ['Salvate il soldato Ryan']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'horror':
                films = ['Il centipede uma... scherzo, fa schifo pure a me']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'thriller':
                films = ['Passengers']

                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
            elif b == 'western':
                films = ['Lasciamo perdere']
                def filmchoice():
                    c = choice(films)
                    print(c)
                filmchoice()
        elif z == 2:
            sceltafilm()
        else:
            print(z, 'non è un termine valido. Inserisci 1 o 2')
            sceltafilm()
    else:
        exit()

sceltafilm()

Questo è il mio, che come vedete è lungo e molto ripetitivo, e alla lunga annoia durante la comprensione


Python:
from random import *

genres = {
    'animazione': ['animazione1','animazione2','animazione3',],
    'avventura': ['avventura1', 'avventura2','avventura3'],
    'azione': ['azione1', 'azione2', 'azione3'],
    'biografico': ['biografico1','biografico2','biografico3'],
    'giallo': ['giallo1', 'giallo2', 'giallo3'],
    'grottesco': ['grottesco1','grottesco2','grottesco3'],
    'mitologico': ['mitologico1','mitologico2','mitologico3'],
    'noir': ['noir1', 'noir2', 'noir3'],
    'politico': ['politico1', 'politico2', 'politico3'],
    'poliziesco': ['poliziesco1','poliziesco2','poliziesco3'],
    'sentimentale': ['sentimentale1','sentimentale2','sentimentale3'],
    'spionaggio': ['spionggio1', 'spionggio2', 'spionggio3'],
    'sportivo': ['sportivo1','sportivo2', 'sportivo3'],
    'storico': ['storico1', 'storico2','storico3'],
    'commedia': ['commedia1', 'commedia2', 'commedia3'],
    'drammatico': ['drammatico1','drammatico2', 'drammatico3'],
    'erotico': ['erotico1', 'erotico2', 'erotico3'],
    'pornografico': ['pornografico1', 'pornografico2', 'pornografico3'],
    'fantascienza': ['fantascienza1', 'fantascienza2', 'fantascienza3'],
    'fantasy': ['fantasy1', 'fantasy2', 'fantasy3'],
    'guerra': ['guerra1', 'guerra2', 'guerra3'],
    'horror': ['horror1', 'horror2', 'horror3'],
    'thriller': ['thriller1', 'thriller2', 'thriller3'],
    'western': ['western1', 'western2', 'western3']
}

try:
    a = sample(list(genres), 1)[0]
    print('Il genere estratto è', a)
    b = input('Vuoi procedere con l\'estrazione del film? [S/N]\n')
    if b.lower() == 's':
        c = choice(genres[a])
        print('Il film estratto è', c)
except TypeError:
    pass

Mentre questo è quello del mio amico (modificato un po' da me per sistemare alcune cose e aggiungerne altre) e fa esattamente la stessa cosa del mio, ma risulta molto più leggibile e meno ripetitivo
 
Ok, la differenza principale è che il tuo amico ha strutturato i dati prima di lavorarci.

Ha capito prima di che struttura aveva bisogno. Direi che la differenza l'ha fatta la capacità di analizzare il problema più che la qualità nella scrittura del codice. In questo caso è solo una conseguenza.
 
certamente risolvibile, come ha fatto notare @Tidus88 in questo caso è solo una questione di formattare i dati in maniera opportuna, in modo che siano pronti per la loro elaborazione. Non per nulla ormai si usano database (che sono fatti per quello) per qualsiasi applicazione ormai, ormai costano poco, alcuni sono gratuiti, ed esistono anche versioni embedded che possono essere usati per scopo personale.
Quello di cui hai bisogno è un corso di come strutturare i dati, e imparare gli strumenti che mettono a disposizione i vari linguaggi, chi è agli inizi impara solo i vettori, che vanno bene solo per una vera limitata serie di applicazioni. Senza usare database, molti linguaggi mettono a disposizione liste, collezioni, dizionari e intere librerie per usarli, incluso sofisticati metodi di ricerca. Ormai il lavoro del programmatore è cercare di scrivere meno codice possibile.
 
Pubblicità
Pubblicità
Indietro
Top