Quanto spesso viene usata l'ereditarietà?

5

Ammetto di essere uno sviluppatore junior e finora ho creato solo applicazioni web semplici in ASP.NET MVC. Ma non ho mai dovuto usare l'aspetto dell'ereditarietà della programmazione orientata agli oggetti nelle mie classi! È vero che nell'utilizzo di ASP.NET MVC I utilizza inavvertitamente l'ereditarietà (qualsiasi controller creato da me erediterà dalla classe del controller di base), ma mi riferisco qui all'utilizzo consapevole dell'eredità nella progettazione di un particolare sistema Web.

È perché sono un cattivo programmatore? O potrebbe essere che l'ereditarietà entri in gioco solo in determinati scenari? Non fraintendermi, capisco cos'è l'ereditarietà e come codificare l'ereditarietà se necessario.

Proprio non riesco a trovare uno scenario per usarlo su. Fondamentalmente, mi chiedo quanto spesso viene utilizzato in programmazione OO in generale.

    
posta J86 16.03.2013 - 01:14
fonte

5 risposte

11

L'ereditarietà viene utilizzata sempre durante la scrittura di codice orientato agli oggetti. Nella maggior parte dei linguaggi OO, (con C ++ è un'eccezione prominente), tutti gli oggetti hanno una singola classe "oggetto base" da cui derivano funzionalità comuni, quindi letteralmente tutto che utilizza un oggetto utilizza l'ereditarietà.

Al di là di quel punto ovvio, ci sono molte volte in cui scoprirai che hai bisogno di diversi tipi di oggetti che condividono molti tratti importanti in comune. L'ereditarietà è molto utile qui. Ad esempio, se hai mai costruito una GUI in un linguaggio orientato agli oggetti, probabilmente hai usato un framework in cui tutti i controlli grafici avevano una classe genitore comune che gestiva una serie di funzionalità che tutti i controlli nel sistema di finestre che eseguivano sulla necessità di coprire. E se lavori con l'analisi o la generazione del codice, (che sono fondamentalmente due lati della stessa moneta) ti imbatterai in altri esempi dove è utile una classe base con un gruppo di classi derivate.

È vero che l'ereditarietà non è l'unico modo per far funzionare gli oggetti insieme; puoi anche usare la composizione, (dove un oggetto contiene un altro oggetto di un tipo diverso), che funziona meglio in alcuni casi. Stai attento a considerare questo come un dogma , però. L'ereditarietà è uno strumento molto utile se sai cosa stai facendo. Così è la composizione, e nessuno di loro è davvero un buon sostituto per l'altro. L'importante è sapere cosa stai facendo, e se non lo fai, impara, sperimenta e sviluppa le tue conoscenze e le tue abilità. (E sentiti libero di fare domande qui o StackOverflow!)

    
risposta data 16.03.2013 - 01:47
fonte
4

Sapere quando utilizzare l'ereditarietà e quando utilizzare altre funzionalità della lingua in cui si sta lavorando richiede tempo. Ci sono molti modi diversi per affrontare lo stesso problema e l'eredità è solo uno strumento di molti a tua disposizione.

La divulgazione di linguaggi orientati agli oggetti potrebbe far credere che sia il modo migliore per scrivere e riutilizzare il codice, ma anche il primo paragrafo dell'articolo di Wikipedia sull'eredità OOP sottolinea che la composizione è il modo preferito e più flessibile per riutilizzare il codice .

Quindi per rispondere alla tua domanda, non sei una cattiva programmazione per non usarla tutto il tempo. Come ha detto Doc Brown, è usato troppo spesso come soluzione a un problema quando invece è possibile utilizzare la composizione.

    
risposta data 16.03.2013 - 01:32
fonte
4

Hai già riconosciuto che frequenti usi ereditarietà. Quello che stai veramente chiedendo è perché non hai mai bisogno di creare la tua nuova base classe.

La ragione è che le classi base tendono a essere create più spesso in strutture, librerie e nelle prime fasi di un progetto quando l'architettura è appena definita. Questi tipi di attività tendono a essere assegnati a programmatori più esperti, ma potrebbero anche non creare molte nuove classi base nel loro codice in un lavoro complesso come lo sviluppo web.

E no, non significa che sei un cattivo programmatore. Al contrario, in effetti. Un sacco di nuovi programmatori hanno difficoltà a distinguere la situazione corretta per utilizzare l'ereditarietà e hanno la tendenza a usarlo eccessivamente, creando codice strettamente accoppiato.

Se ti stai chiedendo se per caso ti perdi occasione per utilizzare correttamente l'ereditarietà, il trucco è guardare il codice chiamante per un sacco di dichiarazioni if o switch che fanno cose diverse a seconda del tipo di una variabile. Ad esempio:

if (user.isAdmin())
    drawAdminForm();
else if (user.isEditor())
    drawEditorForm();
else
    drawUnprivilegedForm();

Tieni d'occhio il codice in questo modo e andrai benissimo.

    
risposta data 16.03.2013 - 16:34
fonte
3

But I've never had to use the inheritance aspect of Object Oriented Programming !

Oh, ma tu hai! Se stai utilizzando ASP.NET MVC stai derivando i tuoi controller da System.Web.Mvc.Controller . Questo è ciò che dà ai controller tutta la potenza e la funzionalità di cui dispongono senza che tu debba fare alcun lavoro pesante.

I just can't seem to find a scenario to use it at. Basically, I am wondering how often it is used in OO programming in general.

Per me, uso l'ereditarietà abbastanza spesso ma devi sapere quando hai bisogno di usarlo. Non ha molto senso avere un dio oggetto da cui si ricava tutto; tuttavia, se stai implementando la business logic, potresti avere una classe base SectionRule in cui puoi definire varie regole.

Un esempio del mondo reale potrebbe essere un gioco di guida. Avresti una classe abstract chiamata Vehicle che non può essere istanziata da sola perché sarebbe inutile ma potresti definire un comportamento di base come IsRunning e CurrentSpeed fornendo un metodo Start() questo è abstract che significa che devi implementarlo. Puoi ricavare le classi Car , Bike e Truck e ognuna dovrebbe tenere traccia di se è in esecuzione e della velocità corrente, ma implementa manualmente il metodo Start() per ogni tipo di oggetto.

L'altra cosa da tenere a mente è che OO è usato ovunque nella maggior parte dei framework (ASP.NET, WinForms, WPF, ecc.), potresti usarlo senza saperlo. La maggior parte dei componenti di WinForm deriva da Control .

Il più grande vantaggio dell'utilizzo di OO ed ereditarietà è la riduzione della quantità di codice che devi scrivere per gli oggetti correlati.

    
risposta data 16.03.2013 - 01:38
fonte
0

L'ereditarietà viene principalmente utilizzata nello sviluppo basato su framework, dove spesso non definisci le tue classi, ma estendi quelle esistenti:

  • Asp.Net MVC - Controller
  • Ruby on Rails - Controller e ActiveRecords
  • Android - Attività, AsyncTasks, Schede
  • WPF e Windows Phone - Windows, UserControls, Controlli, Pagine

Se scrivi un codice che non è correlato con i framework, puoi farlo senza ereditarietà usando il pattern di composizione.

    
risposta data 17.03.2013 - 13:29
fonte

Leggi altre domande sui tag