Codice procedurale vs. OOP in PHP

Venerdì 5 Giugno 2009 - 15:27

di Cesare Lamanna

PHP e Open Source

Facciamo finta che sia una specie di innocua web war :) Quoto dall’articolo di Riccardo Degni uscito oggi nella nostra sezione PHP:

Fino al rilascio ufficiale della versione 5 di PHP, si può tranquillamente affermare che quest’ultimo era un linguaggio prettamente procedurale, nonostante la presenza di costrutti che lontanamente richiamavano i concetti della OOP.

Tuttavia, se PHP 4 è un linguaggio procedurale, lo stesso non si può affermare di PHP 5. Quest’ultima release ha portato con sé un kit di strumenti davvero completo che permette di utilizzare le tecniche della OOP all’interno degli script server-side realizzati con il linguaggio in questione. È ovviamente possibile che uno sviluppatore continui a scrivere codice precedurale anche con la versione 5 di PHP, che mantiene intatte tutte le caratteristiche della precedente versione con aggiunte davvero molto interessanti.

In questo articolo vedremo dunque i pro e i contro di entrambe le tecniche di programmazione in questione analizzando accuratamente i punti di forza delle stesse.

Voi da che parte state? Gli adagi degli antichi sono sempre validi, per cui vale pure “in medio stat virtus”… ;)

Tags:

Categoria: PHP e Open Source | Permalink

Commenti

1

Sempre e solo OOP.

# - postato da maurizio Natali - 05 Giugno 2009 - 15:55

2

OOP di sicuro ma… in PHP?

# - postato da cisco - 05 Giugno 2009 - 16:37

3

Dubito che ci possa essere una via di mezzo. In realtà in generale è meglio OOP, ma fino ad ora con PHP era consigliabile continuare ad utilizzare l’approccio procedurale. Per la programmazione orientata agli oggetti, meglio altri linguaggi…

# - postato da cookie - 05 Giugno 2009 - 16:50

4

Credo che il 90% delle persone che risponderanno a (o solo leggeranno) questo post dirà che sta dalla parte della OOP, me compreso. Credo che la programmazione procedurale sia sinceramente prerogativa degli sviluppatori (php almeno) che non ha ancora fatto il salto di qualità (e di conseguenza coloro che non si aggiornano, leggono i blog ecc) degli ultimi anni, da quando circa PHP significava spaghetti code a quando è stato possibile applicare decentemente Singleton a PHP :)

# - postato da lloyd27 - 05 Giugno 2009 - 17:06

5

questo lo devo linkare
http://michaelkimsal.com/blog/.....-oriented/

# - postato da Marco - 05 Giugno 2009 - 18:10

6

… scusa lloyd27, non ho capito, procedurale == spaghetti code e OOP diventa automaticamente buon codice? … dimmi che non ho capito …

# - postato da andr3a - 05 Giugno 2009 - 18:13

7

è probabile che ci si debba prima o poi aggiornare all’oop. Ma da qui a dire che chi programma in OOP fa automaticamente codice migliore di chi programma in procedurale ne passa.

# - postato da max - 05 Giugno 2009 - 18:16

8

Sono pro-OOP! Sinceramente mi viene difficile leggere codice no-oop … figuriamoci poi scriverlo :(

# - postato da innovatel - 05 Giugno 2009 - 18:36

9

Io sto dalla parte dell’ OOP, ma solo in alcuni casi… e non perchè va di moda/fa figo/fa professionale/ecc…

Perchè se io ho una classe che mi filtra le stringhe con 3000 e piu righe di funzioni, ma devo solo fare un escape che mi costa appena un “addslashes”, x quale motivo dovrei includere 3000 e piu righe di classe per una funzioncina sola?

Per progetti complicati OK, tutto il mio appoggio…

Ma per poche righe, è inutile includere una classe intera e appesantire inutilmente il server…

Vi assicuro che un codice procedurale ben commentato e indentato, è molto piu funzionale delle 4 righe di comando per la classe che negli script piccoli sarebbe controproducente, per il semplice fatto della pesantezza delle classi che si potrebbero evitare con 4 righe in piu anzichè le 3000 righe (esempio) della classe…

# - postato da StefanoV - 05 Giugno 2009 - 21:27

10

OOP per progetti oltre il piccolo, senza dubbio. Nei progetti piccoli ci può anche stare la procedurale.. anche se rimane comunque facile creare confusione.

Io penso che l’approccio procedurale e oop derivino in gran parte dal background accademico della persona: avendo fatto l’università, dei miei compagni non ho conosciuto nessuno che studiati entrambi gli approcci abbia preferito il primo. Al lavoro mi è capitato inoltre di notare che persone che avevano imparato a programmare sul lavoro facevano più fatica a comprendere le metodologie ad oggetti. Ovviamente è una mia opinione, ed è solo una tendenza, non una verità applicabile a tutti i casi :)

# - postato da avastreg - 05 Giugno 2009 - 22:08

11

@StefanoV:

e perchè una classe deve avere 3000 righe?? Quella classe ne avrà molte meno se si tratta di elaborazioni semplici riferite ad un oggetto semplice.. è inevitabile in effetti dover scrivere qualche riga in più, ma non cosi tante!

# - postato da avastreg - 05 Giugno 2009 - 22:11

12

Come ha scritto Marco, il PHP NON E’ UN LINGUAGGIO AD OGGETTI, quindi questa discussione è inutile… Inoltre, l’esempio inserito nell’articolo originale (nella sezione PHP di HTML.it) è davvero un esempio penoso…

# - postato da Ivano - 05 Giugno 2009 - 23:51

13

chiunque è pro-oop

anche il più inesperto può trarre vantaggio dal creare “anche una sola classe”

quindi viene difficile, se non stupido, confrontare i due paradigmi

la maggior parte delle persone che è convinta di programmare oop, in realtà programma “procedurale ma diviso per classi e metodi”

(lo sviluppatore medio m$ visual studio ad esempio :D )

quindi oop è “un punto d’arrivo”

e da qui a dire
“io sono pro-oop” o “io programmo solo oop” ce ne passa…

# - postato da Gunn - 06 Giugno 2009 - 05:59

14

Ciao,
con la versione 5.3 php diventa anche un linguaggio di programmazione funzionale.
Come javascript e altri linguaggi le funzioni diventano come variabili e oggetti completamente manipolabili a runtime

# - postato da sasuke - 06 Giugno 2009 - 12:00

15

Ho letto l’articolo e devo dire che mi trovo d’accordo su tutti i punti. Sono una sviluppatrice php che lavorava da parecchi anni con php 4 e da qualche anno si è aggiornata con php 5, quindi penso di avere l’esperienza necessaria per commentare.

Mi trovo totalmente d’accordo con StefanoV, che ribadisce esattamente ciò che è scritto nell’articolo originale, ovvero che la OOP necessita di piu codice rispetto al modello procedurale e non sempre risulta essere la strada consigliata.

Pero, secondo me alcuni commenti che ho letto sono davvero privi di senso. “php non è un linguaggio orientato agli oggetti” qualcuno ha scritto.
Non lo è, ma si puo scrivere codice oop al 100% ed è questo cio che conta, non che il linguaggio in se non sia oop… ne conoscegue che php puo produrre tranquillamente codice oop.

inoltre, Gunn, non è assolutamente vero che tutti sono pro-oop, è un’affermazione assolutamente errata. Il 90% dei miei colleghi preferisce il modello procedurale per tutti i motivi elencati nell’articolo e almeno nel breve termine, nessuno ha intenzione di cambiare rotta.

Infine cio che è sacrosanto sta scritto in uno dei punti dell’articolo: programmare con il modello procedurale è assolutamente meno laborioso e piu immediato. Forse prima di commentare bisognerebbe leggere qualcosa :)

# - postato da Moira - 06 Giugno 2009 - 13:27

16

@sasuke: è vero, se non sbaglio con la 5.3 arrivano an che le lambda functions, il che fa sempre piu incredibilmente assomigliare php a javascript.

# - postato da Moira - 06 Giugno 2009 - 13:31

17

@Gunn, ho già capito che sei un fan di Python :)

# - postato da avastreg - 06 Giugno 2009 - 14:09

18

A mio parere, invece, non è il linguaggio oop o procedurale che conta ma l’ambito di utilizzo.

Sul web a me risulta difficile ragionare col metodo oop anche se utilizzo classi quando ne ho bisogno. Per un software che gira in locale (quindi interazione con gli eventi di utenti e sistema) invece trovo difficile ragionare in maniera procedurale.

Non è nemmeno stato dimostrato che uno sia meglio dell’altro. Il fatto che PHP permetta entrambe le possibilità è un punto a favore del linguaggio. Poi cosa decida di fare lo sviluppatore è un mondo a parte e totalmente soggettivo.

# - postato da Paolo - 06 Giugno 2009 - 17:23

19

Dipende da come si è abituati.

L’OOP permette di strutturare il codice in modo migliore, e di seguire più facilmente le regole dell’ingegneria del software.

Programmare a oggetti con PHP5 significa dover a che fare con limitazioni che a cui nella normale programmazione OOP.
Questo porta a bruttissimo codice OOP se non si è abituati a programmare in VERO codice a oggetti.

Quindi se volte IMPARARE a programmare ad oggetti non usate PHP, o aspettate la versione 6, ma dubito che vedremo grossi cambiamenti, ci vuole un vero cambiamento di rotta radicale.

# - postato da Uranio - 07 Giugno 2009 - 16:51

20

Secondo me, è più facile incominciare a programmare in PHP in modo procedurale, ma per i progetti complessi programmare a oggetti è quasi obbligatorio (poi dipende a quale livello si pensa che un progetto sia complesso).

# - postato da Mattia - 07 Giugno 2009 - 21:56

21

La programmazione a oggetti la trovo molto più comoda da immaginare.

Cioé, è più facile pensare un’oggetto che ha proprietà e metodi per gestire interamente un database anziché una variabile che viene passata come parametro a più funzioni che la leggono o la modificano.

Purtroppo in PHP la programmazione a oggetti non è che si possa definire “completa e utilizzabile al 100%”, però quando è possibile bisogna utilizzarla.

Secondo me, una classe è molto più portabile rispetto a una libreria di funzioni separate…

# - postato da Giacomo Ratta - 07 Giugno 2009 - 21:59

22

Dipendendo dal progetto e dagli obbiettivi vado sul OO o sil procedurale, essendo nato con il 2°, non ho problemi a leggerlo ne scriverlo, e sempre con pochi problemi leggo e scrivo l’OOP…

Per me dipende sempre dai casi a cuio applicarlo…per progetti di medio/grandi dimensioni, è logico un uso del OOP…

Il buon codice non è dato dal tipo di programmazione, ma dal programmatore, ho 2 colleghi che fanno codice in maniera distinta, uno fallo lavorare ad oggetti, l’altro procedurale, fanno codice che è un’opera d’arte, ma non invertirgli i ruoli, che succede un casino!

# - postato da DD - 08 Giugno 2009 - 10:23

23

@andr3a

No, non è quello che intendevo dire…
Spaghetti code ne ho visti di tutti i tipi, anche OOP.. Nell’ambito di PHP però classifico due tipi di programmatori (in linea di massima, poi ci sono le varie sfumature): quelli per passione, a cui importa che il codice sia di qualità, che solitamente utilizzando (per progetti non piccoli ovviamente) codice ad oggetti, e poi quelli per necessità, ovvero quelli che non hanno interessi a migliorarsi, e restano sul modello procedurale che è più semplice da utilizzare (anche se questo è tutto da vedere) ed imparare. Questi sviluppatori sono quelli che più facilmente scriveranno spaghetti code.. Questo intendevo :)

# - postato da lloyd27 - 08 Giugno 2009 - 14:07

24

lloyds27, magari fosse così semplice … la metà dei commenti è scritta da gente che non sa nemmeno cosa significhi OOP, ha imparato un paio di nuove keywords tipo abstract, interface, extend, class, e crede che PHP sia un linguaggio OOP … loro magari ci mettono passione, ma hanno il para-occhi perchè non studiano, testano, usano, altri linguaggi rinomatamente più Object Oriented. JavaScript, che è vecchio come mia nonna, è più OOP di PHP, pui aggiungere metodi perfino alle primitive e tramite valueOf puoi comparare oggetti di ogni tipo … PHP ha qualcosa di Java senza avere il meglio di quest’ultimo, ergo appena la gente proverà metodi pubblici statici con E_STRICT | E_ALL su concetti basilari come File.exists($name) diverso da (new File($name))->exists(), per altro impossibile senza una funzione File($name){return new File($name);} non so nemmeno di cosa stiamo parlando. Overload degli operatori? Java, Python, C#, Parzialmente JavaScript, Ruby .. PHP? naaaaaa, a cosa servono? Overload di metodi? ancora tutti i linguaggi, JavaScript incluso, tra pubblici statici e metodi di instanza .. in PHP, cosa è overload? Lambda? Ma per favore, se non passiamo lo scope esplicitamente e se non è creata all’interno di un metodo la lamda non capisce nemmeno $this e scope innestati … ma stiamo scherzando? Il polimorfismo è castrato in PHP, se non tramite appositi moduli (PECL o librerie esterne), e tutto il codice scritto OOP viene allegramente tramutato in briciole procedurali dal compilatore … volete un linguaggio OOP? E che caspita usate a fare PHP? In PHP, avendo giuste competenze è possibile scegliere, e quando serve, il procedurale è almeno 2 volte più veloce dell’OOP e se l’OOP è scritta da persone che non pensano o non conoscono a fondo l’OOP, ad esempio gli sviluppatori PHP che non hanno idea di altri linguaggi, beh, cari miei, il procedurale da “copia e incolla funzione” per portabilità sarà molto più “advanced” di quello OOP. Scusate eh, ma di gente che chiede OOP in PHP e non sa nemmeno cosa sia ne vedo tutti i giorni troppa! Buon proseguimento con i linguaggi di programmazione, PHP ha tanto da offrire, l’OOP è l’ultima cosa, opinione personale.

# - postato da andr3a - 08 Giugno 2009 - 23:21

25

Concordo molto con andr3a perché non ho capito niente di ciò che ha detto, mi spiego meglio.

Sono uno sviluppatore web che si è avvicinato al mondo della programmazione per eliminare la ripetitività di certi compiti quali, per esempio, il dover cambiare il menu in 100 pagine quando si cambia una voce di link o cambiare i dati di contatto nel footer, e cose simili. Ho quindi cominciato ad usare il php per lavorare meno.

Poi ho scoperto altre possibilità di uso, vedi DataBase, calendari, GDLibrary, ecc. Mi sono appassionato e oggi non potrei neanche pensare di non usare il php per svoluppare un sito, ma non per questo mi chiamo di programmatore, sono uno sviluppatore che usa un linguaggio di programmazione perché è utile. Punto.

Quello che ha detto andr3a mi ha fatto capire una cosa molto importante. Cioè che un programmatore, uno vero, è una persona che ha una formazione specifica e che userà un linguaggio ad hoc per ogni lavoro che gli sarà commissionato, quindi sceglierà l’OOP o il procedurale a seconda delle caratteristiche del linguaggio.

Voglio dire con ciò che questa discussione mi sembra sterile, perché la scelta è tra il PHP o un’altro linguaggio e non tra l’OOP o il procedurale, visto che certe caratteristiche dell’OOP non sono presenti nativamente nel PHP. Per fare un parallelo sarebbe come sviluppare in Windows usando IIS, MySql e PHP. Funziona, sí, ma non sarà MAI, MAI la stessa cosa di sviluppare in Linux usando Apache, MySql e PHP.

Happy Coding

# - postato da Paolo Dodet - 09 Giugno 2009 - 14:50

26

Scusate mi sono sbagliato a scrivere, dove ho scritto:

“… sceglierà l’OOP o il procedurale a seconda delle caratteristiche del linguaggio…”

dovevo scrivere:

“… sceglierà l’OOP o il procedurale a seconda delle caratteristiche del lavoro commissionato”

Bye Everybody

# - postato da Paolo Dodet - 09 Giugno 2009 - 14:55

27

Secondo voi Linux come è stato sviluppato?

è solo una provocazione dai… :)

# - postato da andrea9 - 10 Giugno 2009 - 11:48

28

Paolo, umile e sincero, grazie per il post. andrea9, Linux è parte C, parte C++, parte Python, parte Perl, parte Java … probabilmente in 10 anni parte C# via mono … poichè per l’appunto, saper scegliere è bene, guerre di religione per lo stesso linguaggio tra procedurale, nativo, o OOP, implementato da gente che spesso non ha idee chiare sul cosa stia implementando, non ha senso. Il kernel? Probabilmente solo C, poi c’è tutto il resto … quindi, come è stato sviluppato Linux? ;)

# - postato da andr3a - 10 Giugno 2009 - 16:40

29

In effetti per Linux intendevo sostanzialmente il kernel e in particolare ciò che il suo creatore ha detto commentando la scelta di non utilizzare OOP nello sviluppo (invito tutti a farsi un ricerca su google perchè è abbastanza divertente).
Io personalmente utilizzo OOP (anche perchè senza, non potrei sviluppare su joomla..), su cosa sia meglio non mi esprimo, lascio ai super “mostri” la sentenza..

# - postato da andrea9 - 11 Giugno 2009 - 11:14

30

@Andrea9 il kernel di gnu/linux è stato sviluppato seguendo le linee guida di Torvalds e aperte milioni di discussioni al riguardo, vedi ad esempio la diatriba sul kernel modello 2.4 e quello modello 2.6 il PHP segue un modello analogo, dove ci sono delle linee guida da seguire e mille galli che cantano dicendo che quelle linee guida sono sbagliate e nessuno che codifica ;-)
Tornando in topic quando ho letto l’articolo di Riccardo Degni la prima cosa che ho pensato è stata: “ma che sta a dire questo, ma la conosce davvero la programmazione?” “ma che c’azzeccano portabilità, facilità d’uso, velocità e libertà?”
Ma quando mai c’entra la portabilità, un’applicazione scritta in PHP5 per principio non la porterei su un server dove gira PHP4 è un controsenso inaccettabile, ma se dovessi esserne costretto, comunque avrei dei problemi di portabilità dato che avrei potuto usare costrutti del linguaggio non ancora presenti nella versione precedente e questo indipendentemente che avessi costruito la mia applicazione in modalità procedurale o OOP.
Facilità d’uso del codice? Ma se uno degli assiomi che hanno portato al C++ è stata la facilità d’uso e soprattutto di riuso del codice.
OOP non è difficile da comprendere meno dei cicli di sort, degli alberi binari o delle spline, OOP è solo un altro paradigma se non lo conosci lo impari non hai altre strade.
Non puoi entrare in una ditta e dire che non sai programmare in OOP e non vuoi imparare perché tanto è solo una complicatitudine in più e basta.
Velocità, qui potrei dargli ragione solo perché non conosco i benchmark per le due procedure ma comunque anche qui dipende dal modo di programmare, anche il classico “Hallo world!” può essere programmato da cani e scrivere più codice non significa necessariamente più lento, c’è codice lento e codice più lento, un ciclo è lento, una scelta condizionale è lenta e così via, se vuoi codice veloce programma meglio.
Libertà di cosa? Lo riporto se no mi perdo anche io:

Nella maggioranza dei casi, scrivere gerarchie orientate agli oggetti comporta più tempo sia per quanto riguarda la pianificazione della struttura che per l’effettiva mole di codice da scrivere. Senza contare le diverse ramificazioni di cartelle e script da includere risultanti. Un codice procedurale è generalmente più immediato da produrre e più veloce da scrivere.

Ma che dici? Quale tempo perdi usando un temlate, e quanto tempo perdi scrivendo un metodo per tenere conto di una connessione ad un database aperto, un singleton ad esempio, risolve brillantemente la cosa in un lampo.
Mi fermo qui, mi attaccherete lo so, ma queste cose da guerra estiva non aiutano ne il PHP ne soprattutto la scelta che una persona che si avvicina alla programmazione deve fare.
Tutto sommato è come la famosa guerra degli editor sulle pagine del forum mille anni fa, voi cosa preferite?

m.

PS PHP5 è un linguaggio procedurale con miglioramenti alla parte OOP, se fosse un linguaggio a oggetti puro il suo codice si scriverebbe come in ruby, invece si avvicina di più al Turbo Pascal dalle versioni 5.5 in poi, ma senza mai arrivare a Delphy.

# - postato da Marco Grazia - 16 Giugno 2009 - 18:34

31

Ho programmato in PHP quasi sempre utilizzando un approccio procedurale. Anche progetti grossi, di cui uno open source.
Non credo che il mio codice sia spaghettoso, nella maggior parte dei casi e’ flessibile, manutenibile e leggibile (ho la “brutta” abitudine di commentare!).

Come qualcuno ha gia’ osservato, per le web application , con le tecnologie che ci sono ora, programmare a oggetti sembra a volte una forzatura.

Qualcuno dei fan della OOP a tutti i costi potrebbe farci un esempio *concreto* di una situazione in cui i vantaggi di un approccio OOP in PHP si possono toccare con mano? Non rispondetemi con l’esempio dell’articolo, please…non rispondetemi “Una libreria di accesso ai db” pleeeease…vorrei un caso concreto, magari con un po’ di codice; so che e’ difficile ma proviamoci, puo’ essere una discussione costruttiva per tutti.

Grazie :)

Eugenio

# - postato da Eugenio - 09 Luglio 2009 - 18:45

Inserisci il tuo commento:





(puoi usare i seguenti tag HTML per formattare il testo -
a href, b, i, br/, p, strong, em, ul, ol, li, blockquote, pre):

 

Anteprima del commento