Perché dobbiamo imparare la programmazione procedurale prima di apprendere la programmazione orientata agli oggetti [chiuso]


10

Sono al 4 ° anno in un'università IT ora e quando parlo con il mio professore su questo argomento, rifiuta la mia opinione e mi dà una critica molto pesante (nella mia università, ci è stato insegnato C (ANSI) (in procedurale Classe di programmazione - nel 1 ° anno all'università) prima del C ++ (in classe OOP nel 2 ° anno) e altri ...

Ma all'età di 13 anni mio fratello mi ha insegnato, Java prima e nient'altro. Ora può fare quasi tutto ciò che un normale studente del 2 ° anno può fare con Java.

Per voi professionisti, vorrei sapere perché pensate che dovremmo prima insegnare la programmazione procedurale.


8
Perché Assembler non ha oggetti.

9
È per questo che dovremmo insegnarci a calcolare correttamente prima di imparare come usare una calcolatrice.

22
Perché il design orientato agli oggetti è imperfetto. I programmi sono una raccolta di comportamenti che operano sui dati. Gli oggetti spesso introducono complessità inutili. Leggi "Come progettare i programmi: un'introduzione alla programmazione e al calcolo".

8
Come affermato da qualcun altro, "Non distrarre i nuovi programmatori con OOP": prog21.dadgum.com/93.html - praticamente tutto ciò che OOP sta ostacolando nell'insegnare ai nuovi programmatori i fondamenti. Stai insegnando loro due concetti davvero difficili allo stesso tempo.
John Ripley,

7
@juxstapose - dire che la programmazione orientata agli oggetti introduce una complessità non necessaria è come dire che dovremmo scolpire i veicoli da un unico blocco di acciaio. Solo la mia opinione.

Risposte:


23

Riepilogo rapido:

  1. Perché nel mondo reale, prima o poi, devi lavorare con il codice procedurale.

  2. Perché i linguaggi procedurali possono funzionare come un'estensione o un'introduzione ai linguaggi orientati agli oggetti, invece di essere solo un'alternativa.

  3. Complemento per la risposta 2. Poiché OOP è più complesso della programmazione procedurale, quindi è meglio imparare prima la programmazione procedurale.

  4. Perché nel mondo reale, i programmatori lavorano e combinano diversi modi per risolvere i problemi, la "programmazione multiparadigm" di AKA, non solo un singolo paradigma.

  5. La maggior parte dei linguaggi di programmazione sono multiparadigm, a un certo livello, anche se i loro progettisti o sviluppatori comuni dicono il contrario.

  6. [NOVITÀ] Perché la Programmazione Modulare che è comunemente mescolata e confusa con la Programmazione procedurale, può essere applicata a OOP Pertanto la domanda può essere letta come "Perché dobbiamo imparare la Programmazione Modulare prima di apprendere la Programmazione orientata agli oggetti"

Descrizione noiosa estesa:

Il punto 1 è molto chiaro, non un'ulteriore spiegazione.

Punto 2, Classi, Ereditarietà, polimorfismo, interfacce, ecc.

Punto 3, codifico la procedura Pascal prima di imparare Pascal orientato agli oggetti, quando ci sono arrivato ho detto: "guarda, le classi sono come piccoli programmi procedurali ... ... e puoi farli parlare tra di loro, fico !!! ".

Ho sentito lo stesso da persone che sono passate dalla semplice C alla C plus plus.

Punto 4, il più delle volte i programmatori combinano diverse tecniche di programmazione o paradigmi o modi per risolvere un problema. Funzionale, procedurale, OOP, logico.

Persino Java "Pure OO" non è una programmazione così semplice come dice.

+1 punto per dire "Programmazione procedurale" invece di "Programmazione strutturata". O programmazione modulare. Questo è importante

Tuttavia, molte volte questi termini sono insegnati insieme e usati in modo intercambiabile, non lo sono. La programmazione strutturata include molti concetti, non solo l'utilizzo di procedure, e uno di questi sta facendo in modo che il programma non assomigli a "Codice Spaghetti".

Oggi ho letto diversi programmi OO "puri" che assomigliano a "Codice Spaghetti orientato agli oggetti", il che significa che il programmatore ha usato OOP, ma il suo codice sembra un casino.

Molte volte, posso leggere un codice OO e dire che il programmatore ha imparato la Programmazione strutturata prima di OOP, perché il codice è chiaro e organizzato.

E per la programmazione modulare, ho visto diverse app. in C ++ e PHP che non utilizza i moduli. *


18

Penserei che l'analogia sarebbe simile alla matematica. Devi prima imparare alcuni concetti di base (addizione / sottrazione / ...) quindi passare ad argomenti più complessi (algebra / calcolo). Il programma procedurale è molto lineare ed è più facile cogliere il flusso di controllo mentre apprendi la sintassi. Si ritiene che OOP sia più complesso, si basa sui costrutti più semplici utilizzati nei linguaggi procedurali ma è più astratto e più difficile da comprendere. Iniziare con linguaggi come C ti avvicina anche all'hardware e ti affronta con problemi di allocazione della memoria e puntatori, che devi capire ma che non puoi usare in linguaggi come Java / C #. C'è un vero valore nell'essere esposti a questo a scuola, indipendentemente dal fatto che venga prima o seconda.

FWIW, è destinato a cambiare alla fine. Quando ho iniziato la scuola abbiamo imparato in Pascal e PL / 1. Non siamo arrivati ​​a C fino alla lezione di lingue avanzate (che mi risale). Non ho preso Java fino alla scuola di specializzazione - non era ancora stato inventato!


+1 - una specie di paradosso dell'intenzione lì ... "più astratto e più difficile da capire" :)

10
@Spacemoses - non proprio, più qualcosa di astratto è, più facile è la discussione ma più difficile è comprendere la realtà di ciò che si sta discutendo.

d'accordo, vedo il tuo punto ora.
ses011,

12

La programmazione orientata agli oggetti è una raccolta di frammenti procedurali organizzati in modo organizzato. Penso che la lezione che stai imparando sia che la metodologia orientata agli oggetti aiuta a mantenere l'organizzazione e la manutenibilità. Ci sono molti programmatori che non possono fare questa distinzione e affermeranno che i loro programmi sono orientati agli oggetti quando sono più procedurali.


3
ma funzioni + stato = oggetti
Dan D.

4
L'orientamento agli oggetti spesso rende la manutenzione molto più difficile perché gonfia la base di codice. I sistemi basati su Java sono un incubo da mantenere a causa del livello di purezza OO e di patterniti di progettazione presenti in quella comunità.
Bit Twiddler il

1
"Modelli di progettazione trovati in quella comunità" - suona come un problema personale nella "comunità Java" se questa è la tua posizione.
ses011,

1
@Dan D: l'orientamento agli oggetti è molto più che combinare funzioni e stato in un oggetto ...
Marjan Venema

4
@Spacemoses: ho un problema con qualsiasi comunità di sviluppo che non abbraccia il principio KISS. La migliore soluzione a un problema è spesso la soluzione più semplice.
twiddler

11

Non

Abbiamo imparato prima la programmazione funzionale , con Scheme. Quindi siamo passati alla programmazione procedurale, quindi a OOP e quindi a programmazione dichiarativa. E che ci crediate o no, mentre conoscevo già la programmazione, penso che in realtà fosse più facile anche per le altre persone: perché FP è proprio come la matematica! Quindi conosci già le basi.

Ho discusso questo con me stesso molte volte e alla fine sono giunto alla conclusione che dipende davvero da quanto bene il tuo insegnante ti insegna i concetti.

Non esiste una risposta singola perché:

  • Iniziare con qualcosa di procedurale come C (o addirittura assembly) potrebbe essere una buona scelta, perché impari come funzionano davvero i computer

  • Iniziare con qualcosa orientato agli oggetti Java potrebbe essere una buona scelta, perché è relativamente facile da imparare e applicare OOP alla vita reale, e perché ti insegna sulla ** formazione

  • Iniziare con una programmazione funzionale come Scheme potrebbe essere una buona scelta perché ti insegna a pensare in modo più astratto (in termini di funzioni anziché di variabili), il che alla fine ti rende un programmatore migliore

Se il tuo insegnante non lo insegna bene, non importa davvero con cosa inizi; saranno praticamente uguali.


4
Fai il +1 e non riesco a credere di dover scorrere così tante risposte povere per trovarlo!
jk.

In realtà ho avuto problemi con le funzioni matematiche di grokking per un po 'perché avevo imparato prima un po' di programmazione, e il concetto di una funzione che è "invece di" fare "cose ​​mi ha confuso. : 3
StarWeaver il

6

Un linguaggio può essere orientato agli oggetti come C ++, Java o C #. E puoi iniziare con queste lingue. Ma il punto è che, anche con questi linguaggi OO, devi prima imparare la programmazione procedurale, poi OOP. Penso che lo stesso sia stato fatto da tuo fratello.


3
+1 precisamente. Ogni metodo OOP è un breve programma procedurale. Se non si sa come combinare i piccoli pezzi (tipi, valori letterali, variabili, operatori, =di assegnazione, if, for, ecc) in pezzi più grandi (metodi), come si può mai sperare capire OOP. Come con la maggior parte delle competenze, essere molto intelligenti, motivati ​​e / o avere accesso a istruzioni individuali può permetterti di apprendere più argomenti correlati contemporaneamente.
David Harkness,

3

La programmazione procedurale, almeno in un linguaggio come C, riduce la programmazione a una pratica molto spoglia: algoritmi e strutture di dati, e ad un livello di astrazione che è un mezzo felice tra il codice sorgente comprensibile per l'uomo e il codice assembly.

In questo modo, gli studenti possono imparare un po 'di scienza (algoritmi, strutture di dati) e un po' di ingegneria (sorgente-> oggetto-> compilazione di macchine, architettura von-neuman (probabile)) allo stesso tempo.

OOP, tramite C ++ / obj-C introduce un modello di organizzazione del codice, che è solo un'altra cosa da imparare. Ciò potrebbe rendere l'apprendimento dei concetti sopra un po 'più difficile.

OOP via Java (tra gli altri) va ancora più lontano sottraendo hardware e ambiente. Ora il prodotto sottostante non è il codice macchina, ma una sorta di intermediario che non rivela come funziona l'hardware sottostante, ma l'effetto è che consente allo studente di concentrarsi sui modelli di organizzazione del codice.

Alla fine penso che sia un compromesso tra l'apprendimento di come funziona l'hardware o l'apprendimento di un modello di organizzazione del codice. Per quanto riguarda ciò che è più importante, non lo so davvero. Il mondo reale richiede la conoscenza di entrambi, almeno in una certa misura.

Immagino che un programma universitario che inizia con una programmazione procedurale di basso livello probabilmente produce scienziati informatici / ingegneri informatici, e un programma che inizia con concetti di livello superiore produce ingegneri software / sviluppatori / programmatori.


3

Le viscere degli oggetti OOP sono costituite da una programmazione procedurale.

Se non riesci a fare un ciclo for, usa correttamente i puntatori, dichiara i tuoi tipi e le tue funzioni che non sarai in grado di scrivere interfacce per le tue classi e tanto meno fai che gli interni facciano qualsiasi cosa che valga la pena fare.

In realtà non impareresti OOP in una lezione introduttiva, sarebbe solo una sintassi: saltare direttamente in OOP renderebbe le cose più complicate da capire (all'inizio) di quanto non lo sia già.

OOP non riguarda alcune dichiarazioni di sintassi per formare classi, riguarda strutture di dati, modelli di progettazione, polimorfismo, ereditarietà e composizione.

Per fare tutte quelle cose di cui hai bisogno per conoscere la programmazione procedurale, qualcosa di facilmente fatto in C. Puoi comunque portare la maggior parte di tutto ciò che impari con C su Java o C ++, potresti dover ripensare alcune cose che hai dato per scontato in C, MA ... Devi conoscere la grammatica (dove ti trovi nell'introduzione C) per scrivere frasi (devi scrivere le procedure per definire le interfacce) quindi i paragrafi (devi conoscere le strutture di dati) e poi conoscere alcuni schemi di progettazione (tragedia, commedia, imperfetto eroe, come interagiscono; e quando non usarli) prima che tu possa scrivere romanzi completi (sistema OOP completo).

Se fossi in te prenderei alcuni dei seguenti libri: The C Programming Language , The Java Programming Language , Design Patterns , Gang of Four e Pattern Hatching . Prenderei sicuramente una copia di The C Programming Language se fossi serio sul C / C ++.

Se vuoi solo andare fino in fondo Java (e farlo per $), prendi alcuni libri sui modelli di progettazione Java e su come usare Java con i server Web Apache e Tomcat e alcuni libri sulla programmazione del database SQL. Java prende così tanto a calci sul web, mi dispiace, ma PHP ha avuto una storia di tonnellate di buchi di sicurezza che lo rendono un dolore nel culo quanto Windows da impedire di ottenere il root del server o l'iniezione dei database SQL.

Dovresti anche prenderti il ​​tempo per imparare SQL, Oracle MySQL Postgresql e MSSQL hanno molto in comune per quanto riguarda la sintassi, ma se dovessi semplicemente sceglierne uno per me stesso scegliere Postgresql solo perché è concesso in licenza BSD anziché GPL (dovresti cercare un confronto e contrasto anche con le licenze GPL / BSD)


2

Devo dire che la maggior parte del codice scritto in linguaggi orientati agli oggetti come Java non è in realtà orientato agli oggetti. Comprendere davvero le idee alla base di OO è difficile, di conseguenza il codice OO presumibilmente è in gran parte procedurale.

Tuttavia, questo non è nulla di veramente sbagliato nella scrittura di codice procedurale in Java. Sì, ci sono vantaggi nel fare OO, ma non è qualcosa con cui vorrei confondere un programmatore principiante. Quindi su quella base, non vedo nulla di sbagliato nell'insegnare Java. Non aspettarti un vero OO da esso, ma funziona.

Tuttavia, Java nasconde molti dettagli di basso livello su ciò che accade all'interno del computer. C li lascia molto più all'aperto. Si può sostenere che gli studenti dovrebbero imparare come funzionano questi dettagli di basso livello prima di usare una lingua che si prende cura di loro per loro. Ma puoi anche fare un caso in cui dovresti ignorare quei dettagli e impararli in seguito.


2

Diversi altri hanno già risposto su questo tema, ma penso che valga la pena affermarlo in modo più esplicito.

Anche se inizi a studiare la programmazione con un linguaggio orientato agli oggetti come Java, inizi imparando le tecniche di programmazione procedurale prima di arrivare ai concetti OO . Quando si insegna a un nuovo programmatore Java, non si introducono prima oggetti e classi, ma si introducono istruzioni e variabili. Quando lo studente è in grado di insegnare molto su oggetti e classi, ha già almeno le basi della programmazione procedurale.

Quindi, almeno, devi imparare la programmazione procedurale in Java e quindi imparare la programmazione orientata agli oggetti in Java. Indipendentemente dal fatto che tu passi un anno intero alla programmazione procedurale o che passi le prime settimane del corso di programmazione e che utilizzi o meno un linguaggio diverso per questo, stai solo discutendo dei dettagli.


0

Per essere eccessivamente schietto, penso che lo slancio provenga principalmente da vecchi programmatori che desiderano vecchi tempi.

Prima di dire qualsiasi altra cosa, non sostengo assolutamente alcuna controversia per i programmatori più anziani, molti di loro sono semplicemente incredibilmente abili. Sfortunatamente a volte quelli che non lo sono, che si lavano e non sono mai stati veramente bravi a programmare per cominciare ... diventano professori quando non riescono ad hackerarlo nel "mondo reale". (Non tutti i professori o ... ma ... MOLTI)

OOP non è il santo graal della programmazione che si immagina di essere, né la programmazione procedurale è una reliquia. È bene conoscere almeno alcuni di entrambi, ma penso che la pratica generale di ciò che viene insegnato come programmazione procedurale tende a essere una gigantesca perdita di tempo e fatica. Dobbiamo imparare la programmazione in ambito accademico, non solo uno stile o l'altro. Attribuisco un po 'di codice terribile e idee sbagliate a questo, incluso il mio.


2
Avevo un insegnante che usava C del '89, ma era per un microchip che mi aspettava c '99. Poi c'era quell'altro insegnante che utilizzava "c ++" ma senza STL o template. Potrebbero anche essere state strutturate con puntatori di funzione in esse.
Ape-inago,

1
Ad essere onesti, l'STL e i modelli in generale non sono argomenti introduttivi in ​​C ++. L'obiettivo di base di qualsiasi corso di programmazione a 101 livelli è insegnare come creare una logica sequenziale, condizionale e iterativa ben strutturata all'interno dei vincoli di una determinata sintassi. Tutte le altre caratteristiche del linguaggio sono semplicemente zucchero sintattico che consente di raggruppare le strutture di controllo di base e di legarle ai dati.
twiddler

ahi due voti negativi. ho visto che uno stava arrivando = P strano per me, poiché l'opinione originariamente proveniva da un programmatore più anziano che mi ha aiutato a riprendermi da un cattivo insegnamento. @Ape: Il capo del nostro dipartimento CS stava cercando di insegnarci a COBOL per un anno nel 2004 XD (l'ultima delle mie preoccupazioni dal suo stile di "insegnamento", non mi dispiace dal momento che posso lavorare su alcuni punti vendita macchine lol ma geeze ... sul serio?)
Garet Claborn

1
@ bit-twiddler - Aye signore, molto strano. Non mi baso molto su quella esperienza molto in questo parere, ma io ho guardato in altri locali. Adoro entrambi gli stili di programmazione e mi sembra che dovrebbero insegnarli insieme. Trovo solo che i professori anche leggermente più giovani non abbiano la stessa percentuale di zelo sulla questione. IMO è una buona cosa. Capisco alcuni pensano che prima sia procedurale.
Garet Claborn,

1
@ bit-twiddler: sì, ma non è stato un corso introduttivo. Era un corso avanzato di 4 ° anno nella progettazione di database e dovevamo usare c ++. Mi è sembrato sbagliato dopo aver sperimentato c ++ a un livello così alto con i corsi precedenti.
Ape-inago,

0

Due motivi per me: una programmazione OO è venuta per risolvere problemi di programmazione procedurale. Quindi, scrivendo un po 'di codice procedurale e poi le stesse cose in OO, rende più facile capire la differenza.

C'è anche un ulteriore elemento qui: i due approcci per educare sugli argomenti di programmazione. Si può iniziare con il minimo (esempio di assemblaggio, in molti punti procedurali, altri iniziano con circuiti) e poi salire (verso OO / Funzionale / Gestito). L'altro approccio è partire dal mondo fisico (es. Browser / Windows 7, ecc.) E poi iniziare ad approfondire. Ci sono pro e contro per ogni approccio. La tua università ha scelto la prima e per iniziare con la procedura. Potrebbe esserci qualche logica o hanno appena copiato qualcun altro :-).


1
"La programmazione OO è venuta per risolvere i problemi della programmazione procedurale". Questo era l'obiettivo, ma OO ha creato tanti problemi quanti ne ha risolti.
bit-twiddler,

@ bit-twiddler: storia molto grande. Concentrandosi (o restringendolo) sull'aspetto pedagogico, fa un caso: cosa abbiamo avuto questo, come l'abbiamo migliorato: quello (
discutete

0

Non c'è altro motivo che l'inerzia istituzionale. Guarda CMU, hanno buttato fuori il loro intero curriculum OOP e lo hanno sostituito con una programmazione funzionale. Quindi, ancora una volta, la risposta alla tua domanda è che si tratta di una scelta arbitraria fatta dagli amministratori di qualunque scuola stai frequentando. Nel caso in cui qualcuno si stia chiedendo delle dichiarazioni fattuali che ho fatto qui è il post su come cambiare il curriculum alla CMU da un professore / amministratore: insegnare FP alle matricole .


1
-1 fuorviante - mentre ho visto un thread (tramite la ricerca di Google) che ha affermato che la CMU ha eliminato OOP dal suo curriculum CS del primo anno e lo ha sostituito con una programmazione funzionale, il curriculum ufficiale della CMU inizia con il linguaggio di programmazione Alice, che è oggetto- orientato [vedi enr-apps.as.cmu.edu/assets/SOC/CS_SPRING.htm]
Steven A. Lowe

1
@ davidk01: (1) affermazione effettivamente errata nella risposta. (2) "Alice è uno strumento didattico liberamente disponibile progettato per essere la prima esposizione di uno studente alla programmazione orientata agli oggetti " da alice.org
Steven A. Lowe,

2
@Steven A. Lowe: Direttamente dalla bocca del cavallo: "La programmazione orientata agli oggetti è completamente eliminata dal curriculum introduttivo, perché è sia antimodulare che anti-parallelo per sua stessa natura, e quindi inadatta per un moderno curriculum CS. Un nuovo corso proposto sulla metodologia di progettazione orientata agli oggetti sarà offerto a livello di secondo anno per quegli studenti che desiderano studiare questo argomento. " - Insegnare FP alle matricole
davidk01

1
@ davidk01: collegamento eccellente, grazie. Dal documento del comitato citato in quell'articolo "Sebbene la programmazione orientata agli oggetti (nelle sue miriadi di forme) rimanga un tema dominante nello sviluppo di software industriale, l'uso di linguaggi orientati agli oggetti, come Java, a livello introduttivo introduce una notevole complessità e distrae dagli obiettivi principali a livello introduttivo . Sembra preferibile fornire una copertura più completa della progettazione e della metodologia di implementazione OO a più avanti nel curriculum per consentire una concentrazione più focalizzata sulle basi a livello introduttivo ". [enfasi mia] ...
Steven A. Lowe,

1
@ davidk01: sono felice di essere d'accordo di non essere d'accordo. Chiamami pedante se vuoi, ma per me c'è una differenza significativa tra cambiare l'enfasi a livello introduttivo e "buttare via l'intero curriculum OOP". Difficilmente definirei la riduzione dell'ambito delle lezioni introduttive un "cambiamento radicale" ;-)
Steven A. Lowe,
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.