VB.NET VS OBJECTIVE-C Provengo da oltre venti anni di programmazione su windows, e devo dire che per creare la mia prima applicazione su iPhone, ho dovuto imparare non solo una nuova piattaforma ma un intero nuovo linguaggio di programmazione.

La frase “quando si sa programmare, si può programmare con qualsiasi linguaggio” è vera, ma è anche vero che per passare da VB Net a Objective c è richiesto qualche sforzo.

Ho preso come piccolo esempio la classica “prima” applicazione di ogni programmatore “Hello, World!”.

Metodi a confronto

In Objective C le chiamate di metodi rappresentano in realtà messaggi inviati agli oggetti in memoria da un piccolo motore di runtime. Si tratta di una distinzione sottile ma importante, che consente di ottenere un comportamento sorprendentemente dinamico in un linguaggio di programmazione che inizialmente potrebbe sembrare piuttosto formale. Per esempio, se richiamate un metodo su un riferimento a un oggetto che risulta nil non si verifica un crash né un errore: il runtime rileva che l’invio di un messaggio a un oggetto inesistente non avrebbe senso, e perciò non lo invia.

Le classi in Objective-C si sviluppano creando un file header e un file di implementazione, che hanno lo stesso nome ma estensioni diverse (.h .m). Nel file .h (l’header) si inseriscono le parti pubbliche della classe: nomi e tipi delle variabili istanza e segnature dei metodi, che descrivono il tipo del valore di ritorno e i parametri. Nel file di implementazione si implementano i metodi con il codice, dichiarando e utilizzando tutte le variabili locali necessarie che sono relative soltanto all’implementazione e non devono essere visibili ad altre classi.

Vediamo un esempio di codice, come anticipato, il classico “Hello, World!”:

// HelloWorld.h
 
@interface HelloWorld : object
 
- (id) hello;
 
@end
// HelloWorld.m
 
#import "HelloWorld.h"
 
@implementation HelloWorld
 
- (id) hello {
    printf("Hello, World!");
}

Per usare la classe appena creata useremo:

HelloWorld *myHello = [[HelloWorld alloc] init];
[myHello hello];

Differente è invece lo stesso caso in Vb.Net:

Public Class HelloWorld
   Public Sub Hello
      Console.WriteLn("Hello, World!")
   End Sub
End Class

Per richiamarlo useremo:

Dim myHello As New HelloWorld
myHello.hello

Una prima differenza rispetto all’Objective-C sta nel fatto che, nel caso del VB.Net, il metodo “hello” può non avere un’implementazione. In questo caso il compilatore produce un avvertimento.

Una possibile soluzione a questo problema, potrebbe essere quella di controllare l’esistenza del metodo, prima del suo richiamo:

Dim myhello As New HelloWorld
If myHello.GetType.GetPropInfo(“Hello”) IsNot Nothing Then myHello.hello

Un’altro modo potrebbe essere quello di trattare l’oggetto appunto come “oggetto”:

Dim myhello As New HelloWorld
Ctype(myhello,object).Hello

Oppure, sempre in VB.Net, potremmo utilizzare gli eventi:

Public Class HelloWorld
    Private WithEvents moHelloWorldEventSource As HelloWorldEvents
    Public Sub New(eventSource As HelloWorldEvents)
        moHelloWorldEventSource = eventSource
    End Sub
 
    Private Sub Hello Handles moHelloWorldEventSource.Hello
        Console.WriteLn(“Hello World”)
    End Sub
End Class
 
Public Class HelloWorldEventSource
    Public Event Hello
    Public Sub Hello
        RaiseEvent Hello
    End Sub
End Class

Per invocare quanto appena scritto useremo:

Dim helloEvents As New HelloWorldEventSource
Dim myhello As New HelloWorld(helloEvents)
helloEvents.Hello

Come vedete l’Objective-C in realtà semplifica non poco le cose. Possiamo tranquillamente affermare che lo sforzo per la migrazione da un linguaggio all’altro viene senz’altro ripagato a dovere.

Ci sarebbe ancora molto da scrivere, per adesso meglio fermarsi qui, non voglio dilungarmi troppo sull’argomento e far diventare questo articolo un trattato noioso.

Alla prossima.