28/10/2021
Le NeXT, dernier des Pharaons
Quels sont les secrets d'une telle longévité ?
A l'occasion d'un tri dans ma bibliothèque, je suis retombé sur cet ouvrage de fulgarisation des fondations de ce qui allait bientôt transformer Apple en poule aux oeufs d'or.
Ce guide au couleurs de NeXT fêtera ses 30 ans en 2022. Le plus étonnant est que tous les concepts qui y sont exposés avaient déjà 15 ans d'avance...
Objective-C, inversion de contrôle (IOC), Delegates, Protocoles et Interface Builder
Bon, à l'époque, j'avoue que je n'y avais pas compris grand chose.. Trop conceptuel et loin de mes besoins quotidiens de développeur d'applications d'entreprises, je l'avais mis de coté. Pourtant tous les concepts évoqués dans ce guide de façon remarquablement pédagogique sont toujours à l'oeuvre aujourd'hui...
Qui a dit l'informatique, ça change tout le temps, il vaut mieux se consacrer à la littérature ? Houellebecq, je crois...
Objective-C
D'abord il y a Objective-C, qui est à la fois un langage bas niveau (compilé, léger, rapide), et orienté-objet. Car oui,c'est une surcouche au langage C, à l'instar du C++. Ce qui est gage de rapidité et surout d'être en osmose avec le matériel sur lequel il s'exécute, Apple controlant tout, du hardware au software, ce qui est un cas unique à ma connaissance, et c'est encore plus vrai depuis l'annonce récente du processeur M1.
IOC & Delegate
L'inversion de contrôle consiste à donner le pouvoir aux objets du framework (Cocoa/Cocoa Touch) et à mettre en place les liaisons et le code délégué dont se servira l'objet pour accomplir un traitement.
L’inversion de contrôle (IoC) est, malgré les apparences, une solution simple et élégante au problème d’hyper-spécialisation des classes d’objets, et un remède au casse-tête qu’a pû être l’héritage multiple avant son apparition.
L’idée force est de permettre à une classe non spécialisée de jouer d’autres rôles que le sien sans avoir à implémenter ces rôles en son sein. Cela permet de découpler les classes d’objets afin d’obtenir un couplage le plus faible possible, gage de flexibilité, de facilité de lecture et donc de maintenabilité.
Mais ce principe n’est pas basé sur un mécanisme complexe qu’il faut appliquer aveuglément, sans rien y comprendre. Non. L’IoC est basé sur une convention passée entre les humains et la machine… avec un peu de magie derrière quand même.
Protocol
Pour faire une analogie un peu simpliste avec le mode réel, c’est un peu comme si on vous donnait accès à une maison pour y passer la nuit en l’absence de son propriétaire juste en convenant avec lui de l’endroit où il va cacher la clé, à savoir dans le deuxième pot de fleurs de la troisième fenêtre à gauche. Ce pot de fleurs va alors agir entre vous comme une interface; c’est là qu’aura lieu l’échange des rôles entre le propriétaire et vous, qui allez pouvoir en prendre possession le temps d’une nuit.
Pour que la communication entre un object d'interface et votre code puisse s'établir, afin que les données s'échangent dans les deux sens, il faut appliquer le protocol requis par l'objet utilisé.
Interface Builder (IB)
A l'époque, la mode était à la construction d'application à la souris, par simple glisser/déposer de composants graphiques (bouton, zone de texte, etc.) dans les vues de l'application. Dans le monde Windows, il y avait Visual Basic et Delphi pour les développeurs débutants ou intermédiaires. Ces environnements étaient très productifs et tiraient avantage du confort moderne qu'apportait l'interface graphique.
Pour ne pas être en reste, Steve Jobs a embauché Jean-Marie Hullot (développeur de SOS interface sous MacOS) comme directeur technique afin qu'il produise un équivalent de Visual Basic dans l'environnement NeXT. Et cela n'a pas été chose facile... D'après une interview de l'intéressé M'iLife by Jean-Marie Hullot, pour parvenir à ses fins, il aura fallu tordre Objective-C.
En d'autres termes, ce mariage n'était pas très naturel, et cela se ressentait au début d'Interface Builder, qui demandait d'incessants va et vient entre code et concepteur graphique et l'ajout d'IBOutlet dans le code pour ouvrir une laison de données entre l'objet graphique et le code ou d'IBAction pour désigner une méthode prête à être utilisée par un objet graphique. Sans parler du fumeux File's owner...