Je reprends la phrase de Claude Allègre :
Est une science tout domaine qui se démontre par l'expérience.
En ce sens les Mathématiques ne se démontrant pas par expérience mais par raisonnement elles ne font pas partie des sciences.
Mais qu'en est-il des "sciences sociales" ?
Depuis quelques temps je m'interroge sur le fait que le domaine appelé "sciences sociales" ne soit pas une science tout comme le domaine des "sciences économiques" qui n'en sont pas une non plus.
Pourquoi ?
Car une expérience c'est le fait de pouvoir reproduire un phénomène à petite échelle, dans un espace maîtrisé, en faisant varier un seul paramètre à la fois pour en observer les effets. Or comment reproduire les effets à petite échelle de la macro-économie ? Comment reproduire à petite échelle les comportements sociaux d'un peuple ? Comment ne faire varier qu'un seul paramètre à la fois ? Et comment en mesurer les effets et s'assurer qu'ils soient bien dus à ce changement seul et non à autre chose ?
Bref, l'article l'explique assez bien :
Les constructions des sciences de l’homme se rapportent à des situations individuelles ; elles sont empathiques car celui qui connaît s’identifie à ce qu’il connaît. Ces sciences produisent des connaissances authentiques, mais pas des connaissances vraies puisque leurs démonstrations ne possèdent pas les propriétés des énoncés scientifiques.
En conséquence, mieux vaut ne pas ériger les énoncés des "sciences sociales" comme des vérités mais comme ce qu'elles sont : des théories servant de prisme à l'interprétation du monde.
Pensez-y la prochaine fois que quelqu'un évoquera devant vous la sociologie comme preuve et surtout comme une science.
Une IA est par définition conservatrice. Et cet exemple est ... triste.
Très bien dit ! Une IA n'est ni raciste, ni sexiste elle ne fait que reproduire les millions de constats qu'elle a précédemment fait. Ici elle s'appuie visiblement sur de la statistique pour donner la traduction la plus probable.
Par contre cet exemple n'est ni "triste" ni "heureux" (ça c'est de la morale), c'est juste un témoin qui synthétise les données utilisées pour enrichir l'IA.
Les faits, les faits, les faits. Le journal/blog les-crises.fr est toujours aussi pertinent.
Repost suite au crash OVH (merci à @ecirtam pour le backup, des bibis t'es toppissime je n'ai eu qu'à recopier qu'un seul post. Notre backup étant passé juste avant mon dernier post)
J'ai trouvé le message intéressant sur le GFoC (Great Firewall of China) :
P.S : si je ne post plus pendant plusieurs mois, ce sera à cause de ce post à mon avis... @Animal surveille mes arrières :D.
@Riduidel : la réponse à ta question est dans ce post (un peu long à lire désolée).
Un objet Iterable implique que l'on traite les données à partir d'un paradigme de programmation procédurale et impératif, c'est-à-dire ni objet, ni fonctionnel. Or les Optionals sont justement des éléments prévus spécialement pour penser et coder dans un style fonctionnel parmi les plus purs.
Vouloir que la classe Optional implémente Itérable, c'est un marqueur fort permettant d'identifier qu'une personne n'a pas encore appris et compris le paradigme fonctionnel où :
- Les instructions if/else/switch ont été remplacés par du pattern-matching.
- Les boucles for/while/do-while ont été remplacées par des appels récursifs.
- Les références ont été remplacées par des lambdas.
Enfin, le fait que Scala ait implémenté Iterable dans les Optionals est justement ce qui fait de Scala un mauvais langage fonctionnel à mon avis, car si c'est génial d'être multi-paradigme, c'est par contre très mal de mélanger les paradigmes dans les éléments constituants l'API du langage car cela créé un code extrêmement incohérent où il devient difficile de savoir comment s'exprimer ; mais c'est mon côté software craftswomanship qui parle #JavaDuchesses
De mon côté Kotlin est constaté dans deux banques et un géant de l'énergie (secteur Parisien) et nous sommes en train de le pousser comme langage par défaut sur le développements d'API qui doivent être utilisées sur des infrastructures ultra legacy (Weblogic + Java 7 #Pleure) pour les remplacer, car Kotlin permet justement de coder avec les features de 2021 et de transcompiler le bytecode vers de vielles JVM 6/7/8.
Rappelons que Java a mis 10 ans pour devenir Java et que quelques années plus tard il est à 1/8ème de son paroxysme, cf. cette Google Trend du 1er janvier 2004 au 7 mars 2021 montrant l'évolution de Java sur ces 17 dernières années.
En comparaison, Kotlin va seulement fêter sa 6ème année... Laissons-lui encore 4 ou 5 ans histoire de voir.
Le post de @Tiger222 est intéressant en lui-même et donne le sentiment que Microsoft s'intéresse enfin (après 30 ans) à l'avis de ses utilisateurs, oui mais...
Quand nous allons sur le répo GitHub dont il est question, nous pouvons constater que tous les projets listés :
- Windows Terminal / Console / command-line
- Windows Subsystem for Linux (WSL)
- PowerShell
- PSReadLine
- OpenSSH for Windows
- .NET Core runtime & libraries
- ASP.NET Core
- Roslyn (C# & Visual BASIC Compiler Platform)
- Windows Presentation Foundation (WPF)
- WinForms
- WinUI
- Winget package manager app
- Winget package repo
- PowerToys
- Project Reunion
sont sous la licence MIT.
Mais quel pourrait être le problème avec cette licence se demandent sûrement certains ?
Tout simplement que la licence MIT est une licence libre mais du point de vue d'une entreprise commerciale à but lucratif seulement (pléonasme) et non du point de vue des citoyens que nous sommes. C'est-à-dire qu'elle permet à quiconque réutilisant du source sous licence MIT d'en faire soit un logiciel open-source, soit un logiciel close-source.
C'est un débat que j'ai longtemps eu que avec @Kysofer et @Tarq. À l'époque, mon point de vue était de dire : "oui mais avec une licence MIT ou Apache 2.0, je suis plus libre parce que je peux faire de l'open-source OU du close-source, alors que les GPL et AGPL permettent de ne faire QUE de l'open-source. En réalité la GPL et la AGPL sont moins ouvertes et confèrent moins de libertés aux développeurs que les licences MIT et Apache 2.0".
SPOILER : j'avais tort !
Les deux ont argumenté pendant des mois et ont fini par me convaincre avec les propos suivants :
-
Les licence MIT et Apache 2.0 permettent de faire sur close-source mais ceci est uniquement dans l'intérêt de sociétés commerciales, toi en tant qu'individu tu n'es pas une entreprise, ce n'est donc pas la liberté d'entreprendre et de faire de l'argent qui devrait primer de ton point de vue mais la liberté d'utiliser et d'être tranquille dans ta vie de tous les jours lorsque tu utilises un logiciel.
-
Le logiciel libre se finance de plusieurs manières :
- En lui donnant de l'argent.
- En contribuant à son développement (code, traduction, documentation, etc).
- En animant sa communauté.
- En assurant son support.
Par contre, utiliser les sources d'un logiciel libre pour en faire du close-source ce n'est pas contribué ni financer ce logiciel. À l'opposé, toute personne qui modifie un logiciel libre et qui se retrouve obligée de diffuser le code source modifié aura contribué à ce logiciel, cette personne n'aura pas payé avec de l'argent mais payé avec son temps et la redistribution de ses modifications.
Si une entreprise ne souhaite pas contribuer à un logiciel libre avec du temps et du code source, alors elle doit le payer avec de l'argent. À cet instant, c'est la stratégie de la double licence qui devrait être mise en place :
- Par défaut les sources sont sous GPL ou AGPL et celles-ci sont gratuites mais toute modification doit être redistribuée à la communauté.
- Si une entreprise commerciale souhaite faire du close-source, alors elle achète les sources sous une licence propriétaire et commerciale qui le lui permet avec un partie de l'argent qu'elle espère gagner du projet modifié, ça s'appelle invertir et c'est la raison même d'exister d'une entreprise.
Dans la démarche de Microsoft, je vois seulement une entreprise commerciale, richissime, littéralement ennemie du libre depuis sa création (cf. tous les posts de @Sebsauvage sur la question), qui obtient de la part de développeurs charitables du travail bénévole et des trésors d'innovations qu'elle pourra close-sourcer à volonté plus tard... Comment vous dire ? Merci mais non merci.
Nous ne sommes pas des personnes morales mais des personnes physiques, en tant qu'êtres humains nous n'avons pas les mêmes intérêts que des entreprises, en ce sens ne nous prenons pas pour des personnes morales en nous imaginant générer du profit à outrance à partir du travail gratuit et bénévole d'une communauté de passionnés.
Le meilleur c'est que je défends à présent cette idée en étant actuellement à mon compte et donc en disposant déjà d'une structure juridique me permettant de commercialiser ce que je voudrais. Or ceux qui ont le fantasme de développer un produit miracle à close-sourcer en spoliant les trésors d'ingéniosité des logiciels libres, sont pour certains d'entre-eux des salariés enchaînés à une clause d'exclusivité totale intégrée à leur contrat de travail, rendant caduque l'idée même de développer un produit avant même qu'un début de réalisation ne soit amorcé.
Bref, si j'étais une développeuse qui souhaite contribuer par des tickets à amélioration d'un logiciel, j'irai voir du côté de Linux Mint ou des GNU tools ou encore de Mozilla, MyPaint, WineHQ, GTK, OpenJDK, PHP, bref tout mais pas quelque chose sous licence Apache 2.0 ou MIT.
Cette personne sait-elle qu'à cause de l'Article 63 du TFUE qui permet la liberté de circulation totale et sans contrôle de tous les capitaux et de toutes les marchandises, cf. ce post, le Luxembourg est un paradis fiscal qui peut continuer d'être un paradis fiscal ?
Je comprends l'idée que les propriétaires des grands médias ne vont pas tirer sur la poule aux œufs d'or et du coup la nécessité de signaler au grand public la propagande qui règne dans notre beau pays mais ça ne se limite pas à ça.
Toutefois une question me taraude... Que dire de paradis fiscaux comme Monaco ou la Cosuzeraineté d'Andorre qui sont à l'intérieur même de notre territoire ? Parce que nous n'en parlons pas plus et cette fois-ci il ne s'agit pas d'un problème que l'Union Européenne fabrique, entretien et protège...
Je vous recommande en complément cette vidéo du vidéaste-youtubeur Trouble Fait qui décrit très bien le fond du problème avec les paradis fiscaux.
Merci à @Lenny pour le lien.
OpenNews est maintenant le café de la gare ? Quel pavé de platitude et de branlette intellectuelle.
Définition du mot platitude tirée du Larousse
Caractère de ce qui est plat, banal, médiocre : La platitude du style. Parole banale : Dire des platitudes.
Acte empreint de bassesse, de servilité, d'obséquiosité : Faire des platitudes pour parvenir à une fonction.
Je pense que le commentaire utilise le sens premier du mot, en ce sens j'aimerais demander à son auteur quel commentaire il serait en mesure de produire et qui, selon son propre jugement, ne serait pas un amoncellement de paroles plates, banales ou médiocres ?
Pour la petite histoire, je me souviens de filles qui étaient toujours promptes à juger de haut et dénigrer les dires, les goûts ou les idées des autres sans jamais argumenter et toujours avec un ton péremptoire ; mais elles avaient une excuse pour cela : elles étaient au collège.
Sinon j'étais certaine que Twitter ne s'écrivait pas ecirtam.net... Il faut vraiment que j'améliore mon français. (> <)
le néerlandais-qui-plane
Désolé @Timo mais j'ai rigolé.
Sinon d'accord avec le propos du poste, les grands propriétaires lucratifs ne sont pas inquiétés par la novlangue "du progrès".
En général, les gens qui se revendiquent antifascistes me font un peu peur, tout comme les skin-heads et ceux qui se revendiquent de l'extrême-droite (genre les mecs qui se pensent de la race supérieure et tutti quanti si vous voulez). En y réfléchissant un peu, j'ai réalisé deux choses :
1) Qu'ils m'effrayaient parce que je les assimilais aux Black Blocs.
2) Qu'à chaque fois que le terme était utilisé, c'était souvent pour du reductio ad hitlerium.
Mais peu importe, à force de lire @Neko, je me suis dit que j'allais chercher une vraie définition de ce qu'était l'antifascisme et donc je suis allée sur Wikipédia :
L'antifascisme est l'opposition organisée au fascisme et, plus largement, à l'extrême droite1.
Il prend forme dans les années 1920 et se développe conséquemment à la montée du fascisme en Europe. Il a connu un très fort développement au cours des années 1930, étant à l'origine de la formation des Fronts populaires Ce lien renvoie vers une page d'homonymie, puis pendant la Seconde Guerre mondiale au sein des résistances contre les dictatures fascistes et nazies ainsi que contre les régimes de collaboration.
En dehors de la lutte contre les régimes se réclamant du fascisme proprement dit, l'antifascisme ou le terme d'antifascisme a très tôt été utilisé par des partis communistes pour combattre leurs adversaires politiques, proches ou lointains sur le plan idéologique, voire tout opposant critique. Cette instrumentalisation de la lutte dite « antifasciste » a été analysée et critiquée par de nombreux intellectuels et historiens2.
L'antifascisme peut également désigner dans une acception plus large une idéologie tendant à s'opposer aux mouvements populistes.
Cette définition me semble claire, elle aborde même l'origine du mouvement et je n'ai rien à y redire, je m'en sens carrément proche d'ailleur, sauf peut-être le dernier paragraphe car je ne sais pas ce qu'est "un mouvement populiste". Si cela signifie "mouvement institué par le peuple" alors aucun problème pour moi (rappel : le peuple est ce sur quoi le pouvoir s'exerce). Si cela signifie "mouvement institué en manipulant le peuple", alors oui j'ai un problème avec le populisme.
Et puis il y a ce passage qui traduit également ma perception de l’antifascisme, mais cette fois-ci dans ce que nous constatons au 21-ième siècle (les passages graissés sont de moi) :
Pour Pierre-André Taguieff, l'antifascisme, « pur produit de la propagande soviétique [...] est devenu, à partir des années 50, une machine de guerre idéologique qui a prospéré dans les démocraties occidentales. Il s’est ainsi diffusé, après la Seconde Guerre mondiale, dans les représentations politiques d’une grande partie de la gauche française. » Selon lui, le plus grand « tour de passe-passe » de la gauche, « est d’avoir réussi à faire persister le discours antifasciste dans l’espace public malgré l’absence de fascisme réel. L’antifascisme s’est révélé être un formidable levier d’illégitimation des opinions divergentes. » Selon le politologue, l'antifascisme opère « comme un argument d’autorité suprême qui vise plus à la disqualification qu’à l’établissement d’un débat démocratique. » Son corollaire, le terme fascisme a été ainsi galvaudé, devenant une étiquette pratique afin de discréditer et disqualifier un adversaire.
Comme je ne savais pas qui était Pierre-André Taguieff, je suis partie rechercher sa bio consultable ici en me disant qu'il s'agissait peut-être d'un militant lui-même d'extrême droite... Et apparemment non, tout au contraire même, puisque l'extrême droite lui a décerné son prix parodique dit "Lyssenko", je cite :
« Pour son analyse approfondie du racisme sous toutes ses formes », il reçoit en 2014 le prix Lyssenko, prix parodique décerné chaque année par le Carrefour de l'horloge, association d'extrême droite, « à un auteur ou une personnalité qui, par ses écrits ou par ses actes », a apporté, « une contribution exemplaire à la désinformation en matière scientifique ou historique, avec des méthodes et arguments idéologiques. »
Donc même à gauche, parmi les personnes instruites à la lecture des discours et méthodes politiques, il en existe qui perçoivent "une partie de ceux qui se revendiquent antifascistes" comme des personnes se servant de l'accusation de "fasciste" sans fondement et uniquement pour dévaloriser et décrédibiliser un adversaire sans preuve ni effort.
En ce sens, à quoi peut-il bien servir de se revendiquer antifasciste ou de revendiquer que l'on tient des propos antifasciste ou de s'assimiler à de l'antifasciste ? Je n'ai pas besoin de me sentir être "une meilleure personne" ou d'avoir bonne conscience, et j'ai l'impression qu'accuser de quelqu'un de fasciste fait rayonner l'accusateur non pas parce qu'il devient meilleur mais par contraste en ternissant l'accusé ; et ce genre de méthodes je ne les aime pas trop en fait...
Sauf que...
C'est ce que je fais déjà avec les SJW ! #FacePalm Accuser quelqu'un d'être un SJW ou un Baizuo, cela revient exactement au même !
Du coup, de chaque côté il y a un noyau dur qui s'est concentré ou les appellations fascsistes / fafs et SJW / Baizuo doivent être en partie vraies mais fondamentalement, ce sont deux façons de décrisibiliser le message en attaquant la personne, soit en la diabolisant dans le premier cas, soit en la ridiculisant dans le second.
Je pense que Crédic Champeau et les personnes argumentant en faveur du DSL Gradle dans les commentaires "just miss the point".
1) Le DSL ne permet pas d'hériter ou d'inclure un processus de build unique, public, documenté et standard, ce qui est indispensable en industrie. Certains répondraient qu'il est possible de le coder directement dans un plugin ce à quoi je réponds :
- Écrire du code qui va compiler du code, the what ?
- Mais admettons, je code le-dit plugin, si alors j'ai besoin de me sortir partiellement du processus standard que dois-je faire ? Forker le plugin ? Donc je rajoute du code à du code qui va compiler le code ? Encore une fois the what ?
2) Même en écrivant en DSL Gradle de manière déclarative, l'ordre des déclarations est important, ce qui de facto rend le code impératif puisqu'il nécessite de penser en termes d'ordonnancement de l'instantiation des élements qui constituent le DSL, ce qui n'est pas déclaratif.
3) Les DSL ne m'intéressent pas. Ta techno => tes problèmes. Je dois déjà faire du Kotlin, du Java, du TypeScript, du Spring, du Spring Boot, du Spring Cloud, du JPA, du Lombok, du Mapstruct, du Jackson, du Zuul, de l'Open API, de l'Ansible, du Docker, du Kubernetes, du SCSS et CSS, du Bootstrap, de l'Angular, du Karma, du JUnit Jupiter, du Mockito, du WireMock, du Rest Assured, du Protractor, du npm, du Maven, de l'Angular-cli, du SSL, du Linux (ssh + systemctl + GNU tools), du bash et du dash, du GraalVM, du Jasmine, de l'AOP (AspectJ), du Spring Data (JPQL), du Liquibase, du SQL, du PL/SQL, du REST, du SOAP, de l'Apache CXF, du HazelCast, du SonarQube, de l'OAuth2, et du clean code + clean architecture + Domain Driven Design + architecture hexagonale + Design Patterns et tout ça c'est uniquement sur un seul projet (il y en a une trentaine) et là on me dit qu'il faut que j'apprenne deux langages de plus (Groovy + DSL Gradle) juste pour compiler du code ? Comment leur dire à ces messieurs ? Nous ne vivons pas dans le même monde.
Bref, Maven Daemon pour speed up les builds + les pom de Maven écrits en Yaml et c'est bon.
Est-ce que vous savez comment je perçois l'économie et les classes sociales de ce pays ?
La classe bourgeoise garde tout l'argent pour elle.
La classe moyenne paie toutes les taxes et fait tout le travail.
Et les pauvres sont juste là pour foutre les boules à ceux de la classe moyenne afin de les forcer à retourner bosser.
George Carlin
Du pur génie !
Lorsque l'on regarde l'évolution du logo de Firefox, notre cher petit panda roux a littéralement disparu au profit d'au choix et selon votre perception :
- Une sorte de flamme.
- La fin d'un grosse queue d'animal (mais en inversant tête et queue par rapport au logo "classique").
J'ai lu beaucoup de personnes (Reddit, 9gag, Imgur) décrier le nouveau logo en arguant que Mozilla était en train de faire tout simplement disparaître Firefox de nos vies, au sens symbolique comme au sens réel du terme (puisque part de marché en baisse), le logo actuel étant un constat de ce phénomène.
Je rappelle que Mozilla avait choisi le Firefox pour avertir le grand public que cette espèce était en voix d'extinction, visiblement cette cause n'est plus importante ou l'espèce n'est plus à protéger... Ou alors le marketing est plus important que les causes importantes #ComplotismeOuCapitalisme ?
Edit : ce que le logo Firefox aurait pu être si le style minimaliste n'était pas en vogue.
Edit 2 : Apparemment Mozilla gardera l'avant dernier logo du set que j'ai posté. Quant à ce logo :
Il sera utilisé pour parler l'ensemble des produits de la "gamme Firefox", donc non le Panda Roux reste bien qu'un peu déformé (source Mozilla Blog).
Merci @Lou, pour avoir remonté la vraie info, le nouveau logo venant du blog consacré à Firefox, ce n'était pas clair.
Edit : Pitest marche avec TestNG finalement ! Il faut rajouter ceci au plugin (info que j'ai trouvée dans la conf Gradle d'une application Android mais pas dans la doc officielle) :
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<version>${version.pitest}</version>
<configuration>
<testPlugin>testng</testPlugin>
</configuration>
</plugin>
Merci à @Animal et @Kysofer qui m'ont accompagnée très tard cette nuit sur Framatalk.org ! #BestBuddiesEver
Depuis hier je me casse les dents sur Pitest dont j'ai parlé à deux reprises ici et ici. Pour faire simple un client m'a demandé de le mettre en œuvre sur nos projets mais impossible de le faire marcher :'(
Comme ce soir tout le monde est couché depuis 1h30 et que j'ai l'esprit frais, je me suis dit que j'allais réessayer mais en changeant ma démarche. Cette fois-ci je prendrai un projet sur internet et qui fonctionne puis j'en modifierai sa configuration pour la faire converger vers celle de mon projet jusqu'à ce qu'elle pète.
Conclusion : Pitest ne fonctionne pas avec TestNG (et j'ai essayé toutes les versions majeures de la 6.1.1 conseillée par le site de Pitest jusqu'à la 7.3.0, dernière version en date).
Bref, cela faisait quelques temps que le couple TestNG + AssertJ me posait problème dans le sens où TestNG était moins bien pris en charge par certains framework et je vais a priori devoir faire un retour arrière pour le couple JUnit Jupiter + AssertJ (oui je conserve AssertJ, plus jamais les assertions de JUnit, viva la fluent-expressive API d'AssertJ).
Voici le passage dont j'ai graissé la partie qui m'a énervée :
Cornichon : 28 calories
100 grammes de cet aliment représentent une valeur énergétique de 28 calories ou kilocalories (ou 116 kilojoules). En moyenne, les produits de la catégorie sauces salées et condiments apportent une valeur énergétique équivalente à 203 kilocalories.
Donc, c'est au choix j'imagine c'est ça ? C'est, 100g de cornichons apportent :
- 28 calories (c'est-à-dire que-dalle !)
ou - 28 kilocalories, c'est-à-dire 28 000 calories (c'est-à-dire 1 000 fois plus !!)
Et c'est ça qui m'énerve avec toute cette presse orientée régime-bien-être-minceur / la-saloperie-qui-vous-vient-à-lesprit-synonyme-de-tes-moche-alors-achète-ma-merde. Heureusement que je sais que les producteurs (industriels) ont créé l'unité Calorie avec un 'C' majuscule où 1 Calorie = 1000 calories pour nous faire croire que nous ne grossirions pas en consommant leurs merdes, mais qu'est-ce que ça m'énerve de voir que la majuscule n'est respectée nulle part !
On ne peut JAMAIS savoir la quantité d'énergie que l'on ingère, ajoutez à cela qu'il faudrait convertir les calories en leur équivalent sucre pour savoir combien d'énergie nous absorbons réellement et j'en viens à me dire que tous les régimes hypocaloriques ne sont que du bullshit pur et dur.
N.B : oui en équivalent sucre car jusqu'à preuve du contraire, le bambou contient aussi des calories, sauf que notre organisme n'est pas capable des les assimiler comme c'est le cas du Panda... Pour rappel, nous nous déplaçons grâce aux lipides stockés, puis transformés en glucides au moment de l'effort, pour être utilisés comme carburant.
Bref, je viens d'ajouter une règle pour rediriger le domaine journaldesfemmes.fr vers 127.0.0.1, plus jamais je ne veux consulter ce site de ma vie ! Et je lui donne la note de #PQsur20 parce que même #TorchonSur20 ce serait trop bien le noter.
Un framework de test de mutation pour JRE, donc qui marche avec Kotlin et Java.
Tout à fait d'accord ! Et il y a aussi Marx par Léon Trotsky que je recommande parce que Le Capital de Marx est certes une œuvre majeure mais qui peut s'avérer être indigeste pour une bonne partie des gens.
Aujourd'hui j'ai relu un cours de @Kysofer qu'il prépare sur la bonne utilisation des monades en programmation fonctionnelle et ça m'a donné envie de le résumer en un cas d'école clair et simple.
Pour la petite histoire et depuis Java 8, je vois apparaître des Optionals
partout mais 99% des développeurs n'ont pas compris comment s'en servir (c'est pour cette raison que je dis souvent que la programmation fonctionnelle est un cancer métastasé, car une fois ces mauvaises pratiques installées, le code devient alors incurable). #Sadness
Bref, c'est partie pour une explication claire et courte... Notre cas d'école sera le suivant :
Une
Personne
possède uneDate de Naissance
, cette date contient elle-même uneAnnée de Naissance
qui contient à son tour une valeur (logée dans un Integer).L'objectif est d'imprimer l'année de naissance si elle existe sans jamais écrire le moindre 'if' pour l'exécution ci-après déclarée dans la méthode
main()
.
La méthode main()
:
class Main {
public static void main(String[] args) {
optionalPrintln(Optional.ofNullable(new Person(new BirthDay(new YearOfBirth(2000)))));
optionalPrintln(Optional.ofNullable(new Person(new BirthDay(null))));
optionalPrintln(Optional.ofNullable(new Person(null)));
}
}
La sortie attendue dans la console doit être celle-ci
2000
Étape 1 - Les classes/structures de données Person, BirthDay et YearOfBirth
class Person {
private final BirthDay birthDay;
public Person(BirthDay birthDay) {
this.birthDay = birthDay;
}
public Optional<BirthDay> getBirthDay() {
return Optional.ofNullable(birthDay);
}
}
class BirthDay {
private final YearOfBirth year;
public BirthDay(YearOfBirth year) {
this.year = year;
}
public Optional<YearOfBirth> getYearOfBirth() {
return Optional.ofNullable(year);
}
}
class YearOfBirth {
private final int year;
public YearOfBirth(int year) {
this.year = year;
}
public Optional<Integer> getValue() {
return Optional.of(year);
}
}
Étape 2 - Ce qu'il ne faut pas faire
Les 9-10ième des développeurs Java que je côtoie écriront ce genre de code pour la optionalPrintln(Optional<Person> option)
:
class Main {
// ...
public static void optionalPrintln(Optional<Person> option) {
if (option.isPresent()) {
Person person = option.get();
Optional<BirthDay> birthDay = person.getBirthDay();
if (birthDay.isPresent()) {
Optional<YearOfBirth> yearOfBirth = birthDay.get().getYearOfBirth();
if (yearOfBirth.isPresent()) {
Optional<Integer> year = yearOfBirth.get().getValue();
if (year.isPresent()) {
System.out.println(year.get());
}
}
}
}
}
}
C'est très moche, c'est très compliqué et ça n'est pas fonctionnel du tout ! Pire encore, certains développeurs écriront ceci :
year.ifPresent(it -> System.out.println(it));
à la place de ce dernier 'if' :
if (year.isPresent()) {
System.out.println(year.get());
}
tout en croyant coder en fonctionnel, or ça n'est pas le cas du tout non plus ! Croire que l'on fait bien alors que l'on fait mal, c'est en ce sens que la chose est pire AMHA.
Étape 3 - Ce qu'il faut faire
La programmation fonctionnelle ne cherche pas à représenter des instructions, c'est-à-dire une succession d'actions techniques qui s'enchaînent mais a contrario, elle cherche à représenter un flux de conversion, c'est-à-dire le fait de passer d'un type A à un type B.
L'API permettant une telle prouesse réside dans le map
de la stream API, or cette fonctionnalité n'est pas applicable à un objet composé comme c'est le cas du Optional
puisqu'il s'agit d'un arbre à deux niveaux sur une seule branche.
Dans ce cas, il faut utiliser la méthode flatMap()
de la même API pour supprimer le niveau superflue de l'arbre et accéder directement à la donnée si elle n'est pas null
.
Ce qui donne le code suivant :
public static void optionalPrintln(Optional<Person> option) {
option.flatMap(it -> it.getBirthDay())
.flatMap(it -> it.getYearOfBirth())
.flatMap(it -> it.getValue())
.ifPresent(it -> System.out.println(it));
}
Explication
A chaque invocation de flatMap()
, cette méthode va jouer pour nous un optional.ifPresent(it -> ...)
afin de nous en décharger. Si rien n'est présent, alors l'évaluation du flatMap()
lui succédant ne se fera tout simplement pas car le flux d'instances à convertir d'un type à un autre type sera dépourvu de toute instance à convertir. #Malin
Et c'est comme cela que l'on code en fonctionnel avec les Optionals ! Le véritable but étant de ne jamais s'en servir explicitement.
Remarque :
La programmation fonctionnelle est extrêmement difficile car elle oblige les développeurs à passer du stade "je dis à la machine comment faire" au stade "je décris à la machine quoi transformer et vers quoi d'autre".
Depuis ces 20 dernières années, j'ai toujours constaté que moins de 5% des développeurs étaient capables de penser dans ce paradigme et parmi ce petit pourcentage, à peine la moitié s'en servira dans sa vie professionnelle.