Questa domanda su quando utilizzare private e quando utilizzare protetto in classi mi ha fatto pensare. (Estenderò questa domanda anche alle classi e ai metodi finali, poiché è correlata. Sto programmando in Java, ma penso che questo sia rilevante per ogni lingua OOP)
A good rule of thumb is: make everything as private as possible.
- Make all classes final unless you need to subclass them right away.
- Make all methods final unless you need to subclass and override them right away.
- Make all method parameters final unless you need to change them within the body of the method, which is kinda awkward most of the times anyways.
Questo è abbastanza semplice e chiaro, ma cosa succede se sto principalmente scrivendo librerie (Open Source su GitHub) invece di applicazioni?
Potrei nominare un sacco di librerie e situazioni, dove
- Una biblioteca è stata estesa in un modo che gli sviluppatori non avrebbero mai pensato
- Questo doveva essere fatto con "class loader magic" e altri hack a causa dei vincoli di visibilità
- Le librerie sono state utilizzate in un modo per il quale non sono state create e la funzionalità necessaria "hacked" in
- Non è stato possibile utilizzare le librerie a causa di un piccolo problema (bug, funzionalità mancante, comportamento "errato") che non è stato possibile modificare a causa della visibilità ridotta
- Un problema che non poteva essere risolto ha portato a soluzioni alternative enormi, brutte e infestate in cui la possibilità di ignorare una funzione semplice (privata o finale) avrebbe potuto aiutare
E in effetti ho iniziato a nominarli finché la domanda non è stata troppo lunga e ho deciso di rimuoverli.
Mi piace l'idea di non avere più codice del necessario, più visibilità del necessario, più astrazione del necessario. E questo potrebbe funzionare quando si scrive un'applicazione per l'utente finale, in cui il codice viene utilizzato solo da chi lo scrive. Ma come reagisce se il codice è destinato ad essere utilizzato da altri sviluppatori, dove è improbabile che lo sviluppatore originale pensasse a tutti i possibili casi d'uso in anticipo e che i cambiamenti / i refattori siano difficili / impossibili da realizzare?
Poiché le grandi librerie open source non sono una novità, qual è il modo più comune di gestire la visibilità in tali progetti con linguaggi orientati agli oggetti?