In Meyer Object-Oriented Software Construction (1988) definisce il principio aperto / chiuso come segue:
- Si dirà che un modulo sarà aperto se è ancora disponibile per l'estensione. Ad esempio, dovrebbe essere possibile aggiungere campi alle strutture dati che contiene o nuovi elementi all'insieme di funzioni che esegue.
- Si dirà che un modulo sarà chiuso se è disponibile per l'uso da parte di altri moduli. Questo presuppone che al modulo sia stata data una descrizione ben definita e stabile (l'interfaccia nel senso di nascondere le informazioni).
Continua dicendo:
Se riapri un modulo, devi anche riaprire tutti i suoi client per aggiornarli, poiché fanno affidamento sulla versione precedente. ... [Questo problema] si presenta ogni volta che un modulo deve essere esteso da una nuova funzione o elemento dati, innescando cambiamenti nei client diretti e indiretti. ... Con approcci classici alla progettazione e alla programmazione, non c'è modo di scrivere moduli sia aperti che chiusi.
La soluzione di Meyer a questo dilemma è: non estendere mai un modulo di biblioteca modificando le classi esistenti; scrivere invece un nuovo modulo che subclasse le classi esistenti e fare in modo che i nuovi client dipendano da quel nuovo modulo.
Ora, nel 1988, stavo scrivendo programmi giocattolo (procedurali) in Turbo Pascal e Blankenship Basic, e la mia esperienza professionale del 21 ° secolo è sulla JVM, il CLR e in linguaggi dinamici, quindi non so cosa significasse Meyer con "approcci classici alla progettazione e alla programmazione".
Un esempio concreto di Meyer del motivo per cui i moduli client devono essere riaperti (un'istruzione switch su un'enumerazione che ora ha più membri, che richiedono più casi) sembra abbastanza ragionevole, ma non giustifica quasi l'asserzione che ogni volta che si aggiunge funzionalità a una libreria modulo, è necessario aggiornare tutti i suoi client .
C'è una ragione storica per cui questa affermazione sembrava evidente nel 1988? Ad esempio, l'aggiunta di funzioni o strutture di dati a una libreria statica C ha cambiato il layout in modo tale che, anche con le API compatibili con le versioni precedenti, i client dovevano essere ricompilati? O Meyer sta davvero parlando di un meccanismo per imporre la retrocompatibilità delle API?