Alors ce tutoriel est très bien pour ceux qui souhaitent apprendre la syntaxe du langage par contre en aucun cas il ne correspond au titre de l'e-book dont il est un chapitre : "Introduction au langage Kotlin, découvrir les notions avancées de la programmation orientée objet".
En rien l'article ne parle d'OOP et de ses concepts avancés, bien au contraire il met en avant les aspects du langage qui poussent à la programmation procédurale réalisée à partir de structures de données façon C/VB/PL-SQL et je m'explique.
Lorsque vous créez une classe avec des getters et des setters, vous ne faites ni plus ni moins que de créer une structure avec des attributs public déguisés en attributs privés. Fondamentalement, même si c'est au travers d'une méthode, vous permettez à n'importe quelle autre classe de violer l'aspect le plus fondamental de l'OOP : l'encapsulation (je vous invite à suivre les tutos de @Kysofer sur le sujet, c'est un grand gourou du domaine).
D'ailleurs, et pour reprendre l'un de ses cours, l'encapsulation c'est deux composantes :
- Personne d'autre que la classe ne peut connaître (et encore moins modifier) les données qu'elle contient.
- Personne d'autre que la classe ne peut connaître le type réel des données qu'elle contient.
Avec un exemple simple, si j'ai cette horreur (du point de vue de l'OOP) :
val name:String = person.getName()`
person.setName("my-name")`
Alors cela revient exactement au même que d'écrire :
val name:String = person.name`
person.name = "my-name"
Cela est tellement la même chose que Kotlin l'assume et génère à la compilation, à partir des getters/setters, le code du second exemple pour permettre l'accès en public aux attributs.
Mais là n'est pas le problème, en effet le vrai problème est que si je venais à changer le type interne de name pour le passer d'une String à un nouveau type, par exemple appelé Name, alors il faudra que je modifie TOUS LES APPELS EFFECTUÉS à getName() car les codes appelant s'attendent à une String, rien n'est encapsulé, rien n'est masqué, a contrario toute la représentation interne fuite à travers les getters/setters et les gens appellent cela innocemment de l'OOP alors que ça n'en est pas du tout : ce sont des struct déguisées en objets.
La solution consiste à n'utiliser que des interfaces car par essence, une interface ne peut pas avoir d'attributs. Alors certes les dérives depuis Java 8 et certains anti-patterns de la programmation fonctionnelle (du point de vue de l'OOP toujours) ont eu tendance à modifier le langage mais dans la pratique, c'est vraiment une très mauvaise idée de mettre des attributs/constantes dans une interface.
Je sais que @Kysofer et @Lenny réfléchissaient à faire des tutos sur l'OOP sur Youtube/PeerTube, j'espère que ce post va les motiver à passer à l'acte. D'ailleurs je partagerai toutes vos vidéos mes chéris :) #Waiting
Il y a plusieurs façons de faire, mais lorsqu'il s'agit de remplir un placeholder d'un input text, cette méthode marche plutôt bien :
<input type="text" i18n="[placeholder]my-i18n-key" />
L'attribut qui se fera injecter le i18n doit être mis entre crochet [ ] et s'il y en a plusieurs, alors ils doivent être séparés par des virgules s'ils possèdent la même valeur ; ou par des points-virgules s'ils possèdent chacun une valeur différente.
Par exemple :
<!-- Les deux attributs posséderont la même valeur i18n -->
<input type="text" i18n="[placeholder,aria-placeholder]my-i18n-key" />
<!-- Chaque attribut possédera sa propre valeur i18n -->
<input type="text" i18n="[placeholder]my-i18n-key;[aria-placeholder]my-other-i18n-key" />
Aurelia est un framework à la fois simple et élégant.
Un tuto interactif sympa sur les flexbox que m'a filé @Kim aujourd'hui.
Problème :
- Vous devez télécharger un très gros fichier.
- Des erreurs réseaux surviennent régulièrement.
- Vous souhaitez reprendre le téléchargement là où il s'est arrêté dès qu'une erreur se produit.
- Vous souhaitez recommencer autant de fois que nécessaire (parce qu'il y aura plusieurs centaines de fois une erreur #RéseauDeQualitayyyy ).
Solution :
Il vous suffit d'utiliser la commande suivante :
OUTPUT_FILE="./mon_fichier"
URL="https://monhost/my-download.file"
wget --continue --tries=inf -O "${OUTPUT_FILE}" "${URL}"
Explication :
--continueindique à wget de reprendre là où il s'est arrêté.--tries=infindique à wget de réessayer autant de fois qu'il le faudra (la limite étant à 20 essais par défaut).-Oindique à wget où écrire le fichier à télécharger.
Pour @Chlouchloutte, un tuto simple montrant comment mocker l'objet Context des routes de JavaLin avec MockK. Mais normalement Mockito en direct devrait aussi faire le café.
Aurelia est un framework orienté SPA plus rapide que React ou Angular sur quasiment tous les modes de rafraîchissement du DOM. Ici Jeremy Danyow tient un podcast où il explique les bases des mécanismes de binding du framework.
@Chlouchloutte si tu recherches des snippets de code je te recommande d'aller sur le GitHub d'Aurelia dédié aux benchmarks des différents mécanismes de mise à jour du DOM mais j'ai l'impression que le podcast est la meilleure façon de tout comprendre (1h par contre, désolée).
Un tuto expliquant comment fonctionne la balise vidéo de HTML5. Attention, le tuto n'est pas parfait, je recommande de le compléter par celui-ci de l'agence AlsaCréations qui explique les "vrais" attributs qu'il faut mettre dans la balise <video> (vrai au sens W3C du terme) et éventuellement celui-ci du site OpenClassRooms.
Et un lien intéressant portant sur les connexions P2P en WebRTC avec HTML5.
Comment dessiner des yeux de filles façon manga ? Marrant, je vais essayer.
Un autre tuto ici.
Un bon article expliquant les bases de Vert.x afin de créer une API RESTful.
Le blog d'Human coders qui parle de tout avec plein de tutos
Un bon tuto sur le fonctionnement d'un perceptron. Pour tous ceux qui souhaitent se mettre à l'IA.
Je découvre l'outil grâce à Kalvn (qui tient toujours sa place parmi mes 3 shaarlistes préférés <3).
Et voici un tuto que propose Kalvn sur Artillery.
Pour @Chlouchloutte et surtout ton ami qui découvre Prolog.
Les mots clefs important en Prolog :
- Les clauses
- Les prédicats
- Les buts
- La coupure
- Et l'unification (le plus important)
Je dois accompagner des équipes dont les projets vont tourner sur Bootstrap 3 et à terme Bootstrap 4. Je me mets de côté cette documentation (car je suis team Bulma).
Encore une fois, merci à Kalvn qui a toujours le bon lien au bon moment (à croire que nous travaillons au même endroit sans le savoir).
Les layouts en CSS pour @Animal
GraphQL est une alternative très sérieuse à RESTful. Ce qui me pose encore problème pour l'adopter définitivement c'est la carence en frameworks afin de parser/lexer les requêtes reçues via HTTP et d'en assurer le mapping côté base de données.
Ici GraphQL Java apporte une première pierre à cet édifice avec un exemple d'implémentation simple mais concret.
Les liens de Kalvn sont décidément bien trouvés ! Ici des tutos animés sur les Flexbox des CSS.
@Chlouchloutte @Animal il est temps de vous y mettre !
Source du lien.
Toute une documentation très bien faite sur les coroutines en Kotlin et les mécanismes de synchronisation que le langage fourni. Vraiment très bien pour apprendre à tirer partie des CPU multi-coeurs.
Eviter les problèmes de débutants en Rust
Un très bon tuto bricolage. Je dois faire des travaux à la maison ur ur ur.