|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jun 2002
Città: Roma
Messaggi: 795
|
Regole di Buona Programmazione C
Ciao a tutti
volendo esaminare un programma a oggetti e decidere se è ben fatto ho vari parametri su cui applicare metriche... coesione, accoppiamento, modularità, incapsulamento ecc volendo fare la stessa cosa su un programma C, per esempio, cosa dovrei andare a guardare? prescindendo dalle regole tipo indentare, commentare, nomi intelligenti di variabili mi servirebbe qualcosa da cui poter estrapolare qualche metrica o, addirittura, qualche metrica già pronta. Sapete darmi un ![]() thank you!
__________________
PC: Pentium dual core E5200 su ASUS P5K SEe/EPU, 2GB ram, Nvidia GeForce 9600 GSO, Hdd Western Digital 500Gb, ..... |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: May 2004
Città: Treviso
Messaggi: 154
|
Potresti spiegarti meglio?
Nel senso...cosa ti interessa sapere di preciso? Quali sono alcune buone norme di programmazione pulita e leggibile? |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: May 2005
Città: Bari
Messaggi: 349
|
innanzitutto vedrei i prototipi delle funzioni...un'occhiata veloce al main per vedere se è "snello" e subito un salto alle definizioni delle funz....immediatamente un esame delle variabili...vedere se sono giusti i passaggi (riferimento o valore)..vedere se sono superflui alcuni puntatori...
per il resto non credo si possa veder molto.. Vito
__________________
Si può vincere una guerra in due...o forse anche da solo. Si può estrarre il cuore anche al più nero assassino, ma è più difficile cambiare un'idea! |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jun 2002
Città: Roma
Messaggi: 795
|
io ti dò il codice sorgente di un sw
e tu da quello devi vedere se è stato ben scritto. però non a livello di indentazione ma a livello di progettazione per esempio in un OO vai a vedere le classi come sono fatte, l'incapsulamento, la modularità e tutti i vari (conosciutissimi) parametri di buona programmazione OO. per un non OO come il C però mi trovo in difficoltà ![]() grazie per l'interessamento
__________________
PC: Pentium dual core E5200 su ASUS P5K SEe/EPU, 2GB ram, Nvidia GeForce 9600 GSO, Hdd Western Digital 500Gb, ..... |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jun 2002
Città: Roma
Messaggi: 795
|
Quote:
ti ringrazio, qualche pista me l'hai data ![]()
__________________
PC: Pentium dual core E5200 su ASUS P5K SEe/EPU, 2GB ram, Nvidia GeForce 9600 GSO, Hdd Western Digital 500Gb, ..... |
|
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: May 2004
Città: Treviso
Messaggi: 154
|
Sono proprio tordo!
Beh sì, come detto da mapomapo, controlla bene il passaggio parametri alle funzioni, ma verifica anche la correttezza del tipo di ritorno. Aggiungerei di fare molta attenzione ai puntatori e all'uso che ne fai. Se utilizzi la new per allocare variabili dinamicamente sullo heap, ricordati che poi dovrai disalloccarle! Non è per nulla buona cosa lasciare spazzatura! Sempre riguardo ai puntatori (e anche a ciò che fai restituire dalle funzioni), attento ai puntatori penzolanti, ovvero che puntano ad aree di memoria che vengono disallocate. Attento anche a rispettare i limiti degli eventuali array. In genere è da evitarsi l'utilizzo dei break o diciture simili, che possono rendere il codice più imprevedibile, incontrollabile e meno leggibile. Di buona norma viene anche insegnato l'utilizzo di variabili di appoggio per controllare meglio alcune situazioni come per esempio l'uscita da un ciclo...anche se a volte, a mio parere, può andare un po' a scapito dell'ottimizzazione. Altra buona cosa è appunto l'ottimizzazione del codice, ma questo è un passo in più che viene dopo (o con) la correttezza. In ogni caso, al di là dei commenti, è importante che il codice sia leggibile! L'ottimizzaione può aiutare in questo, ma a volte può anche rendere più difficoltoso il tutto. Se mi viene in mente altro te lo dico... spero intanto di non averti detto banalità. Ciaooo |
![]() |
![]() |
![]() |
#7 | ||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
|
Quote:
Quote:
|
||
![]() |
![]() |
![]() |
#8 |
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Veramente il passaggio "per puntatore" si è sempre chiamato per "riferimento", dai tempi immemori della nascita del C. Tant'è che ottenere un valore da un puntatore si chiama "dereferencing", inoltre un puntatore null'altro è che un riferimento vero e proprio. Passaggio per riferimento e per puntatore sono la stessa identica cosa. "Per riferimento" si riferisce al concetto, "per puntatore" si riferisce all'implementazione, ma entrambe le notazioni definiscono sempre lo stesso concetto.
Ultima modifica di mjordan : 13-03-2007 alle 00:18. |
![]() |
![]() |
![]() |
#9 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
|
Quote:
|
|
![]() |
![]() |
![]() |
#10 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
|
altra cosa che mi è venuta in mente per testare la qualità di un sorgente: controllare che la convenzione di scrittura sia coerente. controllare che le parentesi graffe abbiano sempre la stessa posizione e indentazione rispetto al codice precedente e successivo, controllare che nei nomi delle variabili l'iniziale sia sempre o maiuscola o minuscola, controllare opzionalmente l'uso di prefissi ungheresi (dato che si parla di C...), controllare che i nomi di macro siano tutti maiuscoli, controllare l'uso coerente delle andature a capo (in particolare controllare che un ; di fine istruzione sia sempre seguito da un fine riga), eccetera eccetera.
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jun 2002
Città: Roma
Messaggi: 795
|
Grazie a tutti!!
avete confermato alcune mie idee e me ne avete date altre (preziose) grazie 1000 davvero. Per quanto in teoria il passaggio perpuntatore e riferimento sia qlc di diverso, a quanto ne so io, si tende a dare lo stesso significato ai due (per puntatore) grazie ancora!!
__________________
PC: Pentium dual core E5200 su ASUS P5K SEe/EPU, 2GB ram, Nvidia GeForce 9600 GSO, Hdd Western Digital 500Gb, ..... |
![]() |
![]() |
![]() |
#12 | |
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
Codice:
#include <stdio.h> void swap(int * x, int * y) { int temp; temp = *x; *x = *y; *y = temp; } int main(void) { int i = 3, j = 5; printf("Prima di swap(): i = %d, j = %d\n", i, j); swap(&i, &j); printf("Dopo di swap(): i = %d, j = %d\n", i, j); return 0; } ![]() Non so cosa abbiano scritto K&R, comunque il loro "non esiste" significa che il C non ha una sintassi "dedicata" per il passaggio per riferimento (come ad esempio il pascal che distingue fra function e procedure) e che quindi si deve "realizzare" mediante i puntatori. Chiamalo come ti pare, il passaggio per riferimento in C è possibile ergo esiste. Il loro "non esiste" probabilmente si riferisce a questioni implementative, che però a noi in questo caso non interessano (in fondo passare per valore un puntatore implica la non esistenza del riferimento ma la possibilità di ottenerlo in ogni caso). In parole povere, meno teoria e piu' pratica ![]() Ultima modifica di mjordan : 13-03-2007 alle 08:38. |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
Quote:
passaggio per riferimento_v2.0? e cmq tu passi il valore del puntatore, non un riferimento al puntatore. Non ci sono cazzi fra teoria e pratica. |
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Codice:
funzione( x ); Codice:
funzione( &x ); EDIT: e comunque anche in C++, quando passi per riferimento, viene passato un valore. Che sia un indirizzo o un dato sempre valore é ![]() Ma non penso che l'autore del 3d voleva discutere di questo
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve Ultima modifica di trallallero : 13-03-2007 alle 13:06. |
|
![]() |
![]() |
![]() |
#15 | ||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
|
Quote:
Codice:
void funzione(int x); Codice:
void funzione(float x); Quote:
|
||
![]() |
![]() |
![]() |
#16 | |||
Member
Iscritto dal: May 2004
Città: Treviso
Messaggi: 154
|
Prima di tutto premetto che quando ho seguito il corso di Programmazione 1, ci è stato detto chiaramente "studieremo la parte C di C++", infatti spesso e volentieri ci è stata negata la possibilità di sfruttare alcune caratteristiche del c++. Tuttavia abbiamo studiato sia il passaggio per valore che quello per riferimento. (mi domando allora se sia realmente possibile o no utilizzare entrambi su c)
Bene, veniamo ai due tipi di passaggio parametri... Passaggio per Valore: 1) Il passaggio per valore consiste nel passare alla funzione un valore o anche una espressione qualunque che ritorni un valore. La funzione riceverà appunto un valore attraverso il suo parametro formale, ma le modifiche apportate su di esso non avranno alcuna ripercussione all'esterno della funzione e muoriranno all'uscita da essa, perché fatte su una variabile locale alla funzione. L'unica speranza di trasmettere qualcosa all'esterno è sfruttare il return. Quote:
2) Sempre riguardo al passaggio per valore, è possibile passare per valore puntatori a variabili, attraverso dei quali la funzione potrà cambiare i valori delle variabili puntate. Ovviamente i parametri passati alla funzione dovranno rispettare i tipi, ovvero fornire un indirizzo! Quote:
Da notare che dentro scambia, a e b sono due variabili locali della funzione, definite come puntatori ad interi che ricevono l'indirizzo di un intero. Passaggio per Riferimento: Lo stesso effetto che si ha sfruttando il passaggio per valore di un puntatore, lo si può ottenere con il passaggio di parametri per riferimento per avere side-effect sul chiamante della funzione. Ogni modifica fatta sui parametri formali della funzione,a vrà ripercussione sui parametri attuali passati alla funzione. Quote:
Osservazioni Sebbene il passaggio per riferimento e quello per valore di puntatore, permettano di esercitare modifiche sulle variabili passate dal chiamante, sono in realtà due approcci molto diversi! Tutto sta nel capire che una variabile è composta di due parti: l-valore ed r-valore. L' l-valore corrisponde all'indirizzo in memoria della variabile, ovvero ciò che ci permette di raggiungerla. L' r-valore è invece il contenuto vero e proprio della variabile. int x=10; // r-valore=10, l-valore= un qualche indirizzo in memoria (0x****) Quando si parla di puntatori, ecco che un puntatore è una variabile che ovviamente ha il suo l-valore, ma in cui l' r-valore contenuto in esso corrisponde ad un indirizzo in memoria di un'altra variabile, perciò un l-valore!!! Concludendo La differenza tra passaggio parametri per valore o per riferimento sta in fatti nel passare alla funzione un r-valore oppure un l-valore. Nel caso del passaggio di un valore, la cosa è scontata. Nel caso del passaggio del valore di un puntatore, non si fa che passare appunto l' r-valore della variabile puntatore, che corrisponde poi ad un indirizzo in memoria. Nel caso invece di passaggio per riferimento, si passa invece un l-valore. Spero di essere stato esauriente... e scusate per la lunghezza ![]() |
|||
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
![]() ma non stavate parlando di sintassi, é ovvio che quella é diversa
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
se passi per riferimento in c++, non passi il valore ma la variabile. Ha tutto un altro significato. Passi il contenitore del valore, non il valore.
|
![]() |
![]() |
![]() |
#19 | |
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#20 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
|
sintatticamente sono semplicemente due cose diverse. sintatticamente in C un riferimento non esiste neanche. ciò che tu riesci a trovare tra le due cose è solo una (corretta) analogia concettuale/funzionale. ma fermo rimane che parlare di riferimento in C crea confusione quando si introduce il discorso dei references in C++, e per questo sarebbe più corretto evitare le analogie concettuali e (giusto per rimanere sempre nell'ambito della più pratica e meno teoria) parlare solo in termini sintattici.
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:16.