Discussione Meglio programmare ad oggetti o no?

fisica-all

Utente Jade
13 Aprile 2014
1,427
162
332
914
Ciao a tutti,
Come da titolo ultimamente vorrei capire una cosa: conviene (per quanto riguarda l'efficienza di calcolo del codice) lavorare con gli oggetti o no?
Mi spiego meglio:
ho un programma/script/bot scritto in 20 file diversi. A parte alcune classi obbligatorie, il resto gira tutto tramite funzioni che chiamano funzioni.
Capisco che la comprensione del codice non sia facile per terzi, ma oltre a questo ci si rimette anche a livello di efficienza computazionale o no?

Spero di aver reso l'idea, grazie a tutti!
 
I paradigmi di programmazione sono un modo per classificare i linguaggi e di per sé non hanno alcun impatto sulla performance. Quello che ha un impatto sulla performance è il modo in cui alcune features vengono implementate. Ad esempio, il polimorfismo per sottotipi viene tipicamente implementato con una cosa chiamata virtual table e un method lookup su questa tabella ha un significativo impatto sulla latency della chiamata. Considerazioni simili si possono fare anche per altri paradigmi, ma tipicamente bisogna prima fissare il linguaggio: per esempio, applicare alcuni approcci del paradigma funzionale in Python può degradare la performance molto più che applicare gli stessi approcci in Java.

Adesso che ho risposto alla tua domanda, ti faccio una considerazione basata su una famosa citazione.
We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%.
Sviluppa il tuo programma in modo manutenibile, che realisticamente non è con un'accozzaglia di funzioni. Valuta se il tuo programma non è sufficientemente veloce. Se non lo è, effettua delle misurazioni (sei un fisico e dovresti capire meglio di me l'importanza di queste) per capire dove il tuo programma è lento. Ottimizza queste "parti lente" del tuo codice e ripeti l'intero ragionamento.

conviene (per quanto riguarda l'efficienza di calcolo del codice) lavorare con gli oggetti o no?

ho un programma/script/bot scritto in 20 file diversi. A parte alcune classi obbligatorie, il resto gira tutto tramite funzioni che chiamano funzioni.
Difficile valutare la tua scelta senza guardare il codice... e con 20 file diversi, anche avendo la possibilità, non so se avrei la voglia di farlo. Visto che hai usato un linguaggio object oriented (Java?) ho la sensazione che hai fatto un po' una porcata. Andando a naso, direi che dovresti considerare seriamente di ristrutturare il tuo codice in modo piuttosto significativo... non per guadagnare qualcosina in performance, ma per imparare a programmare in modo migliore e per semplificarti la vita nel momento in cui vorrai aggiungere/rimuovere delle features.
 
Grazie mille per tutta la spiegazione, come sempre esaustiva.

In realta' ho usato Python, ma non perche' non sappia lavorare ad oggetti o cose simili, ho molti progetti tutti e solo con oggetti, ma perche' nella mia testa evitare chiamate al db a volte era meglio, quindi invece di dover creare un oggetto, semplicemente passavo quel dato tramite funzione

Comunque per comodita', visto che non influisce su alcuna performance e ovviamente il codice sara' piu' leggibile, riscrivero' il tutto (tanto non ci vuole molto), grazie mille!
 
In Python la storia è un po' diversa perché sebbene supporta il paradigma object oriented, non è che lo incentiva più di tanto. Per quanto riguarda la performance, devi principalmente evitare l'uso di variabili globali e (soprattutto) sfruttare bene tutte le strutture dati che ti offre. Ti consiglio anche di dare un'occhiata a PyPy. Per quanto riguarda la struttura del codice e la manutenibilità, è ancora valido quello che ti ho scritto nel messaggio precedente: se ristrutturando il codice usando un paradigma diverso ottieni qualcosa di più ordinato, più manutenibile e più chiaro, devi farlo.

La verità è che se la performance è veramente un problema devi cambiare linguaggio. Python è notoriamente un linguaggio molto lento e lo stesso programma implementato in Java o in Go (non è il caso di parlare di C++) potrebbe andare tranquillamente 10-100 volte più veloce. Python è popolare proprio perché spesso la performance non è così importante... e quando lo è, è sufficiente implementarla in un altro linguaggio e interfacciarsi con Python a livello di libreria.
 
Vado in ordine:
Variabili globali non ne uso, sia per una questione di "sicurezza" mia che per una questione di confusione

La ristrutturazione potrei farla qualora appunto mi accorgessi che potrebbe servire piu' chiarezza e, soprattutto, per creare UML in automatico, perche' con l'utilizzo di sole funzioni non sono riuscito a tirare nessuno schema

Le performance non sono affatto un problema, perche' le operazioni da compiere sono molto "leggere", infatti va velocissimo anche su un pc dell'AC.
L'operazione piu' costosa e' semplicemente il fare chiamate ad un db, ma per il resto si tratta solo di lavoro su stringhe e requests