Programmazione strutturata rispetto alla programmazione OOP

11

Sto facendo una presentazione che mostra le differenze tra la programmazione strutturale e orientata agli oggetti e voglio illustrare perché le persone hanno bisogno di OOP con un esempio in cui l'applicazione dei concetti OOP renderà la codifica molto più facile in modo che il pubblico sento davvero di aver bisogno di OOP.

Qualche idea ??

    
posta Ahmed 04.04.2011 - 21:09
fonte

7 risposte

15

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

  • La programmazione strutturata è disciplina imposto su goto (trasferimento diretto di controllo)

  • La programmazione OO è una disciplina imposta su puntatori alle funzioni (indiretto trasferimento di controllo)

  • La programmazione funzionale è disciplina imposto su incarico.

    Il primo non è troppo difficile da capire. Dijkstra scoprì che era impossibile creare prove generali di correttezza quando era consentito il goto negli algoritmi. Tuttavia, se le strutture di controllo erano limitate a sequenza, selezione e iterazione, allora erano possibili prove di correttezza . Naturalmente non proviamo nemmeno a dimostrare 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, ereditarietà e polimorfismo. Quello che è meno noto è che tutti e tre questi attributi sono realizzabili, e frequentemente sono stati raggiunti in C. Infatti, C ++ è iniziato come un semplice preprocessore compilato fino a C. In realtà non è difficile incapsulare in C Né è difficile costruire strutture dati che sono sottoinsiemi l'una dell'altra, simulando l'ereditarietà. Il polimorfismo, tuttavia, è un po 'più difficile. Richiede indicazioni su funzioni che, in C, sono difficili da gestire bene. Ciò che le lingue come il C ++ ci ha dato è stata la disciplina imposta a quegli indicatori di funzioni. Il compilatore C ++ ha costruito per noi i vtables e inizializzato i puntatori all'interno di essi secondo un rigoroso formalismo. Quindi in un senso molto reale OO è semplicemente una disciplina imposta al trasferimento indiretto del controllo, cioè i puntatori alle funzioni.

La programmazione strutturata riguarda come non usare goto. OO riguarda come non usare i puntatori alle funzioni. Anche la programmazione funzionale riguarda tutto ciò che non fare. Nella programmazione funzionale non assegniamo le variabili tranne nei casi controllati più rigorosamente.

Quindi alla fine tutte queste "tecnologie" di programmazione sono in realtà discipline vincolanti piuttosto che tecnologie abilitanti. Ci dicono cosa non fare di più di quello che ci dicono cosa fare a . 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 nuove cose abbiamo imparato a fare?

    
risposta data 05.04.2011 - 00:38
fonte
7

Ci sono 3 modi fondamentali per programmare un computer:

  1. Programmazione non strutturata - con goto s, come nei vecchi interpreti BASIC o in linguaggio assembly. Poche persone lo programmano più.
  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. Riguarda come organizzare il tuo programma su una scala più ampia. Non sostituisce né obsoleto nessuno dei 3 paradigmi che ho menzionato sopra - all'interno di un corpo del metodo, devi ancora scegliere uno dei 3 paradigmi dalla lista per scrivere.

    
risposta data 04.04.2011 - 21:22
fonte
4

Tutto dipende da come prevedi il cambiamento.

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

Si potrebbe dire che OOP eredita tutte le funzionalità della Programmazione Strutturale con la funzionalità aggiuntiva dell'ereditarietà! :-D

    
risposta data 04.04.2011 - 21:15
fonte
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.

    
risposta data 04.04.2011 - 21:33
fonte
1

È una specie di formulazione soggettiva: la programmazione strutturata e l'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, in cui 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 clandestinità e modularità delle informazioni è un buon modo per motivare naturalmente OOP come stile.

Un interessante aspetto di questo problema è stato scritto da Steve Yegge - in qualche modo, una delle descrizioni migliori delle differenze negli approcci tra i due stili.

    
risposta data 04.04.2011 - 21:29
fonte
0

OOP è più facile da capire quando si realizza un modello di business. Quando pensi a elementi di applicazione, usi alcuni OGGETTI e RELAZIONI tra loro, ad es. Il libro ha autore (s), titolo, ISBN. Il libro è di entrare in 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 facili cambiamenti. Il cambiamento nel programma strutturale è possibile ma deve essere descritto dal codice. Il cambiamento nel programma OO potrebbe essere descritto dal cambiamento del modello astratto.

    
risposta data 04.04.2011 - 21:21
fonte
0

Ambito variabile:

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

  • Ambito 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 consentono l'uso di variabili al di fuori dell'ambito. Ma i puntatori sono difficili da capire e da usare.

I linguaggi OOP come C ++ aggiungono un nuovo tipo di ambito- Ambito classe / oggetto tramite l'incapsulamento. Questo ambito è ulteriormente migliorato dalle variazioni private / pubbliche. E questo risolve molti problemi di scope variabile. Gli ambiti sono più definiti in OOP. E i puntatori sono meno necessari.

Questa è una delle grandi funzionalità di OOP.

    
risposta data 05.04.2011 - 08:14
fonte

Leggi altre domande sui tag