Nella costruzione software orientata agli oggetti di Meyer (1988) definisce il principio aperto / chiuso come segue:
- A module will be said to be open if it is still available for extension. For example, it should be possible to add fields to the data structures it contains, or new elements to the set of functions it performs.
- A module will be said to be closed if it is available for use by other modules. This assumes that the module has been given a well-defined, stable description (the interface in the sense of information hiding).
Continua dicendo:
If you reopen a module, you must also reopen all its clients to update them, since they rely on the old version. … [This problem] arises every time a module must be extended by a new function or data element, triggering changes in direct and indirect clients. ... With classical approaches to design and programming, there is no way to write modules that are both open and closed.
La soluzione di Meyer a questo dilemma è: non estendere mai un modulo di libreria modificando le classi esistenti; invece, scrivi un nuovo modulo che sottoclassi le classi esistenti e che i nuovi client dipendano da quel nuovo modulo.
Ora, nel 1988, stavo scrivendo programmi giocattolo (procedurale) in Turbo Pascal e Blankenship Basic, e la mia esperienza professionale del 21 ° secolo è sulla JVM, sul CLR e in lingue dinamiche, quindi non so cosa intendeva Meyer con "approcci classici al design e alla programmazione".
L'esempio concreto di Meyer dei perché i moduli client devono essere riaperti (un'istruzione switch su un'enumerazione che ora ha più membri, che richiede più casi) sembra abbastanza ragionevole, ma non giustifica quasi la asserzione che ogni volta aggiungi funzionalità a un modulo di libreria, devi aggiornare tutti i suoi clienti .
C'è una ragione storica per cui questa affermazione sembrava ovvia nel 1988? Per esempio, l'aggiunta di funzioni o strutture dati a una libreria statica C modificava il layout in modo tale che anche con le API compatibili con le versioni precedenti, i client dovevano essere ricompilati? Oppure Meyer sta davvero parlando di un meccanismo per rafforzare la compatibilità con le versioni precedenti delle API?