Infine, la fase di progettazione dovrebbe venire prima della fase di implementazione a prescindere. Prima di iniziare a programmare dovresti avere una visione chiara di quali saranno le interazioni tra le tue classi e, auspicabilmente, le tue decisioni sull'interfaccia saranno ovvie.
Tuttavia, se hai già scritto una classe e ora devi refactoring per avere un'interfaccia, tieni presente che l'interfaccia sta semplicemente selezionando un insieme di funzioni/metodi che hanno uno scopo comune che sarà necessario da più di una classe. Se trovi che ci sono alcune funzioni utili con le altre classi necessarie, allora quei metodi sarebbero buoni candidati per un'interfaccia.
Un'altra parte delle interfacce che li rende davvero utili è che se ci sono certe parti della tua classe che non sono private, ma che vuoi nasconderle da certi altri oggetti, in tal caso, puoi prendere le funzioni vuoi esposto, e fagli un'interfaccia.
Non sono d'accordo con chi dice che non si dovrebbe progettare in anticipo. Tutti i programmatori amano immergersi direttamente in esso e, a volte, è necessario eseguire il refactoring, ma una fase di progettazione avanzata consentirà di risparmiare enormi quantità di tempo di refactoring in un secondo momento.
Sì. Ho anche molta più fortuna nell'estrarre "interfacce" (nel senso di Java) dalle classi esistenti piuttosto che progettarle in anticipo. Ma d'altra parte, disegno sempre una classe individuale dall'interno verso l'esterno - conosco l'API prima dell'implementazione. – emk
Dato che lavoro in Python, non ci sono interfacce formali in stile Java. Tuttavia, spesso accade che è necessario elevare alcune funzionalità di alcune classi per identificarle come visibili e importanti, come un'interfaccia Java. –