Paragoni tra terminologia - C vs Obj-C

di il
8 risposte

Paragoni tra terminologia - C vs Obj-C

Ciao a tutti
Apro questo 3rd nel quale vorrei raccogliere paragoni tra i termini usati in C e in Obj-C

Esempio:
Possiamo dire che gli oggetti in una classe di obj-C possono essere assimilati ai membri di una struct di C?

Attendo altri commenti per arricchire questa specie di dizionario...

8 Risposte

  • Re: Paragoni tra terminologia - C vs Obj-C

    Ciao toti81
    bell' argomento, in effetti esistono differenze di nomenclatura importanti.

    Faccio prima una parentesi sulle struct. Le struct del C si sono evolute nelle classi del C++. In C++ la differenza tra le struct e le classi è minima. In una struct in C++ oltre che i campi può dichiarare dei metodi, ovvero delle funzioni che agiscono sui campi, ad esempio:
    
    struct Point  // ma anche class Point
    {
       double x;
       double y;
     
       double DistanzaDallOrigine()
       {
              return sqrt(x*x + y*y);
       }
    }
    
    In Objective-C le cose sono andate diversamente le classi ma sono una cosa molto diversa dalle struct.

    Per toranare alle differenze di nomenclatura, una differenza importante è che in C (o meglio C++) i metodi delle classi o delle struct si chiamano per l' appunto metodi mentre in Objective-C vengono chiamati messaggi inoltre invece di dire 'richiamare un metodo' si dice 'Inviare un messaggio'.
    
    in C/C++                   in Objective-C
    
    Metodo               ->    Messaggio
    Chiamare un metodo   ->    Inviare un messaggio
    
    Questa nomenclatura viene da Smalltalk da cui Objective-C ha preso il modello a oggetti.

    Riassumendo, il C++ ha esteso le struct del C per cui classi e struct sono simili, L' objective-C ha preso le classi da Smaltalk per cui classi e struct non hanno niente in comune.
  • Re: Paragoni tra terminologia - C vs Obj-C

    Chiaro, ma a cosa potremmo assimilare le classi e gli oggetti? Anche con termini fuori dal mondo della programmazione, ad esempio: insiemi?
  • Re: Paragoni tra terminologia - C vs Obj-C

    E le librerie? In c ci sono le library, in obj-c ?
  • Re: Paragoni tra terminologia - C vs Obj-C

    Ciao toti81

    toti81 ha scritto:


    Chiaro, ma a cosa potremmo assimilare le classi e gli oggetti? Anche con termini fuori dal mondo della programmazione, ad esempio: insiemi?
    Una bella chiacchierata su classi e oggetti ogni tanto ci vuole, anche se sono cose cose già dette ripeterle non fa male.
    Saro breve:

    Intanto bisogna distinguere oggetto e classe. Un oggetto è qualcosa di concreto, di reale mentre la classe è un' idea, potremmo anche usare il termine 'Tipo'. Fido e Pluto sono due cani ovvero corrispondono a quell' idea di caninità che è nella nostra testa (Platone parlò a lungo di questo), possiamo dire che Fido e Pluto sono due istanze della classe 'Cane', oppure che sono due oggetti di tipo 'Cane'.

    Nella classe descriviamo quali caratteristiche deve avere un oggetto e in questa descrizione specifichiamo attributi e comportamenti. Un cane deve avere quattro zampe, una coda, due orecchie, ma deve anche abbaiare, rincorrere i gatti, scodinzolare (queste ultime sono azioni).

    L' idea della programmazione ad oggetti è proprio questa, ovvero unire in un' unica entità attributi e comportamenti. Ad esempio in un gioco potremmo avere delle automobili, un' automobile ha una velocità e una direzione questi sono gli attributi e saranno due variabili numeriche, ma una automobile ha anche dei comportamenti, può accelerare, curvare ecc, questa sono azioni. I comportamenti saranno descritti da delle funzioni che fanno parte della classe e che agiscono sui campi dell' oggetto.

    Ad esempio 'accelera' modificherà il campo velocita dopo aver controllato di non aver raggiunto la velocita massima e magari controllando se la strada è in salita per variare l' accelerazione.

    Questo ci porta ad altre considerazioni, un oggetto da solo serve a poco, quando programmi ad oggetti ti preoccupi principalmente dell' interazione di molti oggetti. Ad esempio una macchina è su una strada, su una strada vi sono molte macchine, una strada può essere in pendenza. La classe strada conterrà un array di automobili, e un attributo pendenza. Un' automobile potrà avere dei riferimento alla strada, in questo modo i metodi della classe macchina possono esaminare la strada e attraverso di essa valutare la presenza di altri veicoli. ecc ecc.

    Questo mi fa venire in mente un altro esempio formato dalle classi 'Scena', 'Soldato', 'Arma', 'Proiettile', quattro classi tanti oggetti. Vi sarà probabilmente un solo oggetto 'Scena' ma questo conterrà numerosi oggetti 'Soldato', ognuno con la sua posizione ecc, ogni soldato possiede delle armi, diciamo due oggetti Pistola e un oggetto Fucile, ogni arma contiene dei proiettili, ovvero oggetti di tipo Prioettile (i proiettili del fucile sono diversi da quelli della pistola, sono tipi diversi ma imparentati).

    Un soldato esamina la scena e quando vede un altro soldato gli spara, ovvero prima manda un messaggio all' arma opportuna di orientarsi in un certo modo, poi le manda un secondo messaggio di fare fuoco, a questo punto la pistola invia un messaggio al primo oggetto proiettile del caricatore per metterlo in movimento, un proiettile durante il movimento esamina la scena e se incontra un soldato lo uccide, ovvero manda un messaggio all' oggetto soldato che ha intercettato e questo messaggio mette il soldato nello stato morto.
    Poi faremo degli esempi concreti.
  • Re: Paragoni tra terminologia - C vs Obj-C

    Leggendo questo glossario https://developer.apple.com/library/IOs/ipad/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocGlossary.html ho trovato il termine namespace usato in Objective-C, ma non si tratta dei namespace come vengono intesi in C++/C# ma indica un generico ambito in cui il nome è unico. Ad esempio i nomi dei metodi sono unici all' interno di una classe.

    Ricordiamo che la mancanza dei namespace in Objectiive-C e all' origine della consuetudine di attribuire dei prefissi ai nomi delle classi, ad esempio NSString.
  • Re: Paragoni tra terminologia - C vs Obj-C

    Standing ovation!!
    Molto chiaro, credo possa servire a molti che si affacciano alla programmazione ad oggetti!
  • Re: Paragoni tra terminologia - C vs Obj-C

    .      @interface Fraction: Object {
    int numerator;
    int denominator;
    }
    - (void) print;
    - (void) setNumerator: (int) n;
    - (void) setDenominator: (int) d;       
    E corretto dunque dire che Fraction è una classe, numerator e denominator sono oggetti (o istanze) della classe, e print, set numerator, setdenominator sono azioni o metodi?

    Chiedo venia se sbaglio....
  • Re: Paragoni tra terminologia - C vs Obj-C

    Ciao toti81,
    porta pazienza se uso la terminologia C++ e quella Objective-C mischiate.

    Perfetto, hai dichiarato una classe, il nome della classe è Fraction, i suoi campi (o attributi, o variabili) sono 'numerator' e 'denominator', e i suoi metodi (o azioni, o messaggi) sono print, setNumerator, setDenominator.

    Per il momento non ci sono oggetti.

    Per istanziare una classe (cioè creare degli oggetti), da qualche altra parte nel codice sciverai:
    
       Fraction *f1 = [Fraction new];
       Fraction *f2 = [Fraction new];
    
       // oppure (poi ne parliamo)
       Fraction *f3 = [[Fraction alloc] init];   
    
    
    Hai creato tre istanze (tre oggetti) della classe Fraction. Come li puoi usare?, intanto si potrebbe fornirli di un costruttore che permetta la loro iniziallizzazione in maniera semplice e magari aggiungere un metodo Add che effettua la somma con un altro Fraction, a quel punto li potresti usare in questo modo:
    
       Fraction *f1 = [[Fraction alloc] init:5 :3];
       Fraction *f2 = [[Fraction alloc] init:7 :3];
    
       [f1 add:f2];
    
    A questo punto F1 contiene 12/3.

    Sto scrivendo senza provare, magari ci sono degli errori, per adesso concentriamoci sul senso.
Devi accedere o registrarti per scrivere nel forum
8 risposte