Devo sigillare tutte le classi che non dovrebbero mai essere utilizzate come classe base anche quando non ci sono tangibili prestazioni o problemi di sicurezza, o è solo aggiungendo cruft?Devo sigillare tutte le classi che non dovrei mai usare come classe base?
risposta
Una classe che è estensibile implementa la funzione che può essere estesa - è una funzionalità come qualsiasi altra funzionalità della classe e deve essere considerata come una, non diversa da un metodo. Tutte le funzionalità dovrebbero essere pensate attentamente per garantire che soddisfino gli obiettivi del cliente che utilizza la funzione. Le caratteristiche devono essere progettate, implementate, revisionate per problemi di sicurezza, debuggate, documentate e mantenute.
Tutto ciò che costa uno sforzo, e lo sforzo di solito richiede l'esborso di denaro. Di chi stai spendendo? Potrebbero avere un'opinione sull'opportunità o meno di svolgere questa funzione.
In sostanza, sono disponibili tre opzioni:
1) spendere i soldi per fare la funzione in modo da avere la fiducia che sia corretto, robusto, sicuro e soddisfa le esigenze degli utenti.
2) fare nessuna delle precedenti, ma spedire la funzione in ogni caso e sperare che la spedizione di una rapida attuazione privi di documenti, funzione undesigned,, non testato, non più mantenuto con rischi per la sicurezza sconosciuti non ti danneggia, il vostro datore di lavoro o ai vostri clienti.
3) Sigillare la classe. Sconfiggerlo più tardi se trovi che (1) era la scelta giusta.
Dico che (3) è un buon rapporto qualità-prezzo. Sigillo sempre ogni classe che scrivo che non sia stata progettata per l'estensibilità.
Eric, Ecco una domanda per voi.Proprio come si deve dichiarare un metodo 'virtuale' prima di poterlo sovrascrivere, perché C# non ha adottato qualcosa di simile per indicare che una classe può essere ereditata e sigillarla per impostazione predefinita. Solo curioso. – SolutionYogi
Comprerò questo. Credi che le classi C# dovrebbero essere sigillate di default? –
@Daniel, @SolutionYogi: Vorrei averlo fatto. Tuttavia, in realtà sono in minoranza; ci sono molte persone che credono che dovresti sigillare le lezioni solo quando hai una ragione per farlo. Non sono d'accordo; Penso che dovresti solo disfare lezioni quando hai una ragione per farlo. –
Sì. Se non altro è un cartello che permette agli altri di non andare più avanti.
L'impostazione di una classe da sealed
non è cruft poiché ciò impone una regola rigorosa nel codice: questa classe non può essere ereditata.
Il codice è solo cruft se non è necessario e confuso.
Detto questo, una scuola di pensiero (e semplice regola empirica) è che devi sempre sigillare tutte le classi poiché è facile annullarle se necessario ma non viceversa. Alcuni generatori di codice lo fanno automaticamente. (Vedi sopra l'opzione n. 3 di Eric Lippert. Fondamentalmente dice la stessa cosa)
Come quasi ogni risposta su come fare le cose, dipende. Ci sono alcune ottimizzazioni che possono essere acquisite sigillando le classi per impostazione predefinita e solo se si interrompe quando necessario. Date un'occhiata a: http://msdn.microsoft.com/en-us/library/ms998547.aspx http://dotnetperls.com/sealed-1 – Firestrand
Non considererei affatto l'aggiunta di cruft. Invece stai chiaramente esprimendo le tue intenzioni per la classe.
Le classi devono essere progettate per ereditarietà o essere sigillate. Sfortunatamente, le classi non sono sigillate per impostazione predefinita in C#, quindi devi includere tu stesso la parola chiave. Personalmente, avrei preferito una parola chiave per rendere esplicitamente le classi disponibili per l'ereditarietà, poiché ciò impedirebbe alle persone di utilizzare una classe come classe base, a meno che non fosse esplicitamente contrassegnata come tale.
- 1. Sigillare una classe
- 2. Devo dichiarare tutte le funzioni virtuali in una classe base?
- 3. Perché dovrei usare le classi in python?
- 4. C# Perché non dovrei mai usare le coroutine?
- 5. Devo implementare IDisposable su tutte le classi o è sufficiente una classe base?
- 6. Che classe dovrei usare per Date in Android?
- 7. jquery rimuove tutte le classi dalla classe
- 8. Come comprimere tutte le classi che delinea in Visual Studio
- 9. Toolkit Gui, che dovrei usare?
- 10. Che cosa gacutil.exe dovrei usare?
- 11. dovrei nominare tutte le mie classi astratte AbstractFoo
- 12. Devo smettere di usare classi/interfacce di base astratte e usare invece boost :: function/std :: function?
- 13. Come dovrei nominare le mie classi CSS?
- 14. Come trovare tutte le classi che implementano IDisposable?
- 15. Perché non dovrei usare Unity?
- 16. Se la classe Base è contrassegnata Serializable sono contrassegnate anche tutte le classi figlie?
- 17. in PHP, quando dovrei usare metodi statici o classi astratte?
- 18. Come trovare tutte le classi che implementano una determinata interfaccia?
- 19. Come controllare tutte le classi sotto o usando una classe?
- 20. Come enumerare tutte le classi con attributo di classe personalizzato?
- 21. Devo usare davvero le chiavi esterne?
- 22. Quando non dovrei usare le espressioni regolari?
- 23. Devo usare std :: default_random_engine o dovrei usare std :: mt19937?
- 24. Dove devo inserire la classe base vuota?
- 25. Istanziare tutte le classi che implementano un'interfaccia specifica
- 26. Trovare tutte le classi che implementano un'interfaccia specifica
- 27. Singleton - Perché usare le classi?
- 28. Perché non dovrei usare System.out.println() in android
- 29. Quando dovrei usare package-private in Java?
- 30. Che tipo di collezione dovrei usare?
[Somone ha detto, e ho letto:] (http://programmers.stackexchange.com/a/210481/4261) non * mai * sigillare una classe a meno che * so * non abbia problemi di supporto con i tuoi clienti – cregox