1. Convalida dell'input:
* Controllo del tipo di dati: Assicurarsi che gli input siano del tipo di dati previsto (intero, stringa, galleggiante, ecc.). Non fidarti di input dell'utente o dati da fonti esterne implicitamente.
* Controllo dell'intervallo: Verificare che gli input numerici rientrassero in gamme accettabili. Ad esempio, una quantità non può essere negativa.
* Controllo di lunghezza: Limitare la lunghezza delle stringhe per prevenire gli overflow del tampone o altri problemi.
* Controllo del formato: Confermare che gli input sono conformi a un formato specifico (ad es. Indirizzo e -mail, data).
* Sanitizzazione: Rimuovere o sfuggire ai caratteri potenzialmente dannosi (ad es. Tag HTML, caratteri di iniezione SQL) dagli ingressi dell'utente prima di elaborarli.
2. Gestione degli errori:
* Gestione delle eccezioni (TRY-ELCECT BLOCSS): Utilizzare la gestione delle eccezioni strutturate per catturare e gestire con grazia errori previsti (come il file non trovato, problemi di connessione di rete, input non valido) prevenzione degli arresti anomali del programma.
* Asserzioni: Usa le dichiarazioni `Assert` per verificare le condizioni che * dovrebbero * essere sempre vere. Se un'asserzione non riesce, indica un errore di programmazione. Le asserzioni sono principalmente per il debug.
* Codici di ritorno/Flag di errore: Le funzioni possono restituire codici o flag specifici per indicare successo o diversi tipi di guasto.
* Registrazione: Registrare eventi, inclusi errori e avvertimenti, a un file di registro per successive analisi e debug. Questo è cruciale per identificare i problemi negli ambienti di produzione.
3. Impostazioni predefinite di Fail-Safe:
* Valori predefiniti: Fornire valori predefiniti sensibili per variabili o parametri quando gli ingressi sono mancanti o non validi.
* Meccanismi di fallback: Implementare strategie alternative o meccanismi di fallback quando le operazioni primarie falliscono (ad esempio, utilizzando un valore memorizzato nella cache se una query di database non riesce).
4. Gestione delle risorse:
* Chiusura delle risorse corretta: Assicurarsi che risorse come file, connessioni di rete e connessioni di database siano adeguatamente chiuse anche se si verificano errori (utilizzando infine blocchi o costrutti simili). Ciò impedisce le perdite delle risorse.
* Gestione della memoria: Prestare attenzione all'allocazione della memoria e all'allocazione per prevenire perdite di memoria e puntatori penzolanti.
5. Codice semplicità e leggibilità:
* Design modulare: Rompi le attività complesse in moduli più piccoli e ben definiti per rendere il codice più facile da comprendere, testare e mantenere.
* Nomi significativi: Utilizzare la variabile descrittiva e i nomi delle funzioni per migliorare la leggibilità del codice e semplificare la comprensione della logica.
* Commenti e documentazione: Aggiungi commenti chiari e concisi per spiegare parti complesse del codice e del suo scopo.
6. Test:
* Test unitario: Prova singoli componenti o funzioni del programma in isolamento.
* Test di integrazione: Prova come funzionano i componenti diversi insieme.
* Test di regressione: Testare il programma dopo aver apportato modifiche per garantire che la funzionalità esistente non sia stata rotta.
* Analisi del valore limite: Prova il programma con input ai bordi di gamme valide.
* Test di stress: Testare il programma con elevati volumi di dati o condizioni insolite.
Le tecniche di programmazione difensiva aggiungono sovraccarico in termini di tempo di sviluppo e complessità del codice. Tuttavia, la robustezza e l'affidabilità migliorate del software risultante di solito superano di gran lunga questo costo, in particolare nelle applicazioni critiche in cui i guasti possono avere gravi conseguenze.
Programmazione © www.354353.com