domenica 2 maggio 2010

Guida Objective-C in Italiano - Comportamenti Statici - Parte 10


Nel decimo capitolo della Guida in Italiano alla programmazione in Objective-C, parleremo approfonditamente della tipatura statica, abilitare comportamenti statici rispetto a quelli che in Objective-C sono dinamici di default.

Questo post è una traduzione in italiano della Guida all'Objective C, presente sul sito developer.apple.com a questo link. L'Objective C è il linguaggio di programmazione per creare applicazioni per iPhone. Questo articolo può interessare a tutti gli sviluppatori che vogliono imparare le basi di questo linguaggio che è il fondamento per programmare nuove applicazioni per Mac Os X, iPhone ed iPad.


Abilitare Comportamenti Statici

Questo capitolo spiega come funziona la tipatura statica e parla di alcune altre caratteristiche dell'Objective-C, incluso metodi per sovrastare temporaneamente il suo dinamismo inerente.

Comportamento Dinamico di Default

Da progettazione, gli oggetti Objective-C sono entità dinamiche. Quante più decisioni possibili su di loro sono spinte dal tempo di compilazione al tempo di esecuzione:
  • La memoria per gli oggetti è allocata dinamicamente a runtime dai metodi di classe che creano nuove istanze.
  • Gli Oggetti sono tipati dinamicamente. Nel codice sorgente (a tempo di compilazione), ogni variabile di un oggetto può essere tipata id, non importa di che classe sia l'oggetto. L'esatta classe di una variabile id (e quindi i suoi metodi particolari e la struttura dati) non è determinata finché il programma non è in esecuzione.
  • Messaggi e metodi sono legati dinamicamente. Una procedura di runtime fà combaciare il selettore di metodo nel messaggio con un'implementazione di metodo che appartiene al ricevente.
Queste caratteristiche danno ai programmi OO una grande flessibilità, ma c'è un prezzo da pagare. In particolare, il compilatore non può controllare i tipi esatti (classi) delle variabili id. Per permettere un miglior controllo di tipo a tempo di compilazione, e per rendere il codice più auto-documentante, Objective-C permette agli oggetti di essere tipati staticamente con un nome di classe piuttosto che la tipatura generica come id. Permette anche di spegnere alcune delle caratteristiche OO per spostare operazioni dal tempo di esecuzione a quello di compilazione.

Nota: I messaggi sono qualcosa di più lento delle chiamate a funzioni, tipicamente incorrono in una quantità insignificante di lavoro aggiuntivo comparati al lavoro attualmente eseguito. Il caso particolarmente raro in cui bypassare il dinamismo dell'Objective-C potrebbe essere permesso, può essere provato usando gli strumenti di analisi come Shark o Instruments.

Tipatura Statica

Se un puntatore ad un nome di classe è usato al posto di un id in una dichiarazione di oggetto,
Rectangle *thisObject;
Il compilatore restringe il valore della variabile dichiarata ad essere o un'istanza della classe nominata nella dichiarazione o un'istanza di una classe che eredita dalla classe nominata. Nell'esempio sopra, ThisObject può essere solo un Rectangle di un qualche tipo.

Tipare staticamente oggetti ha la stesse strutture dati interne degli oggetti dichiarati id. Il tipo non influenza l'oggetto; influenza dolo la quantità di informazione data al compilatore circa l'oggetto e la quantità di informazione disponibile a quelli che leggono il codice sorgente.

La tipatura statica non influenza neanche il modo in cui l'oggetto è trattato a runtime. Gli oggetti staticamente tipati sono allocati dinamicamente dagli stessi metodi di classe che creano le istanze di tipo id. Se Square (quadrato) è una sottoclasse di Rectangle, il seguente codice produrrà ancora un oggetto con tutte le variabili di istanza di uno Square, non solo quelle di un Rectangle:
Rectangle *thisObject = [[Square alloc] init];
I messaggi inviati ad oggetti tipati staticamente sono legati dinamicamente, proprio come per gli oggetti tipati id. Il tipo esatto di un ricevente tipato staticamente è determinato ancora a runtime come una parte del processo di messaggistica. Un messaggio display inviato a thisObject
[thisObject display];
esegue la versione del metodo definita nella classe Square, non in quella della sua superclasse Rectangle.

Dando al compilatore più informazioni su un oggetto, la tipatura statica apre le possibilità che siano queste info siano assenti per oggetti tipati id:
  • In alcune situazioni, permette i controlli di tipo a tempo di compilazione.
  • Può liberare oggetti dalla restrizione che i metodi nominati identicamente devono avere identici valori di ritorno e tipi di argomenti.
  • Permette di usare la struttura operatore punto per accedere direttamente alle variabili d'istanza di un oggetto.
I primi due argomenti sono discussi nella sezione che segue. Il terzo è spiegato nel secondo articolo di questa guida "Definire Classi".

Controlli di Tipo

Con l'informazione aggiuntiva fornita dalla tipatura statica, il compilatore può consegnare un servizio di controllo di tipi migliore in due situazioni:
  1. Quando un messaggio è inviato a un ricevente tipato staticamente, il compilatore può assicurarsi che il ricevente può rispondere. Un warning è emesso se il ricevente non ha accesso al metodo nominato nel messaggio.
  2. Quando un oggetto tipato staticaemente è assegnato a una variabile tipata staticamente, il compilatore si accerta che i tipi siano compatibili. Emette un warning se non lo sono.
Un assegnamento può essere fatto senza warning, se la classe dell'oggetto definito è identica a, o eredita da, la classe della variabile che riceve l'assegnamento. Il seguente esempio illustra questo:
Shape *aShape;

Rectangle *aRect;

aRect = [[Rectangle alloc] init];

aShape = aRect;
Qui aRect può essere assegnato a aShape perchè un Rectangle è un tipo di Shape - la classe Rectangle eredita da Shape. Comunque, se i ruoli delle due variabili sono invertiti e aShape è assegnata a aRect, il compilatore genera un warning; non tutte le forme sono Rettangoli.

Non c'è controllo quando l'espressione su uno dei due lati dell'assegnamento è un id. Un oggetto tipato staticamente può essere liberamente assegnato ad un id, o un id a un oggetto tipato staticamente. Perché i metodi come alloc ed init restituiscono variabili tipate staticamente. Il seguente codice è incline ad errori, ma ciò nonostante si concede:
Rectangle *aRect;

aRect = [[Shape alloc] init];

Tipi di Ritorno e degli Argomenti

In generale, i metodi in classi diverse che hanno lo stesso selettore (lo stesso nome) devono anche condividere gli stessi tipi di ritorno e tipi di argomenti. Questo vincolo è imposto dal compilatore per permettere il collegamento dinamico (dynamic binding). Poiché la classe di un messaggio ricevente, (e quindi dettagli specifici di classe riguardo al metodo che gli è chiesto di eseguire) non può essere conosciuta a tempo di compilazione, il compilatore deve trattare allo stesso modo tutti i metodi con lo stesso nome. Quando prepara le informazioni sul ritorno del metodo e sui tipi degli argomenti per il sistema di runtime, crea solo una descrizione di metodo per ogni selettore di metodo.

Comunque, quando un messaggio è inviato a un oggetto tipato staticamente, la classe del ricevente è conosciuta dal compilatore. Il compilatore ha accesso a informazioni specifiche della classe riguardo ai metodi. Quindi, il messaggio è liberato dalle restrizioni sui suoi valori di ritorno e tipi di argomenti.

Tipatura Statica a una Classe Ereditata

Un'istanza può essere tipata staticamente alla sua propria classe o a qualunque classe da cui eredita. Tutte le istanze, ad esempio, possono essere tipate staticamente come NSObject.

Comunque, il compilatore capisce la classe di un oggetto tipato staticamente solo dal nome di classe nella designazione del tipo, ed effettua il suo controllo di tipi di conseguenza. Tipare un'istanza a una classe ereditata può quindi risultare in discrepanze tra ciò che il compilatore pensa che potrebbe accadere a runtime e cosa realmente succede.

Ad esempio, se tipi staticamente un'istanza di Rectangle come una Shape,
Shape *myRectangle = [[Rectangle alloc] init];
Il compilatore la tratterà come una Shape. Se invii all'oggetto un messaggio per eseguire un metodo di Rectangle,
BOOL solid = [myRectangle isFilled];
Il compilatore si lamenterà. Il metodo isFilled è definito nella classe Rectangle ma non in Shape.

Comunque, se gli invii un messaggio per eseguire un metodo che classe Shape conosce,

[myRectangle display];

Il compilatore non si lamenterà, anche se Rectangle sovrascrive il metodo. A runtime, è eseguita la versione del metodo di Rectangle.

In modo analogo, supponiamo che la classe sorastante dichiara un metodo worry che restituisce un double,
- (double)worry;
e la sottoclasse di mezzo sovrascrive il metodo e dichiara un nuovo tipo di ritorno:
- (int)worry;

Se un'istanza è tipata staticamente alla classe superiore, il compilatore penserà che il suo metodo worry restituisce un double, e se un istanza è tipata alla classe di mezzo, penserà che worry restituisce un intero. Risulteranno ovviamente errori se un'istanza della classe di mezzo è tipata alla classe superiore. Il compilatore informerà il sistema di runtime che un messaggio worry è inviato ad un oggetto che restituisce un double, ma a runtime esso restituisce attualmente un int e genera un errore.

La tipatura statica può liberare metodi nominati in modo identico dalla restrizione che devono avere valori di ritorno e tipi di argomento identici, ma lo può fare così affidabilmente solo se i metodi sono dichiarati in rami differenti della gerarchia delle classi.

Fine Parte 10

Finisce qui il decimo articolo di questa Guida dedicato alla tipatura statica nel linguaggio di programmazione Objective-C. Il prossimo post di questa guida, parlerà dei Selettori.

Segnalatemi eventuali errori, o commentate l'articolo se l'avete trovato utile, anche per incentivarmi a continuare a pubblicare le mie traduzioni. Iscrivetevi ai feed del blog per essere sempre aggiornati automaticamente ogni volta che sono disponibili nuovi contenuti. Nella barra laterale del blog potete trovare l'elenco di tutti gli articoli di questa guida.

Nessun commento:

Posta un commento

Related Posts with Thumbnails