2010-01-29 10 views
43

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?

+0

[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

risposta

44

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à.

+4

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

+0

Comprerò questo. Credi che le classi C# dovrebbero essere sigillate di default? –

+14

@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. –

5

Sì. Se non altro è un cartello che permette agli altri di non andare più avanti.

10

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)

+1

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

7

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.

Problemi correlati