PDA

View Full Version : Per una base generale quale linguaggio OO studiare?


felice86
04-06-2010, 10:58
ragazzi tra le materia della prima prova è riportato un generale linguaggi e tecniche di programmazione senza specificare quale/i linguaggio/i....premettendo che presumo si tratti di OO e che ho nozioni base di diversi linguaggi ma tutte da spolverare...su cosa mi consigliate di focalizzarmi? JAVA? C? C++?

grazie

lupoxxx87
04-06-2010, 11:01
prima prova di che ?
se è riferito ad un esame, dovresti attenerti al programma di questo...

felice86
04-06-2010, 11:08
prima prova di che ?
se è riferito ad un esame, dovresti attenerti al programma di questo...
Concorso e non hanno specificato altro se non quella dicitura...

Opcode
04-06-2010, 11:35
Se vuoi fare OOP hai da segliere o C++ o Java, sicuramente non C (se parliamo di OOP pura).

Dovresti sapere te più o meno se ti conviene più il Java o il C++, ma io andrei su quest'ultimo. Se sai che stanno cercando qualcuno bravo con Java vai su quello.

ps. ho risposto supponendo che OO = object oriented, se così non fosse chiedo venia.

felice86
05-06-2010, 11:29
Se vuoi fare OOP hai da segliere o C++ o Java, sicuramente non C (se parliamo di OOP pura).

Dovresti sapere te più o meno se ti conviene più il Java o il C++, ma io andrei su quest'ultimo. Se sai che stanno cercando qualcuno bravo con Java vai su quello.

ps. ho risposto supponendo che OO = object oriented, se così non fosse chiedo venia.
In pratica ho passato una prova preselettiva (concorso) nella quale alcune domande di informatica erano riferite alla OOP. Dovrò quindi sostenere la prima prova e tra gli argomenti il bando riporta un generico linguaggi e tecniche di programmazione. Poichè la preselettiva trattava l'OOP ho presupposto che anche le prove successive siano riferite al C++ o JAVA, ma non so quale dei due interessi loro maggiormente.

Penso di buttarmi sul JAVA...poichè credo sia + utilizzato al giorno d'oggi...hai da consigliarmi guide? manuali? ebook?

grazie :)

DanieleC88
05-06-2010, 11:36
Secondo me ti conviene studiare Java, che tra i due è quello che meglio riflette i concetti della programmazione orientata agli oggetti (tanto per dirne una, non c'è un modo "naturale" di implementare un'interfaccia in C++, mentre in Java esiste un costrutto apposito).

fero86
05-06-2010, 13:14
ragazzi tra le materia della prima prova è riportato un generale linguaggi e tecniche di programmazione senza specificare quale/i linguaggio/i....premettendo che presumo si tratti di OO e che ho nozioni base di diversi linguaggi ma tutte da spolverare...su cosa mi consigliate di focalizzarmi? JAVA? C? C++? se puoi scegliere uno qualunque di questi tre linguaggi perché non hai nessuna indicazione allora scegli quello che é senza dubbio il piu semplice da imparare: C.

fero86
05-06-2010, 13:19
(tanto per dirne una, non c'è un modo "naturale" di implementare un'interfaccia in C++, mentre in Java esiste un costrutto apposito). se PGI-Bis leggesse ti strangolerebbe :D

le interfacce non hanno nulla a che vedere con la programmazione orientata agli oggetti, tant'é vero che si possono realizzare anche in C sotto forma di strutture contenenti puntatori a funzioni, che guarda caso finiscono per avere lo stesso layout in memoria delle interfacce C++, dove per "interfacce C++" si intendono classi contenenti solamente metodi virtuali puri (quindi solo la vtable); COM, infatti, che si basa pesantemente sull'uso di interfacce, puó essere utilizzato in questo modo anche in C (MIDL genera headers sia per C++ che per C).

DanieleC88
05-06-2010, 13:34
Sì, lo so, ma se è per questo uno, volendo, potrebbe fare programmazione orientata agli oggetti anche in assembly. :p
Ciò non toglie che alcuni linguaggi (come Java, appunto) tendono ad incarnare in maniera più naturale quei costrutti che altrimenti, in modo artificioso, potresti ricreare dove ti pare a te. Non mi pare di aver detto chissà quale eresia. :D

WarDuck
05-06-2010, 13:46
Java senza dubbio, dato che C++ richiede ulteriori conoscenze che esulano dal contesto Object Oriented come la gestione della memoria.

Per precisare: non che questo sia dannoso, ma Java (ed i suoi manuali) ti permettono di concentrarti più sul paradigma che sull'implementazione vera e propria.

Tommo
05-06-2010, 14:07
Java, se devi concludere qualcosa rapidamente.
E poi è il più "accademico" tra i linguaggi mainstream, nel senso che segue il più possibile la teoria dell'OOP senza sporcarsi le mani in "facezie" come gestione della memoria, ottimizzazioni, syntactic sugar etc.

Invece se vuoi una "base generale" nel senso conoscenze molto riutilizzabili, consiglierei C++...
è un dato di fatto che chi sa C++ ad alti livelli può diventare produttivo con qualsiasi altro linguaggio in pochi giorni, ma non è affatto vero il contrario.
Però a imparare C++ ce ne vuole di tempo...

felice86
05-06-2010, 14:22
Bene, grazie a tutti....credo proprio che mi butterò sul JAVA...

mi serve avere una base teorica di OOP, oltre che pratica...avete da consigliarmi guide-manuali-ebook?

grazie :D

cdimauro
05-06-2010, 14:38
Io vado controcorrente, e ti consiglio SmallTalk (http://en.wikipedia.org/wiki/Smalltalk).

Non foss'altro per vedere la faccia che farebbero quelli che devono valutarti, se non conoscono il linguaggio (visto che non è esattamente "mainstream", anche fondamentalmente è quello che ha fatto esplodere il fenomeno OOP). :D

kelendil
05-06-2010, 14:43
C'è anche C# in caso.

fero86
05-06-2010, 22:58
Sì, lo so, ma se è per questo uno, volendo, potrebbe fare programmazione orientata agli oggetti anche in assembly. :p
Ciò non toglie che alcuni linguaggi (come Java, appunto) tendono ad incarnare in maniera più naturale quei costrutti che altrimenti, in modo artificioso, potresti ricreare dove ti pare a te. Non mi pare di aver detto chissà quale eresia. :D infatti ne hai dette due, qui c'é la seconda :D
se PGI-Bis leggesse ti strangolerebbe di nuovo: in assembly non puoi fare programmazione orientata agli oggetti.

in un post di qualche giorno fa PGI-Bis spiegava la programmazione a oggetti nel seguente modo: il codice é fatto di definizioni, nella programmazione orientata agli oggetti alcune definizioni stanno all'interno di altre. punto.
le interfacce e l'assembly non c'entrano nulla.

DanieleC88
05-06-2010, 23:03
infatti ne hai dette due, qui c'é la seconda :D
se PGI-Bis leggesse ti strangolerebbe di nuovo: in assembly non puoi fare programmazione orientata agli oggetti.
Perché no? (http://c2.com/cgi/wiki?ObjectOrientedAssembler)

Se non fosse teoricamente possibile farlo in assembly non potresti farlo nemmeno in C, e nemmeno in C++ di conseguenza.

EDIT: e comunque, con tutto il rispetto che posso nutrire per PGI-Bis, ma non mi sembra il depositario della conoscenza universale, potrei benissimo venire a definirti la programmazione ad oggetti in un modo equivalente, non per questo sarebbe errato perché non l'ha usato PGI-Bis.

fero86
05-06-2010, 23:23
Perché no? (http://c2.com/cgi/wiki?ObjectOrientedAssembler) questo é l'ennesimo autore che fraintende grandemente la object orientation:
I think the point is that OO is simply a way of thinking, a way of spreading around responsibility. It can be done in any language, OO languages just help enforce some of the ideas and make things easier, but the code is OO whether or not the languages enforces the concepts. For example, a lack of forced encapsulation doesn't mean it's not OO, as long as the code uses encapsulation as a concept. OO is about certain concepts, not the implementations of them. Rob Martin is a respected OO vet, if he says it's OO, then it's OO, who are you to question him on something he wrote? no, non é cosi; vedi mio post precedente.

sono ufficialmente in ansiosa attesa che PGI-Bis posti la guida che aveva promesso circa la OOP: la divoreró con estremo interesse e, soprattutto, sono curioso di conoscere le fonti. cosi finalmente avró risposte piu precise quando si (s)parla di OOP.



Se non fosse teoricamente possibile farlo in assembly non potresti farlo nemmeno in C, e nemmeno in C++ di conseguenza. non so se il C rientra nella definizione secondo PGI-Bis di linguaggio OO, ma il C++ sicuramente si; questo é possibile perché il C++ rispetto al C fornisce numerosi altri costrutti.



EDIT: e comunque, con tutto il rispetto che posso nutrire per PGI-Bis, ma non mi sembra il depositario della conoscenza universale, e questo é il motivo per cui della sua guida leggeró attentamente le fonti :D
d'altra parte cosa vuoi che possa scrivere un magazziniere con l'hobby dell'informatica? bisogna verificare prima di fidarsi.



potrei benissimo venire a definirti la programmazione ad oggetti in un modo equivalente, non per questo sarebbe errato perché non l'ha usato PGI-Bis. se fosse un modo equivalente immagino che PGI-Bis non avrebbe nulla in contrario.

DanieleC88
05-06-2010, 23:39
questo é l'ennesimo autore che fraintende grandemente la object orientation:
[...]
no, non é cosi; vedi mio post precedente.
Be', quello è WikiWikiWeb, il primo Wiki della storia, ed è stato creato e riempito dall'ennesimo autore (tale Ward Cunningham). Non sarà Dio sceso in terra, ma mi sembra un personaggio discretamente autorevole. :D
(In più è un Wiki, per cui se non sei d'accordo puoi integrare.)

Per quanto mi riguarda di definizioni ne possiamo dare tante, ma finché riesco ad ottenere incapsulamento, ereditarietà e polimorfismo sta bene. In fondo parliamo di programmazione orientata agli oggetti. In questo senso è replicabile ovunque. :)

PGI-Bis
06-06-2010, 00:02
Naturalmente non strangolerei nessuno. Non vorrei poi aver ottenuto l'effetto di far ritenere che qualsiasi linguaggio sia orientato agli oggetti. No. C è orientato agli oggetti tanto quanto assembly, cioè per nulla.

Il procedimento che si usa per determinare se un linguaggio supporti o non supporti una certa prospettiva è composto di due passaggi:

prima si individua l'insieme di caratteristiche necessarie a rappresentare un qualsiasi fenomeno tradotto nei termini di quella prospettiva

poi si determina se ognuna di quelle caratteristiche possiede una forma corrispondente diretta nel linguaggio.

La corrispondenza è diretta quando la caratteristica è riprodotta senza combinare elementi intermedi del linguaggio.

L'esempio tipico che si fa è quello del for e del while. Se io dicessi che una certa prospettiva richiede l'esistenza di un ciclo for e mi trovassi di fronte ad un linguaggio che ha il while ma non for, non potrei dire che tale linguaggio supporti l'ipotetica prospettiva: benchè il for sia sempre simulabile tramite un while la simulazione richiede la combinazione del while con qualcosa che non fa parte del while ma esprime un'altra caratteristica del linguaggio: sto combinando diversi elementi per rappresentarne uno solo.

E' questo che impedisce ad un assembly di essere orientato a qualsiasi cosa: essendo praticamente codice macchina se non si può fare in assembly è proprio la macchina a non poterlo fare. Il problema è che non può fare certe cose senza ricorrere alla combinazione di elementi che nel linguaggio hanno un diverso scopo.

Così è possibile fare programmazione funzionale in Java ma Java non è un linguaggio funzionale perchè c'è una caratteristica della programmazione funzionale, l'ordine superiore, che in Java non è rappresentabile se non passando per la combinazione di più elementi: posso rappresentare una funzione con un metodo, e qui la corrispondenza è diretta, ma per rappresentare una qualsiasi funzione di ordine superiore devo usare classi, istanze e metodi.

Ora, qual'è il "segno" dell'orientamento agli oggetti. Li ha detti tutti e due fero86 ma dei due sembra poi considerarne uno solo.

Prima di tutto devo poter esprimere delle definizioni. E questo è talmente "lato", talmente "semplice" (l'oo, lo ricordo, è veramente elementare, roba da bimbi), che qualsiasi linguaggio in quanto tale è in grado di farlo. Proprio se parliamo di linguaggio allora deve per forza essere in grado di esprimere almeno una definizione.

La seconda è che di queste definizioni alcune stanno dentro alle altre, ovvero devono poter essere combinate. E' quello che faccio quando dico che il rosso è una tripletta rgb (255, 0, 0) e il tal pixel è rosso: combino la definizione di pixel con quella di rosso.

E dove sta la sorpresa? La sorpresa sta nel fatto che se andiamo ad esaminare questo mero fatto che alcune definizioni possano contenerne altre, scopriamo cose curiose: se definiamo "oggetto" una definizione non contenuta in altre definizioni, un sistema composto di una sola definizione è anche composto di un solo oggetto (da cui orientamento agli oggetti, l'oggetto è l'elemento di base). Ma scopriamo sopratutto che quando due definizioni non altrimenti contenute (cioè due oggetti) contengano una medesima definizione esse sono in grado di comunicare tra di loro senza perdere la propria qualità di oggetto.

Ed è questo il secondo totem dell'orientamento agli oggetti, la capacità di combinare delle definizioni in modo tale che pur restando oggetti esse siano in grado di "comunicare".

E qual'è la caratteristica che un linguaggio deve avere affinchè si possa esprimere questa combinazione?

In sintesi, la capacità di collegare dinamicamente un nome ad una definizione. Senza collegamento dinamico non c'è modo di far sì che una definizione ne usi un'altra senza assorbirla.

Si può "fare" collegamento dinamico in C o in un assembly? Come no, ci si può fare tutto. Ma si può fare senza ricorrere a elementi intermedi del linguaggio? No.

Per spiegarmi meglio, il fatto che C++ sia orientato agli oggetti non gli deriva dall'avere le classi, ma dal fatto che alcune cose possano essere "virtual".

Circa la guida, occhio all'ansia: meno di due mesi non mi ci vogliono.

PGI-Bis
06-06-2010, 00:05
E da una letta veloce di

http://c2.com/cgi/wiki?ObjectOrientedAssembler

non senza una certa sorpresa, direi che l'autore centri il punto. Cos'ha il suo sistema di caratteristico? Il nostro eroe, il collegamento dinamico.

DanieleC88
06-06-2010, 00:16
[...] Si può "fare" collegamento dinamico in C o in un assembly? Come no, ci si può fare tutto. Ma si può fare senza ricorrere a elementi intermedi del linguaggio? No.
In pratica siamo tornati al primo mio post di questo thread. Riassumendo: si può fare programmazione ad oggetti dove meglio si crede, ma certi linguaggi sono più naturalmente portati a fartelo fare. Vedasi C++ contro Java. :)

ciao ;)

fero86
06-06-2010, 00:18
[...] Circa la guida, occhio all'ansia: meno di due mesi non mi ci vogliono. intanto grazie per il post :)

PGI-Bis
06-06-2010, 00:21
Mah, non parlerei di "portamento naturale", che fa tanto sociologo. Riguardo al supporto, è un sì o no a bruciapelo. Riguardo alla simulazione, se è turing completo dovrebbe essere sempre sì, altrimenti bisogna valutare.

DanieleC88
06-06-2010, 00:24
Poveri sociologi, cos'hanno fatto di male? :D

PGI-Bis
06-06-2010, 00:37
Era una battuta che fece il mio prof di diritto comparato all'esame di un mio amico: domanda sull'ordinamento tedesco, lui che senza vergogna, non avendo studiato una riga che fosse una, parte con una risposta stile "miti e leggende dell'oktoberfest", e il prof che lo blocca al volo: senta, non faccia il sociologo, cosa dice la norma di cui le ho chiesto? :D

Da allora mi viene in mente ogni volta che di fronte ad una questione misurabile si da una soluzione non sbagliata ma in forma per così dire "colloquiale".

E adesso sapete la storia del sociologo :D.

Tommo
06-06-2010, 00:53
*

http://www.indievault.it/forum/images/smilies/smiley_hail.gif

Grande post, in effetti mi ero sempre posto la domanda di "cosa è OOP" ma non mi ero mai risposto con una precisione paragonabile.

DanieleC88
06-06-2010, 01:01
Era una battuta che fece il mio prof di diritto comparato all'esame di un mio amico: domanda sull'ordinamento tedesco, lui che senza vergogna, non avendo studiato una riga che fosse una, parte con una risposta stile "miti e leggende dell'oktoberfest", e il prof che lo blocca al volo: senta, non faccia il sociologo, cosa dice la norma di cui le ho chiesto? :D

Da allora mi viene in mente ogni volta che di fronte ad una questione misurabile si da una soluzione non sbagliata ma in forma per così dire "colloquiale".

E adesso sapete la storia del sociologo :D.
Ah ecco. :D

Che ci vuoi fare, purtroppo non riesco sempre ad esprimermi al meglio. L'aver iniziato da autodidatta mi ha segnato, e i miei studi ancora non hanno saputo rimediare a questa carenza di forma.

Diciamo che sono un contadino dell'informatica. :p
ciao ;)

PGI-Bis
06-06-2010, 01:23
Se tu zappi, io vango, non è che ci sia una gran differenza. Bisognerebbe capire se siam messi meglio di quelli che girano con le carriole di letame...

In fondo c'è un che di agreste nell'informatica, no?

DanieleC88
06-06-2010, 01:29
Sì che c'è. Tanto nell'informatica quanto nella coltivazione dei campi, le cose migliori le impari dall'esperienza, e non dai libri.

E poi vuoi mettere, quell'odorino di letame dà più gusto ad ogni cosa. :cool:

^TiGeRShArK^
06-06-2010, 02:06
se puoi scegliere uno qualunque di questi tre linguaggi perché non hai nessuna indicazione allora scegli quello che é senza dubbio il piu semplice da imparare: C.

:rotfl:
Certo il più semplice linguaggio per la programmazione ad oggetti è ovviamente il C. :rotfl:
Ma ve le pensate la notte certe battute? :asd:
Hai mai visto del codice OO scritto in C? :asd:
Io si, ed è assolutamente controintuitivo, come d'altronde ci si aspetterebbe da un linguaggio PROCEDURALE che per scrivere in maniera OO ha bisogno di opportune librerie dato che non è supportato nativamente e il risultato è, ad essere BUONI, osceno. :asd:
Anzi, almeno non gli hai consigliato l'assembly che per programmare ad oggetti è ancora peggio del C. :asd:

^TiGeRShArK^
06-06-2010, 02:10
infatti ne hai dette due, qui c'é la seconda :D
se PGI-Bis leggesse ti strangolerebbe di nuovo: in assembly non puoi fare programmazione orientata agli oggetti.

in un post di qualche giorno fa PGI-Bis spiegava la programmazione a oggetti nel seguente modo: il codice é fatto di definizioni, nella programmazione orientata agli oggetti alcune definizioni stanno all'interno di altre. punto.
le interfacce e l'assembly non c'entrano nulla.

Si può programmare ad oggetti anche in assembly.
Il risultato è assolutamente VOMITEVOLE, come per il C d'altronde, ma si può fare.
E detto da chi consiglia il C come linguaggio OO "semplice da imparare" è una bella barzelletta. :asd:

^TiGeRShArK^
06-06-2010, 02:15
Perché no? (http://c2.com/cgi/wiki?ObjectOrientedAssembler)

Se non fosse teoricamente possibile farlo in assembly non potresti farlo nemmeno in C, e nemmeno in C++ di conseguenza.

EDIT: e comunque, con tutto il rispetto che posso nutrire per PGI-Bis, ma non mi sembra il depositario della conoscenza universale, potrei benissimo venire a definirti la programmazione ad oggetti in un modo equivalente, non per questo sarebbe errato perché non l'ha usato PGI-Bis.

e infatti è PRATICAMENTE possibile programmare in maniera OO in assembly:
http://c2.com/cgi/wiki?ObjectOrientedAssembler

It is definitely possible to do OO in assembler, of course, and I have. So no, no language is inherently procedural. However, assembler doesn't give any support for non-procedural methods. Obviously.

giusto per citare il primo link che mi capita sotto mano.
Qualsiasi linguaggio turing completo può essere utilizzato per fare programmazione OO, ma sono detti linguaggi OO quelli che danno un supporto NATIVO al paradigma object oriented.
Per questo proporre di imparare il C o l'assembly come linguaggi OO è una FOLLIA.

^TiGeRShArK^
06-06-2010, 02:17
questo é l'ennesimo autore che fraintende grandemente la object orientation:
no, non é cosi; vedi mio post precedente.

sono ufficialmente in ansiosa attesa che PGI-Bis posti la guida che aveva promesso circa la OOP: la divoreró con estremo interesse e, soprattutto, sono curioso di conoscere le fonti. cosi finalmente avró risposte piu precise quando si (s)parla di OOP.



non so se il C rientra nella definizione secondo PGI-Bis di linguaggio OO, ma il C++ sicuramente si; questo é possibile perché il C++ rispetto al C fornisce numerosi altri costrutti.



e questo é il motivo per cui della sua guida leggeró attentamente le fonti :D
d'altra parte cosa vuoi che possa scrivere un magazziniere con l'hobby dell'informatica? bisogna verificare prima di fidarsi.



se fosse un modo equivalente immagino che PGI-Bis non avrebbe nulla in contrario.

Il C e l'assembly NON rientrano assolutamente nella definizione comune di linguaggi OO.
Ma ciò non toglie che sia possibile scrivere codice OO propriamente detto anche in quei linguaggi.
Quello che manca, e che fa la differenza, è il supporto NATIVO.

^TiGeRShArK^
06-06-2010, 02:23
E da una letta veloce di

http://c2.com/cgi/wiki?ObjectOrientedAssembler

non senza una certa sorpresa, direi che l'autore centri il punto. Cos'ha il suo sistema di caratteristico? Il nostro eroe, il collegamento dinamico.

Infatti, come ogni linguaggio turing completo permette di programmare ad oggetti, ma non rientra nella definizione comunemente accettata di linguaggio OO dato che non offre il benchè minimo supporto nativo, esattamente come il C, che era stato così masochisticamente consigliato all'autore del thread come "linguaggio OO semplice da imparare". :)

cdimauro
06-06-2010, 07:31
Hai mai visto del codice OO scritto in C? :asd:
http://upload.wikimedia.org/wikipedia/commons/1/17/GObject_example.png

:fiufiu: :asd:

^TiGeRShArK^
06-06-2010, 08:55
http://upload.wikimedia.org/wikipedia/commons/1/17/GObject_example.png

:fiufiu: :asd:
infatti :asd:

DanieleC88
06-06-2010, 10:13
e infatti è PRATICAMENTE possibile programmare in maniera OO in assembly: [...]
E tre...

Qualsiasi linguaggio turing completo può essere utilizzato per fare programmazione OO, ma sono detti linguaggi OO quelli che danno un supporto NATIVO al paradigma object oriented.
Ecco, bravo, era appunto quello che intendevo io. Se vuoi lo PUOI fare (visto che io avevo risposto al "non si può fare in assembly") dove ti pare, in teoria, ma ciò non toglie che sia come spararsi nelle palle.

ciao ;)

^TiGeRShArK^
06-06-2010, 10:41
E tre...


Ecco, bravo, era appunto quello che intendevo io. Se vuoi lo PUOI fare (visto che io avevo risposto al "non si può fare in assembly") dove ti pare, in teoria, ma ciò non toglie che sia come spararsi nelle palle.

ciao ;)
infatti era un "rafforzativo" del tuo post. :p

felice86
06-06-2010, 12:39
ragazzi non volevo dar vita ad una disputa! :D :Prrr:

in ogni caso l'oggetto del mio studio sarà il JAVA...avete da consigliarmi guide? manuali? ebook? premetto che mi serve un infarinatura teorica di OOP in linea generale...e conoscenze pratiche di programmazione (per ragioni di tempo non farò gli argomenti di java avanzato)

PGI-Bis
06-06-2010, 13:14
Ci sono un paio di thead sull'argomento

http://www.hwupgrade.it/forum/showthread.php?t=2197151
http://www.hwupgrade.it/forum/showthread.php?t=2181876