{"id":2626,"date":"2010-03-26T10:00:10","date_gmt":"2010-03-26T09:00:10","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=2626"},"modified":"2010-03-26T09:14:32","modified_gmt":"2010-03-26T08:14:32","slug":"l011da-vbnet-a-objective-c-prime-considerazioni","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/l011da-vbnet-a-objective-c-prime-considerazioni\/","title":{"rendered":"L#011 &#8211; Da VB.Net a Objective-C: Prime considerazioni"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/VbNet_ObjC.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/03\/VbNet_ObjC.png\" alt=\"VB.NET VS OBJECTIVE-C\" title=\"VbNet_ObjC\" width=\"200\" height=\"100\" class=\"alignleft size-full wp-image-2723\" \/><\/a> 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.<\/p>\n<p>La frase &#8220;<em>quando si sa programmare, si pu\u00f2 programmare con qualsiasi linguaggio<\/em>&#8221; \u00e8 vera, ma \u00e8 anche vero che per passare da VB Net a Objective c \u00e8 richiesto qualche sforzo.<\/p>\n<p>Ho preso come piccolo esempio la classica &#8220;prima&#8221; applicazione di ogni programmatore &#8220;Hello, World!&#8221;.<!--more--><\/p>\n<h4>Metodi a confronto<\/h4>\n<p>In Objective C le chiamate di metodi rappresentano in realt\u00e0 <em>messaggi<\/em> 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 <strong>nil<\/strong> non si verifica un crash n\u00e9 un errore: <strong>il runtime rileva che l&#8217;invio di un messaggio a un oggetto inesistente non avrebbe senso, e perci\u00f2 non lo invia<\/strong>.<\/p>\n<p>Le classi in Objective-C si sviluppano creando un file <em>header<\/em> e un file di <em>implementazione<\/em>, che hanno lo stesso nome ma estensioni diverse (<em>.h .m<\/em>). Nel file <em>.h<\/em> (l&#8217;<em>header<\/em>) 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&#8217;implementazione e non devono essere visibili ad altre classi.<\/p>\n<p>Vediamo un esempio di codice, come anticipato, il classico &#8220;Hello, World!&#8221;:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\n\/\/ HelloWorld.h\r\n\r\n@interface HelloWorld : object\r\n\r\n- (id) hello;\r\n\r\n@end\r\n<\/pre>\n<pre lang=\"objc\" escaped=\"true\">\r\n\/\/ HelloWorld.m\r\n\r\n#import \"HelloWorld.h\"\r\n\r\n@implementation HelloWorld\r\n\r\n- (id) hello {\r\n    printf(\"Hello, World!\");\r\n}\r\n<\/pre>\n<p>Per usare la classe appena creata useremo:<\/p>\n<pre lang=\"objc\" escaped=\"true\">\r\nHelloWorld *myHello = [[HelloWorld alloc] init];\r\n[myHello hello];\r\n<\/pre>\n<p>Differente \u00e8 invece lo stesso caso in Vb.Net:<\/p>\n<pre lang=\"vbnet\" escaped=\"true\">\r\nPublic Class HelloWorld\r\n   Public Sub Hello\r\n      Console.WriteLn(\"Hello, World!\")\r\n   End Sub\r\nEnd Class\r\n<\/pre>\n<p>Per richiamarlo useremo:<\/p>\n<pre lang=\"vbnet\" escaped=\"true\">\r\nDim myHello As New HelloWorld\r\nmyHello.hello\r\n<\/pre>\n<p>Una prima differenza rispetto all&#8217;Objective-C sta nel fatto che, nel caso del VB.Net, il metodo &#8220;hello&#8221; pu\u00f2 non avere un&#8217;implementazione. In questo caso <strong>il compilatore produce un avvertimento<\/strong>.<\/p>\n<p>Una possibile soluzione a questo problema, potrebbe essere quella di controllare l&#8217;esistenza del metodo, prima del suo richiamo:<\/p>\n<pre lang=\"vbnet\" escaped=\"true\">\r\nDim myhello As New HelloWorld\r\nIf myHello.GetType.GetPropInfo(\u201cHello\u201d) IsNot Nothing Then myHello.hello\r\n<\/pre>\n<p>Un&#8217;altro modo potrebbe essere quello di trattare l&#8217;oggetto appunto come &#8220;oggetto&#8221;:<\/p>\n<pre lang=\"vbnet\" escaped=\"true\">\r\nDim myhello As New HelloWorld\r\nCtype(myhello,object).Hello\r\n<\/pre>\n<p>Oppure, sempre in VB.Net, potremmo utilizzare gli eventi:<\/p>\n<pre lang=\"vbnet\" escaped=\"true\">\r\nPublic Class HelloWorld\r\n    Private WithEvents moHelloWorldEventSource As HelloWorldEvents\r\n    Public Sub New(eventSource As HelloWorldEvents)\r\n        moHelloWorldEventSource = eventSource\r\n    End Sub\r\n\r\n    Private Sub Hello Handles moHelloWorldEventSource.Hello\r\n        Console.WriteLn(\u201cHello World\u201d)\r\n    End Sub\r\nEnd Class\r\n\r\nPublic Class HelloWorldEventSource\r\n    Public Event Hello\r\n    Public Sub Hello\r\n        RaiseEvent Hello\r\n    End Sub\r\nEnd Class\r\n<\/pre>\n<p>Per invocare quanto appena scritto useremo:<\/p>\n<pre lang=\"vbnet\" escaped=\"true\">\r\nDim helloEvents As New HelloWorldEventSource\r\nDim myhello As New HelloWorld(helloEvents)\r\nhelloEvents.Hello\r\n<\/pre>\n<p>Come vedete l&#8217;Objective-C in realt\u00e0 semplifica non poco le cose. Possiamo tranquillamente affermare che lo sforzo per la migrazione da un linguaggio all&#8217;altro viene senz&#8217;altro ripagato a dovere.<\/p>\n<p>Ci sarebbe ancora molto da scrivere, per adesso meglio fermarsi qui, non voglio dilungarmi troppo sull&#8217;argomento e far diventare questo articolo un trattato noioso.<\/p>\n<p>Alla prossima.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Provengo da oltre venti anni di programmazione su windows, e devo dire che per creare la mia&#8230;<\/p>\n","protected":false},"author":178,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[9],"tags":[128,5,153],"class_list":["post-2626","post","type-post","status-publish","format-standard","hentry","category-guide-teoriche","tag-lezioni","tag-objective-c","tag-vb-net"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/2626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/178"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=2626"}],"version-history":[{"count":24,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/2626\/revisions"}],"predecessor-version":[{"id":2726,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/2626\/revisions\/2726"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=2626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=2626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=2626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}