Questa domanda su quando usare il privato e quando usare la protezione in classe mi ha fatto riflettere. (Estenderò questa domanda anche alle classi e ai metodi finali, poiché è correlata. Sto programmando in Java, ma penso che questo sia rilevante per ogni linguaggio OOP)
Una buona regola empirica è: rendere tutto il più privato possibile.
- Rendi tutte le classi definitive a meno che non sia necessario sottoclassarle immediatamente.
- Rendi definitivi tutti i metodi a meno che non sia necessario sottoclassarli e sovrascriverli immediatamente.
- Rendi definitivi tutti i parametri del metodo, a meno che non sia necessario modificarli all'interno del corpo del metodo, il che è comunque un po 'imbarazzante la maggior parte delle volte.
Questo è piuttosto semplice e chiaro, ma cosa succede se scrivo principalmente librerie (Open Source su GitHub) anziché applicazioni?
Potrei nominare molte librerie e situazioni, dove
- Una libreria è stata estesa in un modo che gli sviluppatori non avrebbero mai pensato
- Questo doveva essere fatto con "magia caricatore di classi" e altri hack a causa dei vincoli di visibilità
- Le librerie sono state utilizzate in un modo per cui non sono state costruite e il modo in cui le funzionalità necessarie sono state "hackerate"
- Le librerie non possono essere utilizzate a causa di un piccolo problema (bug, funzionalità mancante, comportamento "errato") che non può essere modificato a causa della ridotta visibilità
- Un problema che non poteva essere risolto ha portato a soluzioni alternative enormi, brutte e buggy in cui l'esclusione di una funzione semplice (che era privata o finale) avrebbe potuto aiutare
E in realtà ho iniziato a nominare questi fino a quando la domanda è diventata 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 regge questo se il codice deve essere utilizzato da altri sviluppatori, dove è improbabile che lo sviluppatore originale abbia pensato in anticipo a ogni possibile caso d'uso e che le modifiche / i refactor siano difficili / impossibili da realizzare?
Dato che le grandi biblioteche open source non sono una novità, qual è il modo più comune di gestire la visibilità in tali progetti con linguaggi orientati agli oggetti?