{"id":19485613,"url":"https://github.com/pyozer/rush-efrei-klaus","last_synced_at":"2026-05-12T20:03:06.114Z","repository":{"id":66215438,"uuid":"196941498","full_name":"Pyozer/rush-efrei-klaus","owner":"Pyozer","description":null,"archived":false,"fork":false,"pushed_at":"2019-07-16T13:36:14.000Z","size":188,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-08T07:48:29.953Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Pyozer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-07-15T06:53:10.000Z","updated_at":"2019-07-16T13:36:16.000Z","dependencies_parsed_at":"2023-02-25T02:15:23.774Z","dependency_job_id":null,"html_url":"https://github.com/Pyozer/rush-efrei-klaus","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Pyozer%2Frush-efrei-klaus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Pyozer%2Frush-efrei-klaus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Pyozer%2Frush-efrei-klaus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Pyozer%2Frush-efrei-klaus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Pyozer","download_url":"https://codeload.github.com/Pyozer/rush-efrei-klaus/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240722222,"owners_count":19847067,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-10T20:29:03.605Z","updated_at":"2026-05-12T20:03:01.074Z","avatar_url":"https://github.com/Pyozer.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\u003cimg src=\"./assets/efrei-klaus-logo.png\"/\u003e\u003c/p\u003e\n\n## \u003ca name='TOC'\u003e📗 Summary\u003c/a\u003e\n\n- [Rules](#rules)\n- [Overview](#overview)\n- [Stack](#stack)\n- [Credits](#credits)\n\n## \u003ca name='overview'\u003e👮🏾‍ Rules\u003c/a\u003e\n\n=================\n\nHi, voici quelques règles pour mener à bien ce projet :)\n\n- Ce projet DOIT être faire tout seul\n- Le sujet est en français mais votre code DOIT être en anglais [`classe`, `variable`, etc.]\n- Vous DEVEZ créer un dépot git pour ce projet\n- Vous DEVEZ créer un diagramme `UML` de votre projet sur [LucidChart](lucidchart.com)\n- Vous DEVEZ me notifier par un message privé original le COMMENCEMENT du projet ET\nle PASSAGE à chaque étape.\n\n\u003e Bien évidemment, vous pouvez échanger entre vous, le peer-learning est la clé de\nvotre apprentissage MAIS la copie sera sanctionné\n\nN'hésitez pas en cas de de question à les poser sur le channel `pragmatic` de slack,\nil n'y a pas de question inutile.\n\n## \u003ca name='overview'\u003e🎅🏼 Overview\u003c/a\u003e\n\n=================\n\nLe père Noël a fait une demande officielle à l'Efrei pour informatiser sa chaine d'emballage de cadeaux;\nLa monde tend vers une robotisation et le père Noël dit SK vous demande de concevoir un simulateur de chaine d'emballage.\n\nSK vous fournit une liste décrivant le métier de l'elfe sur la chaine d'emballage de cadeaux.\nVotre chef de projet a préféré prendre les choses en main et a traité pour vous l'analyse fonctionnelle et certains aspects de conception.\n\nIl vous fournit une liste d'indications et de contraintes pour l'implémentation des différentes parties du simulateur.\n\n## Etape \\#1. Poney et figurines Dragon Ball\n\nLe chef de projet vous demande d'écrire les classes Toy, Pony, Figurine et DragonBall.\n\nIl vous indique:\n\n- Un `Pony` est un `Toy`\n- Une `Figurine` est un `Toy`\n- Un `DragonBall` est une `Figurine`\n\n\u003e 💡 Tips: qu'est ce que représente la \"classe\" `Toy` ?\n\nUn jouet peut être déplacé via la méthode `isMoved`. De plus un jouet possède un\nattribut `type` de type `String` accessible via un **getter**\n\n### Hi, poney\n\nUn `Pony` possède un attribut **statique** privé  `_nb` qui determine le nombre d'objet instancié.\nIl est par défaut initialisé à **1**.\n\nCette classe possède également un attribut `id` qui est égale au numéro de l'objet.\nLorsqu'un `Pony` est instancié il affiche sur la sortie standard:\n\n```sh\nPony #X is singing --\u003e\nDou-double poney, j’fais izi money\nD’où tu m’connais ? Parle moi en billets violets\nDou-double poney, j’fais izi money\n\n```\n\n\u003e Remplacé X par l'identifiant\n\nL'attribut type retourne la chaine de caractère `Pony #X`\n\nQuand un `Pony` est bougé il affiche `Huuuuuuhu!`\n\n### Dragon Ball\n\nUne figurine `DragonBall` possède un attribut privé `_character` de type Enum `DBHeroes`\ndéfinit comme suit:\n\n```swift\nenum DBHeroes {\n  case SANGOKU\n  case BEJITA\n  case BEERUS\n  case KAMESENNIN\n}\n```\n\nPour instancier une figurine `DragonBall`, il faut spécifier le personnage via l'enum et ainsi\ns'affiche sur la sortie standard:\n\n```sh\nX is singing --\u003e\nCHA-LA HEAD CHA-LA\nNani ga okite mo kibun wa heno-heno kappa\nCHA-LA HEAD CHA-LA\nMune ga pachi-pachi suru hodo\nSawagu Genki-Dama --Sparking !\n\n```\n\n\u003e Remplacé X par le personnage\n\nL'attribut type de la classe retourne la chaine de caractère `Dragon Ball figurine X`\n\nQuand un `DragonBall` est bougé il affiche `Kamé Hamé Ha!`\n\n### TEST\n\nVoici les fichiers que vous devriez avoir:\n\n```sh\n~/M/cdiwm-rush-efrei-klaus ❯❯❯ tree .\n.\n├── class.DragonBall.swift\n├── class.Pony.swift\n├── main.swift\n├── protocol.Figurine.swift\n└── protocol.Toy.swift\n\n0 directories, 5 files\n```\n\nVoici un main suivi de la sortie que vous devriez avoir:\n\n```swift\n// Step #1\nprint(\"--- STEP #1 ---\")\n\nvar pony: Pony = Pony()\nvar goku: DragonBall = DragonBall(DBHeroes.SANGOKU)\n\npony.isMoved()\ngoku.isMoved()\n```\n\n```sh\n~/Efreitech/pp ❯❯❯ swiftc *.swift -o bin\n~/Efreitech/pp ❯❯❯ ./bin\nPony #1 is singing --\u003e\nDou-double poney, j’fais izi money\nD’où tu m’connais ? Parle moi en billets violets\nDou-double poney, j’fais izi money\n\nSANGOKU is singing --\u003e\nCHA-LA HEAD CHA-LA\nNani ga okite mo kibun wa heno-heno kappa\nCHA-LA HEAD CHA-LA\nMune ga pachi-pachi suru hodo\nSawagu Genki-Dama --Sparking !\n\nHuuuuuuhu!\nKamé Hamé Ha!\n````\n\n## Etape \\#2. Une histoire d'emballage\n\nIl faut maintenant être capable de gérer l\\'emballage des cadeaux:\n\n#### Préparation\n\n- Une `Box` est un `Packaging`\n- Un `GiftWrap` est aussi un `Packaging`\n\n\u003e 💡 Tips: qu'est ce que représente la \"classe\" `Packaging` ?\n\nUn `Packaging` possède 2 attributs:\n\n- `isOpen` un booléen qui permet de savoir s'il est ouvert ou fermé\n- `toy` un jouet qui correspond à celui qui est emballé\n\nPar défaut un emballage est fermé et il n'y a pas de jouet emballé\n\n\u003e 💡 Tips: Valeur par défaut d'un jouet -- https://goo.gl/JF8SAv\n\nUn `Packaging` possède 2 méthodes:\n\n- `open` qui permet d'ouvrir un emballage\n- `insert` qui prend un jouet en paramêtre et permet de l'emballer\n\nLorsqu'un objet est emballé, l'emballage devient fermé.\n\n\u003e 💡 Tips: Lorsqu'une méthode modifie un attribut elle n'est plus immutable, ie\nqui ne change pas le comportement de l'objet (choix par défaut).\nComment faire pour que les méthodes ci-dessus soit mutable?\n\n### Factorisation\n\nLes protocoles c'est bien mais l'implémentation des classes `Box` et `GiftWrap`\nn'est-elle pas un duplicat?\nOui car la logique est la même pour ces 2 classes et ce n'est pas une bonne pratique.\n\nHeureusement, il existe un moyen d'implémenter une seule fois une même logique d'un protocol.\nIl s'agit des `extension` --\u003e swift skill++ yeaaaaah :)\n\n#### Les elfes entrent dans le Game\n\nUn `Elf` est une classe qui possède un attribut `nickname` de type `String` avec\n**getter**+**setter**\n\nLorsque l'on crée un Elf, on doit spécifié son `nickname`\n\n### Pack\n\nUn elf peut emballer un cadeau [et un seul] via une méthode `pack` qui prend en\nparamêtre un `Packaging` et un `Toy`\n\nSi l'emballage est fermé, l'elf dit: `Sorry this package is not open`\nSi l'emballage possède déjà un cadeau, l'elf dit: `Sorry this package already filled`\n\nSinon, le cadeau est ajouté à l'emballage et l'elf dit:\n`Yeaaaah! Just packing the toy ~~ X ~~`\n\n\u003e Remplacé X par le type du jouet\n\nAttention, un papier cadeau n'a pas besoin d'être ouvert pour emballer.\n\n\u003e 💡 Tips: Cette méthode modifie le comportement d'un objet passé en paramêtre (packaging).\nComment faire pour que le changement effectué au sein de la méthode soit \"réellement\" effectif ?\n\n#### Unpack\n\nUn elf peut déballer un cadeau via une méthode `unpack` qui prend en paramêtre un\n`Packaging`\n\nSi l'emballage est ouvert ou qu'il n'y a pas de cadeau, l'elf dit:\n`Sorry this package is already empty`\n\nSinon, le cadeau est enlevé de l'emballage et l'elf dit:\n`Ooooooh! Just unpacking the toy ~~ X ~~`\n\nLe jouet à l'intérieur de l'emballage est retourné\n\n\u003e Remplacé X par le type du jouet\n\n### TEST\n\nVoici les fichiers que vous devriez avoir:\n\n```sh\n~/M/cdiwm-rush-efrei-klaus ❯❯❯ tree .\n.\n├── class.Box.swift\n├── class.DragonBall.swift\n├── class.Elf.swift\n├── class.GiftWrap.swift\n├── class.Pony.swift\n├── extension.Packaging.swift\n├── main.swift\n├── protocol.Figurine.swift\n├── protocol.Packaging.swift\n└── protocol.Toy.swift\n\n0 directories, 10 files\n```\n\nVoici un main suivi de la sortie que vous devriez avoir:\n\n```swift\n...\n\n// Step #2\nprint(\"--- STEP #2 ---\")\n\nvar majdi: Elf = Elf(nickname: \"makiboto\")\nvar box: Packaging = Box()\nmajdi.pack(packaging: \u0026box, toy: goku)\nbox.open()\nmajdi.pack(packaging: \u0026box, toy: goku)\n\nvar paper: Packaging = GiftWrap()\nmajdi.pack(packaging: \u0026paper, toy: pony)\nmajdi.pack(packaging: \u0026paper, toy: pony)\n\nvar toy: Toy! = majdi.unpack(packaging: \u0026paper)\nprint(toy as! Pony === pony)\nvar r: Toy? = majdi.unpack(packaging: \u0026paper)\nprint(r == nil)\n\n```\n\n```sh\nPony #1 is singing --\u003e\nDou-double poney, j’fais izi money\nD’où tu m’connais ? Parle moi en billets violets\nDou-double poney, j’fais izi money\n\nSANGOKU is singing --\u003e\nCHA-LA HEAD CHA-LA\nNani ga okite mo kibun wa heno-heno kappa\nCHA-LA HEAD CHA-LA\nMune ga pachi-pachi suru hodo\nSawagu Genki-Dama --Sparking !\n\nHuuuuuuhu!\nKamé Hamé Ha!\nSorry this package is not open\nYeaaaah! Just packing the toy ~~ Dragon Ball figurine SANGOKU ~~\nYeaaaah! Just packing the toy ~~ Pony #1 ~~\nSorry this package already filled\nOoooooh! Just unpacking the toy ~~ Pony #1 ~~\ntrue\nSorry this package is already empty\ntrue\n```\n\n## Etape \\#3. Tapis qui roule et Fabrique\n\n### Mise en place\n\nIl faut maintenant être capable de gérer le poste de travail :\n\nAvant toute chose, il faut savoir que tout est `Object`, ie les jouets et les emballages.\n\nL'elfe a une `Table` devant lui et un `ConveyorBelt` (tapis roulant) à côté de lui.\nC'est deux entités sont des meubles aka `Furniture`.\n\nL'elfe peut poser et prendre sur un meuble des objets via les méthodes `put` et `take`.\n\nOn ne peut rien poser sur le tapis roulant s'il y a déjà quelque chose, un attribut `isBusy`\nnous permet de le connaître l'état de ce tapis. Par défaut, un tapis est disponible.\n\nQuand il n'y a plus de place sur la table, elle craque et dit car elle ne peut contenir\nqu'un maximum de 10 objets.\nPour cela créer un attribut `content` qui est un tableau d'`Object`.\n\nSpécificité de la `Table`, la méthode `take` prend un objet à la fin du tableau et\nil y a une méthode `take` supplémentaire qui prend en paramêtre la position de l'objet.\n\nL'elfe reçoit des Obbjets en appuyant sur le bouton `in` du\ntapis roulant ou envoie ce qu'il y a actuellement sur le tapis au père Noël en appuyant sur le bouton `out`\n\nUn Obbjets envoyé au père Noël est considéré comme perdu, le tapis roulant est de nouveau libre.\n\nL'elfe peut regarder via la méthode `look` sur la table pour savoir ce qu'il s'y trouve;\nIl obtient un tableau avec les intitulés des différents Objets.\n\n```sh\n[ \"Toy\", \"Toy\", \"Packaging\", \"Toy\" ]\n```\n\nL'elfe peut également regarder sur le tapis roulant pour savoir ce qu'il s'y trouve.\n\n### TEST\n\nVoici les fichiers que vous devriez avoir:\n\n```sh\n~/M/cdiwm-rush-efrei-klaus ❯❯❯ tree .\n.\n├── class.Box.swift\n├── class.ConveyorBelt.swift\n├── class.DragonBall.swift\n├── class.Elf.swift\n├── class.GiftWrap.swift\n├── class.Object.swift\n├── class.Pony.swift\n├── class.Table.swift\n├── extension.Packaging.swift\n├── main.swift\n├── protocol.Figurine.swift\n├── protocol.Furniture.swift\n├── protocol.Packaging.swift\n└── protocol.Toy.swift\n\n0 directories, 14 files\n```\n\nVoici un main suivi de la sortie que vous devriez avoir:\n\n```swift\n...\n// Step #3\nprint(\"--- STEP #3 ---\")\n\nvar table: Table = Table()\nvar conveyor: ConveyorBelt = ConveyorBelt()\n\nmajdi.put(furniture: table, obj: paper)\nmajdi.put(furniture: table, obj: pony)\nmajdi.put(furniture: table, obj: box)\n```\n\n### Patterns\n\nSK vous demande d'écrire les protocoles `PTable` et `PTapisRoulant` ainsi que les classes\n`TableFactory` et `ConveyorBeltFactory` implémentant ces protocoles.\n\nLa table et le tapis roulant du père Noël contiennent ce qu'il faut pour faire 2 cadeaux.\n\nLa disposition/répartition des emballages/jouets entre le tapis et la table est à votre convenance.\nSK veut que vous lui fournissiez deux méthodes:\n\n```swift\nmakeTable() -\u003e PTable\nmakeConveyorBelt() -\u003e PConveyorBelt\n```\n\nCes 2 méthodes permettent de réifier (instancier) ces 2 objets.\n\n### TEST\n\nVoici les fichiers que vous devriez avoir:\n\n```sh\n~/M/cdiwm-rush-efrei-klaus ❯❯❯ tree .\n.\n├── class.Box.swift\n├── class.ConveyorBelt.swift\n├── class.DragonBall.swift\n├── class.Elf.swift\n├── class.GiftWrap.swift\n├── class.Object.swift\n├── class.Pony.swift\n├── class.Table.swift\n├── extension.Packaging.swift\n├── main.swift\n├── protocol.Figurine.swift\n├── protocol.Furniture.swift\n├── protocol.PConveyorBelt.swift\n├── protocol.PTable.swift\n├── protocol.Packaging.swift\n└── protocol.Toy.swift\n\n0 directories, 16 files\n```\n\n## Etape \\#5. Chaussettes\n\n### Le final\n\nVous DEVEZ imaginer et implémenter un moyen de faire communiquer la table et le tapis roulant avec ceux de l'un de vos camarade 😱\u003cbr /\u003e\nPour cela vous devez utiliser des chaussettes magiques.\n\n\u003e Le travail doit être fait en binôme, choose well\n\n#### Documentation sur les sockets\n\n**Méthodes : create_elf**\n**Body :**\n\n```json\n{\n    \"method\": \"create_elf\",\n    \"data\": \"Nickname here\",\n}\n```\n\nCréer un Elf, avec un nickname spécifique.\n\n## Etape \\#6. Bonus\n\n### Le typage say bien\n\nTout simplement refaire le projet en TypeScript ou un autre si déjaà fait ;p\n\n## \u003ca name='credits'\u003eCredits\u003c/a\u003e\n\nCraft with :heart: by [**Majdi Toumi**](http://majdi.im) in **Paris**.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpyozer%2Frush-efrei-klaus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpyozer%2Frush-efrei-klaus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpyozer%2Frush-efrei-klaus/lists"}