Programmazione strutturata rispetto alla programmazione OO


11

Sto realizzando una presentazione che mostra le differenze tra la programmazione strutturale e orientata agli oggetti e voglio illustrare il motivo per cui le persone hanno bisogno di OOP con un esempio in cui l'applicazione dei concetti di OOP renderà la programmazione molto più semplice, in modo che il pubblico si senta davvero di aver bisogno di OOP.

Qualche idea ??


2
porre questa domanda su programmers.stackexchange.com ti darà più risposte.
Reggie,

2
Qual è il tuo pubblico? Programmatori esperti non OO (cobol, ecc.)? programmatori con scarsa esperienza (studenti, ecc.)? Dirigenti (non programmatori)?

Non ne avevo mai sentito parlare prima, ma ho letto le FAQ e credo sia meglio chiedere lì.
Ahmed,

poco esperto.
Ahmed,

4
Vorrei che alcuni programmi OO fossero strutturati meglio.
Scott Whitlock,

Risposte:


17

Potresti voler dare un'occhiata a questo veloce video blog . Il risultato è che la differenza tra programmazione strutturata e programmazione OO è una questione di ciò che tolgono dalla programmazione, non di ciò che aggiungono. Discipline software come Programmazione strutturata e Programmazione orientata agli oggetti sono vincolanti, non abilitanti. Ecco alcune definizioni. Attenzione: non ti piaceranno.

  • La programmazione strutturata è la disciplina imposta al goto (trasferimento diretto del controllo)

  • La programmazione OO è la disciplina imposta ai puntatori alle funzioni (trasferimento indiretto del controllo)

  • La programmazione funzionale è la disciplina imposta all'incarico.

    Il primo non è troppo difficile da capire. Dijkstra scoprì che era impossibile creare prove generali di correttezza quando negli algoritmi era consentito il goto. Tuttavia, se le strutture di controllo fossero limitate a sequenza, selezione e iterazione, allora erano possibili prove di correttezza . Ovviamente non proviamo nemmeno a provare le cose al giorno d'oggi, ma ci piace la semplicità e l'eleganza della programmazione strutturata.

È un po 'più difficile capire OO. Spesso definiamo OO come incapsulamento, eredità e polimorfismo. Ciò che è meno noto è che tutti e tre questi attributi sono raggiungibili, e spesso sono stati raggiunti in C. In effetti, C ++ è iniziato come solo un preprocessore compilato in C. In realtà non è difficile incapsulare in C. Né è difficile da costruire strutture di dati che sono sottoinsiemi l'uno dell'altro, simulando l'ereditarietà. Il polimorfismo, tuttavia, è un po 'più difficile. Richiede puntatori a funzioni che, in C, sono difficili da gestire bene. Ciò che i linguaggi come il C ++ ci ha dato è stata la disciplina imposta su tali indicatori alle funzioni. Il compilatore C ++ ha creato i vtables per noi e ha inizializzato i puntatori al loro interno secondo un rigoroso formalismo. Quindi, in un senso molto reale, OO è semplicemente una disciplina impostatrasferimento indiretto di controllo, ovvero puntatori a funzioni.

La programmazione strutturata riguarda come non usare goto. OO riguarda come non utilizzare i puntatori alle funzioni. E anche la programmazione funzionale riguarda tutto ciò che non si deve fare. Nella programmazione funzionale non assegniamo variabili se non nei casi più severamente controllati.

Quindi, alla fine, tutte queste "tecnologie" di programmazione in realtà limitano le discipline piuttosto che abilitare le tecnologie. Ci dicono che cosa non fare più di quello che ci dicono cosa a fare. Ciò significa che lo sviluppo del software non è cresciuto negli ultimi 40 anni. Piuttosto, si è ridotto. È diventato sempre più limitato poiché abbiamo imparato tutte le cose che non dovremmo fare.

Imparare cosa non fare è buono; ma ecco la domanda inquietante: quali cose nuove abbiamo imparato a fare?


@Ahmed: +1 per "TL; DR, grazie per il video", commento sospetto (scherzando)
n611x007

link rot ... dead link
slashdottir

7

Esistono 3 modi di base per programmare un computer:

  1. Programmazione non strutturata - con gotos, come nei vecchi interpreti BASIC, o in linguaggio assembly. Poche persone programmano più in questo modo.
  2. Programmazione imperativa strutturata - come in C o PASCAL.
  3. Programmazione funzionale strutturata - come in Haskell, ML o Lisp.

A mio avviso, la programmazione orientata agli oggetti è qualcosa di diverso. Si tratta di come organizzare il programma su una scala più ampia. Non sostituisce o obsoleto nessuno dei 3 paradigmi che ho menzionato sopra: all'interno di un corpo del metodo, è ancora necessario selezionare uno dei 3 paradigmi dall'elenco per scrivere.


Non ti capisco bene! Vuoi dire che dobbiamo usare uno dei 3 paradigmi ma NON lo sappiamo .. e OOP è solo più organizzazione ??
Ahmed,

Non è possibile programmare senza apprendere né la programmazione imperativa strutturata né la programmazione funzionale strutturata. Questi due paradigmi riguardano il fare le cose. OOP, d'altra parte, riguarda la modularizzazione del programma che entra in gioco solo quando il programma ha raggiunto una certa dimensione. Sebbene appaia sicuramente nelle librerie che usi durante la programmazione per tutto il tempo, puoi avere una libreria di classi perfettamente valida senza funzionalità OO come l'ereditarietà, ad esempio le librerie di classi di Haskell, LISP o Standard ML.
Ken Bloom,

4

È tutto su come anticipi il cambiamento.

Entrambi i concetti si prestano alla riusabilità, ma OOP apre le porte a cambiamenti più facili. OOP ha tutta la riusabilità della programmazione strutturale, ma puoi anche usarla per creare nuove funzionalità con meno sforzo.

Si potrebbe dire che OOP eredita tutte le funzionalità della programmazione strutturale con l'ulteriore funzionalità dell'ereditarietà! :-D


Non sono molto appassionato di eredità in questo momento.

4
Nemmeno io, ma è perché il governo ha fregato mio nonno dalla sua pensione. In termini di OOP, tuttavia, l'eredità mi ha servito abbastanza bene!
corsiKa

Nella mia esperienza, l'ereditarietà è meglio evitare in OOP. Con quale frequenza realizzi effettivamente una superclasse anziché un'interfaccia? Favorire la composizione come regola generale.
Janx,

1
@Janx: "Quanto spesso realizzi una superclasse invece di un'interfaccia?" Eh? Non "costruisci superclassi"; si prende classi esistenti e costruire subclasss da loro, e si fa che per tutto il tempo. Se non stai usando l'ereditarietà, non stai ottenendo i benefici della sostituzione e del polimorfismo di Liskov, quindi cosa stai facendo nella programmazione orientata agli oggetti? La composizione è uno strumento diverso con un caso d'uso diverso, non una sostituzione per l'eredità. Non dovresti "favorire" l'uno rispetto all'altro; dovresti usare entrambi, ognuno per cui sono utili.
Mason Wheeler,

1
@Mason - vale la pena notare che Barbara Liskov (del principio di sostituzione di Liskov) in realtà ha detto (lungo video) che non le piace particolarmente l'eredità.
Aidan Cully,

2

I concetti sono ortogonali. La programmazione strutturata riguarda la strutturazione del codice all'interno di procedure / funzioni / metodi. È perfettamente possibile (e desiderabile) seguire i principi della programmazione strutturata all'interno dei metodi di classe quando si fa OOP.


1

È una specie di formulazione soggettiva: la programmazione strutturata e OOP sono stili di risoluzione dei problemi e uno non è sempre migliore dell'altro. Scrivere una libreria di metodi numerici ha molto senso se fatto in uno stile strutturato, dove si stanno eseguendo trasformazioni sui dati di input. Un semplice agente guidato da una macchina a stati, tuttavia, può essere facilmente espresso come una classe autonoma in Java o C ++. OOP può essere un modo naturale di esprimere contenitori di archiviazione per strutture di dati.

Parlare di nascondere informazioni e modularità è un buon modo per motivare naturalmente OOP come stile.

Un'interessante interpretazione di questo problema è stata scritta da Steve Yegge - in un certo senso, una delle migliori descrizioni delle differenze negli approcci tra i due stili.


0

OOP è più facile da capire quando si crea un modello di business. Quando pensi a elementi di applicazione usi alcuni OGGETTI e RELAZIONI tra loro, ad esempio Libro ha autori, titolo, codice ISBN. Il libro deve entrare nella Biblioteca e potrebbe essere preso in prestito dallo Studente. La programmazione strutturale impone di pensare a processi specifici, implementazioni non in astrazione.

OOP è progettato per facilitare le modifiche. Il cambiamento nel programma strutturale è possibile ma deve essere descritto da un codice. Il cambiamento nel programma OO potrebbe essere descritto da un cambiamento di modello astratto.


0

Ambito variabile:

Penso che un principio dei linguaggi per garantire una buona programmazione sia limitare la portata delle variabili. In linguaggi strutturati come C, l'ambito è principalmente di due tipi:

  • Portata globale
  • Ambito locale / funzione / metodo

Sappiamo tutti che l'ambito globale è dannoso. Ma a volte gli ambiti locali non sono sufficienti per eseguire il programma. Evitare gli ambiti globali tende quindi a un uso più ampio dei puntatori, che consente l'uso di variabili al di fuori dell'ambito. Ma i puntatori sono difficili da capire e da usare.

I linguaggi OOP come C ++ aggiunge un nuovo tipo di ambito : ambito Classe / Oggetto tramite incapsulamento. Questo ambito è ulteriormente migliorato dalle variazioni private / pubbliche. E questo risolve molti problemi di scoping variabile. Gli ambiti sono più definiti in OOP. E i puntatori sono meno necessari.

Questa è una delle grandi caratteristiche di OOP.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.