DÉVELOPPEMENT DE LOGICIELS D’ENTREPRISES II · 2020-04-21 · GIT - SYSTÈME DISTRIBUÉ Créé...

Preview:

Citation preview

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 jhoffman@cshawi.ca

▸ 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

REPL.IT▸ https://repl.it

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

Recommended