Dipende da dove ti trovi nel ciclo di sviluppo, ma a volte quando si disegna un algoritmo, si vuole fare astrazione su blocchi complessi senza implementarli subito.
def full_algo():
init_stuff()
process_stuff()
...
Sai come funziona init_stuff
, è piuttosto semplice nella tua testa ma non ne hai davvero bisogno subito, quindi lo dichiari come una funzione vuota. Permetterà al tuo codice di compilare ed eseguire senza preoccuparsi dei dettagli cruenti.
Un altro uso per le applicazioni rilasciate è quando si utilizza l'ereditarietà. Supponiamo di avere una classe estesa che definisce il comportamento del codice specifico della piattaforma. Potresti finire con una logica simile a questa:
init_filesystem();
access_files();
release_filesystem();
Questo codice funzionerà su molte piattaforme, ma alcune piattaforme potrebbero non aver bisogno dell'inizializzazione del filesystem. Quindi la tua ereditarietà sarà simile a questa (virtuale con = 0 in C ++ significa semplicemente che le classi derivate DEVONO implementare questi metodi):
class FileSystem{
virtual void init_filesystem() = 0;
virtual void access_files() = 0;
virtual void release_filesystem() = 0;
};
Quindi una particolare implementazione di questa classe (interfaccia) potrebbe non fare nulla per alcuni di questi metodi. In alternativa, la classe base potrebbe dichiarare metodi vuoti per init / release invece di dichiararli virtuali.
Finalmente (e vergognosamente), a volte si mantiene un'applicazione molto vecchia. Temete che l'eliminazione dei metodi possa rompere le cose. Questo accade quando si ha un'eredità complessa che non è propriamente compresa o quando si hanno molti indicatori di funzione (callback). Basta eliminare il codice all'interno di essi in modo che vengano chiamati comunque senza rompere nulla.