Tranquilli, non ho assolutamente intenzione di scrivere un post in cui metto a confronto .NET e C++, dicendo quale è meglio e quale è peggio... Su questo argomento è già stato scritto di tutto . Vorrei invece fare una riflessione sulla diverse "filosofie di programmazione" che seguo quando lavoro in C++ rispetto a quando uso .NET.
Come i miei 25 lettori sanno bene, nell'ultimo anno ho accumulato una certa esperienza con .NET, accompagnata dal conseguimento di diverse certificazioni. Anche i lavori che ho fatto finora hanno sempre riguardato questa piattaforma. Ultimamente, però, nella mia nuova società sto affrontando un progetto abbastanza grosso in C++: avendo a che fare con puntatori, allocazione esplicita della memoria, debugger il cui edit & continue spesso è un edit & restart, mi viene da pensare a come è diverso il modo in cui mi approccio alla scrittura di un programma in .NET rispetto a quello che sto utilizzando adesso in C++.
In .NET, so che posso contare sul garbage collector, quindi sulla gestione automatica della memoria: se creo un nuovo oggetto con una new, devo solo ricordarmi di richiamarne il metodo Dispose, nel caso in cui esso implementi l'interfaccia IDisposable. Per il resto, ci pensa il garbage collector a liberare la memoria occupata, quando ce ne è bisogno. Poi, ho a disposizione una Base class library sconfinata, contenente oggetti per le necessità più disparate, dalla spedizione delle mail alla gestione dei thread, allo sviluppo di Web service... Ancora, se commetto un errore nel codice (accesso ai metodi di un oggetto non inizializzato, recupero di elementi da un array oltre l'upper-bound, ..), il meccanismo delle eccezioni di .NET mi dice esattamente dove si è verificato il problema, fornendomi un nome che mi permette di identificarlo con estrema facilità.
In C++, invece, le cose sono molto diverse... Quando si alloca un oggetto con la new, spesso bisogna indicare espressamente quanta memoria riservargli; inoltre, se essa non viene liberata con delete, rimarrà allocata per tutta la durata del processo. Poi, se ci sono problemi con i puntatori o si cerca di accedere ad una zona di memoria non inizializzata, spesso si ottengono messaggi di errore generici del tipo "xxx.exe ha cercato di accedere alla zona di memoria 0x0432542978. La memoria non poteva essere letta", che di per sé non sono di molto aiuto (e magari, in questi casi, l'editor si apre su un file .H che fa parte del runtime del C++, quindi senza dare indicazioni del punto in cui si è verificato il problema).
Conscio di queste cose, mi sono reso conto che, quando lavoro con il C++, sono in qualche modo portato a ragionare di più su quello che sto scrivendo, perché so che, se commetto un errore, potrebbe essere difficile individuarlo in seguito. Mi capita quindi di rileggere più volte quello che ho scritto e di avviare l'esecuzione solo quando sono ragionevolmente sicuro della correttezza del codice.
Seguendo tale approccio, ultimamente mi capita di scrivere codice abbastanza complesso che funziona già al primo tentativo. Con questo non voglio assolutamente tessere le mie lodi, anzi, in qualche modo è una auto-critica... Quando lavoro in .NET, infatti, non appena ho terminato un algoritmo sono portato a premere F5 per verificare che faccia il suo lavoro, perché penso: "tanto se c'è un problema, il compilatore mi dirà esattamente dove si trova, e il debugger mi fornirà un controllo completo su quello che sta succedendo". In altre parole, so che .NET mi dà strumenti molto potenti per il debug delle applicazioni, quindi ne approfitto, forse troppo... E proprio la mia recente esperienza con il C++ mi hai aiutato a capirlo... Spero vivamente di farne tesoro!
Technorati Tag:
.NET,
Programming