DÉVELOPPEMENT DE LOGICIELS D’ENTREPRISES IICOURS 01
PLAN▸ Présentation
▸ Plan de cours et méthodologie
▸ Introduction à Git
▸ Introduction à Swift
▸ Accueil des 1ère année: 3 septembre, 12h30 à 18h30
Présentation
PRÉSENTATION▸ James Hoffman 💻 📚 🏃 🎮 🏍 🏕 👷
▸ Discord ou [email protected]
▸ Bureau: 1131A
▸ Ressources du cours: https://jh.shawinigan.info
▸ À votre tour! 🙂
▸ Qui était en stage?
▸ Qu’est-ce qui a occupé votre été?
Plan de cours
PLAN DE COURS▸ 420-B7B-SW
▸ https://jh.shawinigan.info/sessions/2019A/B7B/420-B7B-SW.pdf
▸ Pondération 2 - 3 - 2
▸ Complément de formation en programmation qui vise à assurer le développement et la mise en œuvre d’une application à partir d’un devis client en exploitant la technologie des bases de données relationnelles.
▸ Analyse et planification → Prototypage → Code → Documentation → Livraison
2h Théorie 3h Lab/Pratique 2h À la maison
COMPÉTENCES▸ Concevoir et développer une application dans un environnement de base de
données
▸ Analyse d’un devis
▸ Programmation
▸ Interaction avec une base de données relationnel
▸ Produire une interface utilisateur
▸ Prototypage
▸ Implémentation de l’interface et de l’expérience utilisateur
APPRENTISSAGES ET CONTENUS ESSENTIELS
ÉVALUATIONS
VARIA▸ Tout retard à la remise d’un travail entraîne une pénalité de 10% par jour de
retard à partir de la date de remise.
▸ Les présences seront prises au début de chaque cours.
▸ Vous êtes responsable de votre réussite, je suis là pour vous guider et vous aider dans votre apprentissage.
▸ Matériel requis
▸ Écouteurs
Git
SYSTÈME DE CONTRÔLE DE VERSIONS - VCS▸ Logiciel permettant de faire le suivi des changements apportés aux fichiers
ajoutés au système. Bien que ce type de mécanisme puisse être utilisé dans différents contextes, l’emploi le plus commun est au niveau du développement logiciel.
▸ Il est donc possible de garder une trace de tous les changements apporté à chacun des fichiers et d’en naviguer l’historique:
▸ Quoi, Qui, Quand, Pourquoi
▸ SVN, Git, SourceSafe, Perforce, etc…
CENTRALISÉ VS. DISTRIBUÉ
CENTRALISÉ VS. DISTRIBUÉ▸ Centralisé
▸ La copie de travail plus petite car elle ne contient qu’une version
▸ L’interaction avec le serveur, surtout le téléchargement initial, est plus rapide car on ne télécharge pas l’ensemble des versions
▸ Distribué
▸ Les actions effectués sur la copie de travail sont très rapides
▸ On peut organiser un suivi des changements localement, sans les publier au serveur ▸ Travail en mode hors-connexion
▸ Flexibilité au niveau de l’organisation et partage des versions
GIT - SYSTÈME DISTRIBUÉ▸ Créé en 2005, par Linus Torvalds
▸ Open source et multi-plateformes
▸ Actuellement en version 2.X ▸ git-lfs: large file storage
▸ Git est un outils en ligne de commande, mais il existe plusieurs interfaces graphiques permettant d’y accéder
▸ Permets une gestion des conflits(modifications concurrentes) en évitant la perte des données
▸ Il existe des hébergeurs git: GitHub, BitBucket, GitLab, etc.
▸ Standard de l’industrie
GIT - STATUS
Le mécanisme .gitignore permets d’informer git de ne pas se préoccuper de certains fichiers
GIT - INTERACTIONS
GIT - BRANCHES▸ Permets d’isoler un groupe de changements
▸ On peut ensuite le fusionner avec l’historique principal
▸ Particulièrement utile en travail collaboratif
GIT - FUSION DES BRANCHES
GIT - USAGE▸ Commits fréquents, petite unité fonctionnelle
▸ Ne JAMAIS commit du code non-fonctionnel
▸ Pull régulièrement
▸ Push régulièrement
▸ Gérer les conflits localement: Commit, Pull, Push
▸ Utiliser les branches abondamment(surtout en travail collaboratif): feature-x, test-y
▸ Exploitez le mécanisme de .gitignore judicieusement
▸ https://www.git-tower.com/learn/git/ebook/en/command-line/appendix/best-practices
▸ Usage collaboratifhttps://www.atlassian.com/git/tutorials/comparing-workflows
GIT - COMMANDES DE BASE▸ git clone URL
▸ git add FICHIER FICHIER2
▸ git add -A
▸ git commit -m “message”
▸ git push
▸ git pull
▸ Si conflit, résoudre le conflit puis add et commit les fichiers
▸ git status
ATELIER▸ Créer un compte Bitbucket avec votre adresse cshawi
https://bitbucket.org/account/signup/
▸ Puis, faire la demande académique https://www.atlassian.com/software/views/bitbucket-academic-license.jsp
▸ https://jh.shawinigan.info/sessions/2019A/B7B/C01/atelier-git.txt
ALLER PLUS LOIN▸ https://learngitbranching.js.org/
▸ https://www.katacoda.com/courses/git
▸ Scénarios 1 à 7
RÉFÉRENCES▸ https://www.atlassian.com/git
▸ https://www.git-tower.com/learn/git/ebook/en/command-line/basics/what-is-version-control#start
▸ https://git-scm.com/docs/gittutorial
▸ Documentationhttps://git-scm.com/doc
Xcode / Playground
XCODE▸ IDE produit par Apple ▸ Supporte :
▸ Plateformes Apple
▸ C, C++, Obj-C, Swift et plus après les configurations nécessaires
PLAYGROUND▸ Environnement de programmation de type “bac à sable”
▸ Permet de faire des preuves de concept ou des tests dans un environnement minimal fonctionnel
Navigation
Hiérarchie du projet
Éditeur de code
Évaluateur de code
Options d’affichage
Inspecteur de propriétés
Swift
SWIFT▸ Langage de choix pour les plateformes d’Apple
▸ Orienté-objet
▸ Fonctionnel
▸ Orienté-protocole
▸ Introduit en 2014, en constante évolution depuis…
▸ Actuellement en version 5
▸ Guide du langagehttps://docs.swift.org/swift-book/LanguageGuide/TheBasics.html
TYPES DE DONNÉES▸ Int, Float, Double
▸ Bool
▸ String
▸ Tuples, http404Error = (404, "Not Found”, …)
▸ Array, Set, Dictionary: https://docs.swift.org/swift-book/LanguageGuide/CollectionTypes.html
SWIFT, SUITE▸ Commentaires// Une ligne/*Plusieurs lignes*/
VAR VS. LET▸ var
permet de créer une variable, donc sa valeur pourra être modifiée par la suite
▸ letpermet de créer un constante, sa valeur ne pourra être modifiée par la suitePour les objets, la référence est constante, les membres peuvent être modifiés
▸ identificateur nomVariable: Type = ValeurInitialevar age: Int = 23 let KEY: String = “my_constant_key”
AFFICHAGE EN CONSOLE▸ print()
Affiche une String avec un saut de ligne
▸ Inférence de StringSwift peut déduire la représentation en String de plusieurs types de données
▸ Exemplelet age: Int = 23let s: String = “My age is \(age)” print(s)—> My age is 23ouprint(“My age is \(age)”)—> My age is 23
OPTIONALS… ?▸ Ajoute une information supplémentaire concernant le type de données de la
variable
▸ On l’utilise dans un contexte où l’absence de valeur est possible, ?
▸ L’optionalité indique 2 états possibles :
▸ Il n’y a aucune valeur, nil
▸ Il y a une valeur accessible, elle peut être récupérée, unwrap !
OPTIONALS▸ Exemple 1
▸ var errorMessage: String? = nillet s1: String = errorMessage //invalidelet s2: String? = errorMessage //OKerrorMessage = “invalid password”let s3: String = errorMessage! //OK let s4: String? = errorMessage! //OK errorMessage = nil let s3: String = errorMessage! //plante car errorMessage = nil, on ne peut unwrap (!)let s4: String? = errorMessage! //plante car errorMessage = nil, on ne peut unwrap (!)
OPTIONALS▸ Exemple 2
▸ var errorMessage: String? = nil if let message = errorMessage { //message != nil} else { //message == nil}
OPTIONALS▸ Exemple 3
▸ var errorMessage: String? = “invalid password”if let message = errorMessage { //message != nil //message est de type String, non-optionel, il a été unwrap} else { //message == nil}
▸ L’équivalent est: if (errorMessage != nil) { message = errorMessage! //message est de type String, non-optionel}
OPTIONALS▸ Exemple 4
OPTIONALS▸ Exemple 5
FONCTIONS‣ func functionName(paramLabel paramName: Type, …)-> TypeDeRetour {
//code… }func doSomething() { // code… }func add(value num1: Int, to num2: Int)-> Int { return num1 + num2}
Pas de type de retour, donc ne retourne pas de valeur
let result = add(value: 2, to: 4)
FONCTIONS
FONCTIONS ET OPTIONALS
SWIFT, SUITE▸ Collections
var crée une collection mutable, qu’on peut modifier let crée une collection immutable, qu’on NE peut modifier
SWIFT, SUITE▸ Array
▸ Initialisationvar numbers: [Int] = [] , array videvar numbers: [Int] = [2, 4, 6] , valeurs littérales var varName: [Type] = [ValeursInitiales]
SWIFT, SUITE▸ Insertion d’items
SWIFT, SUITE▸ Récupération d’un item
▸ Modification d’un item
SWIFT, SUITE▸ Suppression d’items
SWIFT, SUITE▸ Array
▸ isEmpty
▸ count
SWIFT, SUITE▸ Parcourir une array
Par valeur Énumérée
SWIFT, RANGE▸ Boucle for et les Range
▸ On peut définir un intervalle d’entiers à parcourir par pas de 1 avec une boucle for à l’aide des opérateurs … et ..<
▸ On utilise la logique d’un foreach en parcourant chaque item de l’interval
POO en Swift
PROGRAMMATION ORIENTÉE-OBJET▸ Swift supporte les mécanismes de classe, structures et protocoles (interfaces)
▸ Héritage
▸ Polymorphisme
▸ On définit les variables membres et les méthodes d’une classe avec la syntaxe vue précédemment
▸ L’encapsulation est possible grâce au modificateurs d’accès
DÉCLARATION D’UNE CLASSE▸ Syntaxe semblable à Java
▸ class
▸ self plutôt que this
▸ Variables et méthodes à l’intérieur des accolades
▸ Modificateurs d’accès
▸ Les variables doivent absolument être initialisées (init ou à la déclaration)
INSTANCIATION ET UTILISATION▸ Avec let ou var
▸ PAS de new
▸ On utilise le point . pour intéragir avec l’instance
PROPRIÉTÉS▸ Les variables membres d’une classe sont en fait des propriétés stockées
(stored property)
▸ Il est possible de définir des propriétés calculées (computed property) qui retourne un valeur ne provenant pas directement d’un variable membre
▸ On peut également observer les changements(property observer) apportés à une propriété et effectuer un traitement lorsque cela se produit
▸ L’héritage et la surcharge peuvent être utilisés avec les propriétés calculées
PROPRIÉTÉS, EXEMPLES
MODIFICATEURS D’ACCÈS
https://swiftbits.redalemeden.com/images/access-control-swift3.svg
open > public > internal > fileprivate > private
MEMBRES STATIC VS CLASS▸ static
On NE peut PAS le surcharger
▸ classIl est possible de le surcharger
HÉRITAGE▸ On peut utiliser le mécanisme d’héritage pour réutiliser ou étendre les
propriétés(données) et les méthodes(comportement) d’une autre classe.
▸ On peut surcharger des méthodes pour modifier le comportement de la classe parent.
▸ Il est également possible d’ajouter des observateurs de propriétés sur les propriétés d’une classe parent.
▸ On ne peut avoir qu’UNE SEULE classe parent.
▸ Le constructeur est une fonction portant le nom de init
HÉRITAGE▸ Pour signifier l’héritage d’une classe on utilise l’opérateur : dans la déclaration
de la classe
HÉRITAGE▸ Les modificateurs d’accès sont utilisés
pour contrôler la visibilité des membres d’une classe.
▸ On initialise d’abord ses propriétés avant d’appeler le constructeur de sa classe parent, super.init()
SURCHARGE - OVERRIDE▸ L’utilisation du mot-clé override indique au compilateur Swift qu’on souhaite surcharger
un membre(propriété ou méthode). Swift vérifie donc que le membre surchargé existe vraiment dans la classe parent. On peut accéder au membre du parent avec le mot-clé super. On peut restreindre la surcharge avec l’attribut final.
▸ On peut surcharger:
▸ Méthodes
▸ Propriétés
▸ ajout d’observateurs pour les propriétés disponible en écriture On ne peut observer les changement de valeur d’une variable read-only
SURCHARGE DE MÉTHODE
INITIALISATION▸ La méthode init(initializer) est réservée à l’initialisation(la préparation) des propriétés
d’une classe, structure ou enum.
▸ Implicitement, Swift fourni un un initializer vide par défaut
▸ Toutes les propriétés stockées doivent être initialisée avec une valeur initiale.On peut assigner cette valeur à la déclaration de la propriété OU dans la méthode init. ▸ L’exception à cette règle est une propriété donc le type est optionnel.
Elle possède implicitement une valeur par défaut à nil. On peut évidemment décider de lui assigner une valeur différente quand même.
▸ On peut également déclarer un membre constant(let) et par la suite lui assigner une valeur dans le init.
INITIALISATION▸ On peut réutiliser un initializer désigné (designated initializer) de notre classe à
partir d’un initializer de convenience (self.init). Le mot-clé convenience indique que cet init est un raccourci et qu’il appelera éventuellement un autre init.
LES 3 RÈGLES DE L’INITIALISATION▸ Règle 1
Un init désigné doit appeler un init désigné de sa classe parent(si elle existe) init —> super.init
▸ Règle 2Un init de convenience doit appeler un init quelconque de sa propre classe convenience init —> init(désigné ou convenience)
▸ Règle 3Un init de convenience doit ultimement appeler un init désigné convenience init —> convenience init —> convenience init —> init
LES 3 RÈGLES DE L’INITIALISATION▸ En résumé
▸ Un init désigné délégue verticalement vers son parent
▸ Un init de convenience délègue horizontalement aux autres init de sa classe
INITIALISATION - EXEMPLE
SURCHARGE DU INIT▸ Un init est une méthode de la classe et peut donc être surchargée par les sous-
classes.
▸ Seuls les init désignés peuvent être surchargés, un init de convenience du parent sera tout simplement masqué s’il est redéclaré par une sous-classe
SURCHARGE DU INIT - EXEMPLES
SURCHARGE DU INIT - EXEMPLES
AUTRES PROPRIÉTÉS DES INITIALISEURS▸ Il est possible de spécifier qu’un initialiseurs peut échouer(failable initializers)
en ajoutant l’information d’optionalité( ? ) à la déclaration de celui-ci. On peut alors retourner nil si l’initialisation est invalide.
DÉINITILISATION - DEINIT▸ Swift se charge d’appeler une méthode de déinitialisation (deinit) lorsqu’il
libère une instance d’une classe de la mémoire.
▸ Il est alors possible de nettoyer les ressources utilisées
▸ Une classe peut définir UN SEUL deinit et cette méthode n’a aucun paramètre, on l’écrit même sans parenthèses
STRUCTURE▸ struct ▸ Ressemble à une classe ▸ Propriétés ▸ Méthodes ▸ init ▸ Peut se conformer à un protocole
▸ Différences ▸ Pas d’héritage ▸ Pas de références(value type), les instances sont toujours copiées ▸ pas de deinit
STRUCTURE VS. CLASSE▸ On privilégie une struct si:
▸ But premier est d’encapsuler des données
▸ Contexte où il est logique que les données soit copiées lorsque l’instance est assignée et utilisée
▸ Les données contenues sont de type valeur(value type) également
▸ Le contexte ne nécessite pas de hiérarchie d’héritage
▸ Ex: Point, Size, etc.
▸ Sinon, on utilise une classe
STRUCTURE - EXEMPLES▸ Définition et instanciation
STRUCTURE - EXEMPLES▸ let vs. var
STRUCTURE - EXEMPLES▸ Les struct sont des type valeurs(value type)
VAR VS LET - PARTICULARITÉS
ÉNUMÉRATIONS▸ Permet d’énumérer un ensemble de valeurs(case) ayant un lien logique entre elles
▸ On peut ensuite les utiliser d’une manière sécuritaire(type safe)
▸ Un case peut posséder une valeur brute(raw value) de type: Int, String, Character ou Float
▸ On peut associer à un case une ou plusieurs valeurs de type arbitraire: Int, String, Objet.
▸ Une énumération peut : ▸ définir des propriétés calculées ▸ être initialisée, init ▸ se conformer à un protocole
ÉNUMÉRATIONS▸ On définit les case avec une lettre minuscule
▸ On peut valider la valeur d’une enum avec un switch ou un if
ÉNUMÉRATION▸ On peut définir une valeur associée de type arbitraire
▸ On y accède via le switch
ÉNUMÉRATION▸ On peut définir différents initialiseurs pour l’enum, avec ou sans paramètres ▸ Si notre enum possède une valeur brute, elle a une initialiseur par défaut
permettant de créer une instance possédant cette valeur si elle existe, sinon nil
ÉNUMÉRATION - EXEMPLE
PROTOCOLES▸ Les protocoles définissent un contrat au niveau du comportement (méthodes)
et des données (propriétés) qu’un élément (classe, struct ou enum) peut adopter, donc on dit qu’il se conforme au protocole.On peut se conformer à plusieurs protocoles.
▸ Un protocole en Swift offre la flexibilité combinée des classes abstraites ET des interfaces traditionnelles existant en Java, par exemple.
▸ On adopte un protocole avec l’opérateur : en spécifiant la super classe avant les protocoles auxquels on se conforme
PROTOCOLES - PROPRIÉTÉS▸ Un protocol peut spécifier des propriétés qui devront être déclarés par
l’élément qui l’adopte. On déclare les propriétés avec la même syntaxe que pour les classes.
▸ On peut spécifier si la propriété doit être au minimum disponible en lecture seule ou en lecture-écriture
PROTOCOLES - MÉTHODES▸ Le principe est le même au niveau des méthodes. On déclare les méthodes
dans le protocole en respectant la syntaxe vue précédemment (en omettant les { } ) et les éléments qui s’y conforme devront les implémenter.
PROTOCOLES - HÉRITAGE▸ Un protocole peut hériter d’un ou plusieurs autres protocoles
▸ L’élément qui s’y conformera devra donc respecter l’ensemble des indications de la hiérarchie de protocoles
EXTENSIONS▸ Permet d’ajouter(étendre) les données ou le comportement d’un élément
existant (classe, struct, enum, protocole) de façon horizontale
▸ Ne peut modifier le comportement existant, PAS DE SURCHARGE
▸ Peut ajouter:
▸ Propriétés calculées
▸ Méthodes
▸ Nouveaux init
▸ Définir des nouveaux types imbriqués
▸ Rendre un type existant conforme à un protocole
EXTENSIONS
EXTENSIONS - EXEMPLE
FONCTIONS ENCAPSULÉES - CLOSURES▸ Une closure est une fonction qui est stockée dans une variable
▸ Elle peut être utilisée et passée en paramètre comme n’importe quelle variable
▸ Elle a l’avantage de capturer(se souvenir, connaître) le contexte où elle est déclarée
CLOSURES - EXEMPLE
CLOSURES - EXEMPLE 2
Exercices
EXERCICE - LES FORMES
EXERCICE - LES FORMES : TESTEZ VOTRE PROGRAMME
▸ Ajoutez des fonctionnalités(draw, move, etc.) et explorez le langage Swift ▸ Explications https://youtu.be/SrBM7O6wiAI
RESSOURCES▸ https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html
▸ https://codewithchris.com/swift-tutorial-complete
Top Related