Tu montre bien qu'il y a des recoupements entre les concepts que l'on nomme đ
Et je ne vois pas vraiment que le principe de Liskov implique que ton code doive compiler si tu rajoutes un sous type. Le seul truc du principe câest quâun sous type ne doit pas casser les invariants comportementaux dâun super type.
Notamment parce que par principe le fait que ce soit "Sealed", justement, empĂȘche lâextension. Le sous typage est toujours possible en sous-typant les cas connus ?
[^] # Re: Shell
PostĂ© par barmic 𩩠. En rĂ©ponse au journal La plus belle ligne de code. ĂvaluĂ© Ă 3.
Exactement sauf que je n'utilise jamais de conjonction de bloque donc pas de
{...} && {...} || {...}(c'est verbeux et piégeux, par exemple il manque un ; dans ton dernier exemple d'aprÚs mon dash 0.5.12) et j'évite lesreturnen shell particuliÚrement parce que maintenant bash ne les accepte plus que dans certaines conditions.https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: sealed ?
PostĂ© par barmic 𩩠. En rĂ©ponse au journal La plus belle ligne de code. ĂvaluĂ© Ă 3.
J'avais écris le code rapidement sur téléphone, la version vérifiée c'est :
Mais je pense avoir compris ce que tu veux dire et je me suis clairement mélangé les pinceaux entre propriété de classe et d'instances.
Sans parler de Liskov ou de subtyping behavior, à mon avis il faut avoir conscience de ce que ça contraint sur le code et qu'il faut choisir une balance entre implémenter des comportements dans les
classet faire porter le comportement dans des méthodes extérieures aux classes.https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: sealed ?
PostĂ© par barmic 𩩠. En rĂ©ponse au journal La plus belle ligne de code. ĂvaluĂ© Ă 2.
Euh je vois pas. Quelle est la propriété que décrite sealed que tu peux appliquer aux filles ?
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: sealed ?
PostĂ© par barmic 𩩠. En rĂ©ponse au journal La plus belle ligne de code. ĂvaluĂ© Ă 2. DerniĂšre modification le 18 octobre 2023 Ă 00:02.
Comment l'absence de partage de trait pourrait ĂȘtre une utilisation du principe de Liskov ?
Si j'écris
Et si on applique le principe de Liskov, il n'y a pas de propriĂ©tĂ©s prouvable sur A a appliquer Ă B ou C. Le behavioural subtyping de la mĂȘme façon parle d'un comportement dĂ©fini dans le parent qui doit ĂȘtre respectĂ© dans les enfants.
Tout le principe du
sealed/switchc'est de ne pas faire porter le comportement sur le type. Je suis d'accord pour dire que ce n'est pas un viol du behavioral subtyping ou du principe de Liskov, mais c'est fait en se plaçant hors de leur champ : on retire la propriété prouvable sur le type parent.https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: sealed ?
PostĂ© par barmic 𩩠. En rĂ©ponse au journal La plus belle ligne de code. ĂvaluĂ© Ă 3.
Tu montre bien qu'il y a des recoupements entre les concepts que l'on nomme đ
Non effectivement il ne s'intéresse pas ou peu à l'utilisation, mais je pense qu'il s'agit d'un évitement du principe de Liskov, car l'objectif c'est de retirer des traits du parents et de les implémenter dans le code utilisateur.
Le fait que le code ne compile pas est extrĂȘmement important et il faut vraiment y faire attention. Le type A peut techniquement ĂȘtre dans une bibliothĂšque chargĂ©e dynamiquement par exemple. L'utilisation et l'exposition de ce genre de type est plus risquĂ© que du polymorphisme car l'arbre de type va faire partie du contrat (et pas uniquement le type parent).
En java en tout cas oui. à noter qu'il n'est pas possible de tricher par contre. Sealed est vérifié à la compilation et à l'exécution. La jvm t'interdira de charger une nouvelle sous classe ni vu ni connu en jouant avec le bytecode.
Je n'ai aucun problÚme à utiliser sealed, il y en a déjà un certains nombre dans mon code de prod et je suis impatient de pouvoir enfin utiliser les switch expression avec. Mais je comprends les gens qui sont un peu orthodoxes de la POO qui voient des problÚmes avec cette forme de polymorphisme (il y en a aussi dans le polymorphisme de classe mais ils ne sont pas nouveaux pour eux).
Désolé pour mon commentaire plus bas j'avais oublié de le soumettre
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: sealed ?
PostĂ© par barmic 𩩠. En rĂ©ponse au journal La plus belle ligne de code. ĂvaluĂ© Ă 3.
Comme je le disais plus haut ça viole un principe de substitution (sans parler de Liskov) car le code appelant est conscient de l'ensemble du typage et donc que tu ne peu plus ajouter un sous type sans récrire le code qui utilise ton objet.
Je comprends que Liskov ne s'intĂ©resse qu'Ă la modĂ©lisation et pas Ă comment ils sont utilisĂ©s, mais ici il s'agit de retirer les traits du type pour le mettre dans le code appelant. On peut effectivement dire que ça n'est pas un viol du principe de Liskov, mais c'est une maniĂšre de s'en passer. Dans des cas extrĂȘmes, mais qui ne sont pas difficiles Ă trouver, tu n'a aucun trait dans le type parent.
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: sealed ?
PostĂ© par barmic 𩩠. En rĂ©ponse au journal La plus belle ligne de code. ĂvaluĂ© Ă 5.
Si tu crée un nouveau sous type de A, ta fonction ne compile plus.
Le fais que du code utilisateur soit conscient des sous type de ses paramĂštres (ou de ce qu'il reçoit d'une fonction) empĂȘche la substitution.
On parle de typage et pas de l'état interne des objets donc je dirais que non.
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: sealed ?
PostĂ© par barmic 𩩠. En rĂ©ponse au journal La plus belle ligne de code. ĂvaluĂ© Ă 3.
La classe mÚre qui liste ses classes filles d'une part et parce que c'est globalement fait pour écrire :
Ce qui blesse le cĆur de tout ceux qui expliqueraient (non sans raison) que le polymorphisme c'est bien et qu'il faudrait une mĂ©thode dĂ©crite dans A et implĂ©mentĂ©e dans B et C. Ici le fait qu'une mĂ©thode hors de A, B ou C, cherche Ă dĂ©terminer le type sous-jacent de la rĂ©fĂ©rence a est la violation la plus classique de Liskov.
PrĂ©sentĂ© autrement : en respectant Liskov si tu crĂ©e un sous-type du type T tu devrais pouvoir remplacer n'importe quelle rĂ©fĂ©rence de T par une instance de ton sous-type sans changement du code qui utilise la rĂ©fĂ©rence. Ce n'est Ă©videment pas le cas ici et c'est mĂȘme un effet recherchĂ©.
C'est pour ça qu'il faut manier avec précaution dans un langage comme java qui utilise surtout le polymorphisme de classe et qui commence tout juste à utiliser ce genre de mécanismes (tout le monde appel ça du pattern matching, mais ça n'en est pas en java).
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: et ses serveurs ?
PostĂ© par barmic 𩩠. En rĂ©ponse au lien Le PDG d'HashiCorp prĂ©dit "une Silicon Valley sans logiciel libre". ĂvaluĂ© Ă 2.
Le sens de la phrase c'est : les entreprises de la Silicone Valley ne feront plus de LL pas n'en utiliseront plus.
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: j'ai du mal Ă comprendre un truc ....
PostĂ© par barmic 𩩠. En rĂ©ponse au journal La plus belle ligne de code. ĂvaluĂ© Ă 3.
En erlang les threads userlands sont appelĂ©s process (ouai je trouve pas que ce soit un super nommage) et je pense que ça de ça qu'il parlait donc ça ne devrait pas ĂȘtre aussi impactant.
Oui le nommage de ma fonction à l'arrache n'était pas génial et tu as mieux exprimé que moi ce que je voulais dire par le fait que c'est une question de sémantique.
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: et l'inverse ?
PostĂ© par barmic 𩩠. En rĂ©ponse au lien Le PDG d'HashiCorp prĂ©dit "une Silicon Valley sans logiciel libre". ĂvaluĂ© Ă 3.
Il me semble que l'on a un tropisme Ă ce sujet. La Chine et le BrĂ©sil font beaucoup de choses qu'on ne connaĂźt pas trop. Et pour la Chine ils ont mĂȘme leurs Big tech qui font du libre Ă la marge quand ça les arrange Ă la Google.
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: Rappel
PostĂ© par barmic 𩩠. En rĂ©ponse au lien Le PDG d'HashiCorp prĂ©dit "une Silicon Valley sans logiciel libre". ĂvaluĂ© Ă 6.
Ăa n'est pas un rappel, c'est le sujet de l'article.
Pour ceux qui lisent plus les commentaires que les articles. Le PDG d'Hashicorp rĂ©agi au fait que la Linux Fondation hĂ©berge le fork sous licence MPL de Terraform qui est passĂ© sous BUSL en aoĂ»t dernier. Ăvidement qu'il n'est pas content. La phrase mise en avant vient du fait qu'il dit qu'il n'est que l'une des entreprises qui ont fait ce mouvement et il croit que si le libre « n'Ă©volue pas » tous les acteurs finiront par faire ce mouvement.
Je pense que la question peut tout de mĂȘme ĂȘtre intĂ©ressante posĂ©e autrement :
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: Shell
PostĂ© par barmic 𩩠. En rĂ©ponse au journal La plus belle ligne de code. ĂvaluĂ© Ă 5.
J'ai mis trop de temps pour éditer mon message
Pour moi c'est un peu comme si tu trouve un vert trĂšs joli et que du coup tu repeins TOUT ton logement dans cette couleur du sol au plafond, fenĂȘtres et vaisselles inclue. Il y a des cas oĂč c'est trĂšs Ă©lĂ©gant d'utiliser ce genre de construction, mais quand on l'utilise lĂ oĂč elle n'a pas particuliĂšrement de sens voir qu'elle oblige Ă faire des circonvolutions ça devient moche.
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: Shell
PostĂ© par barmic 𩩠. En rĂ©ponse au journal La plus belle ligne de code. ĂvaluĂ© Ă 2.
J'ai pas compris ce que tu voulais dire.
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: Optional<T>
PostĂ© par barmic 𩩠. En rĂ©ponse au journal La plus belle ligne de code. ĂvaluĂ© Ă 3.
Ăa n'est pas plus vaste, c'est un choix de vouloir continuer Ă avoir une API fluent un peut plus loin que les Stream. Je ne crois pas que le prix en vaille la chandelle. Avoir une API fluent ce n'est pas de la programmation fonctionnelle, ça vient Ă mon avis d'un mĂ©lange : la programmation fonctionnelle ne connaĂźt que des expressions et pas d'instruction et Ă©ventuellement ils ont des monades quand ils ont besoin.
La JSR305 est sympa mĂȘme si elle mĂ©riterait d'avoir un peu plus d'amour (de la part de ces concepteurs et des utilisateurs). Elle a l'avantage d'ĂȘtre utilisable dans bien plus de cas.
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: Optional<T>
PostĂ© par barmic 𩩠. En rĂ©ponse au journal La plus belle ligne de code. ĂvaluĂ© Ă 3.
Bof si c'est pour
findAny()etfindFirst(), ils auraient pu retourner des valeurnullcomme le fait l'API de collection. Ăa me parait moins pire que de se coltiner du code des dĂ©cennies alors qu'on avait dĂ©jĂ planifiĂ© au moment de son Ă©criture qu'elle allait ĂȘtre dĂ©suĂšte. Le plus drĂŽle c'est que vavr utilise dĂ©jĂ ce genre de design avec java 7...Dans 2 ans on aura :
Ouai !...
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: j'ai du mal Ă comprendre un truc ....
PostĂ© par barmic 𩩠. En rĂ©ponse au journal La plus belle ligne de code. ĂvaluĂ© Ă 4.
à moins que ça m'échappe je ne connais pas de langages de programmation commun1 qui ne l'implémentent pas il me semble. Mais il y a 2 maniÚres de faire soit c'est une valeur qui est valide dans tous les types nullables (donc toute références en java, tout pointeur en C/C++, etc) soit c'est un type.
Quand c'est un type généralement le langage permet de créer des types sommes ce qui permet de créer un type « entier ou null » et ça t'oblige à vérifier que c'est un entier avant de pouvoir utiliser ta variable. Je trouve ça plus élégant personnellement.
Je ne classe pas Malbolge comme commun, ni les langages simulant une machine de Turing â©
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: j'ai du mal Ă comprendre un truc ....
PostĂ© par barmic 𩩠. En rĂ©ponse au journal La plus belle ligne de code. ĂvaluĂ© Ă 4.
Null n'est pas un type en java.
Ăa m'embĂȘte supposĂ© trĂšs doctrinal. Ăa dĂ©pend complĂštement de la sĂ©mantique que tu donne. Si je compte la taille d'un message, je peux vouloir considĂ©rer que sa taille est nulle ou valant 0 qu'il s'agisse d'une chaĂźne vide, d'un champ absent ou d'un champ ayant pour valeur null ou undefine si c'est reprĂ©sentĂ© par du json par exemple. Multiplier les chemins d'exĂ©cutions pour ça n'a pas de sens et planter pour relancer le processus est un bug : une valeur nulle n'est pas synonyme d'erreur.
Penser que les choses ont un sens intrinsÚque et que ton modÚle est universel est à mon avis une erreur pas lié au langage ou à la stack utilisée.
Tu peux vouloir Ă©liminer les valeurs null en les reprĂ©sentants dans ton typage et c'est trĂšs bien, tu n'a plus Ă avoir ce genre de garde dans tes fonctions mais c'est pas une absence de programmation dĂ©fensive, elle est dĂ©placĂ©e aux entrĂ©es de ton programme. Mais ça ne me paraĂźt pas pertinent si le langage ne permet pas de l'exprimer. Java ne le permet pas et il me semble qu'erlang non plus toute rĂ©fĂ©rences peuvent ĂȘtre
nilil me semble.https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: j'ai du mal Ă comprendre un truc ....
PostĂ© par barmic 𩩠. En rĂ©ponse au journal La plus belle ligne de code. ĂvaluĂ© Ă 5.
Ăa n'est pas forcĂ©ment un cas exceptionnel.
Tu peux vouloir écrire :
Mais sinon c'est une option Ă prendre en compte : ne rien faire et laisser l'exception arriver. Maintenant que les
NullPointerExceptiondonnent (enfin !) des informations sur ce qui Ă©taitnull. Ăa vaut le coup de laisser faire le langage naturellement.https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: sealed ?
PostĂ© par barmic 𩩠. En rĂ©ponse au journal La plus belle ligne de code. ĂvaluĂ© Ă 6.
Sealed c'est un moyen de contrÎler l'héritage d'une classe ou d'une interface.
Jusqu'à l'arrivée de
sealedon avait le mot cleffinalqui indiquait qu'une classe ne pouvait avoir de fille.sealedpermet d'indiquer la liste exhaustive des filles direct d'une classe. Dans l'exemple au dessus,Optional<T>n'a que 2 soustypePresentetAbsent.Ăa peut ĂȘtre assez dĂ©routant parce que ça contreviens au principe de substitution de Liskov, mais c'est pratique pour certaines choses. Ăa ne doit pas ĂȘtre utilisĂ© pour tout, mais pour des cas oĂč on sait qu'on a un arbre de types limitĂ© qui ne devrait pas Ă©voluer sans que le code qui l'utilise le prenne en compte.
Imaginons (je tire l'exemple de mon chapeau c'est peut ĂȘtre pas un bon exemple), tu veut gĂ©rer une machine Ă Ă©tats finis, mais ça t'arrangerait que l'Ă©tat soit plus qu'une simple valeur (donc pas un enum) par exemple pour aider au debug. Tu peut alors crĂ©er une classe ou une interface et dont tu sais que toutes les filles direct reprĂ©sente un Ă©tat de ta machine.
L'intĂ©rĂȘt c'est de pouvoir utiliser ça avec le pattern matching et les switch expressions, puisque tu va pouvoir manipuler ton Ă©tat tout en garantissant lâexhaustivitĂ© des cas. Si tu ajoute un nouvel Ă©tat c'est un nouveau sous-type et tu devra l'implĂ©menter dans tout les endroits oĂč tu a eu besoin de traiter tes Ă©tats.
Une autre maniĂšre de voir c'est de s'en servir comme un type somme du pauvre. Tu peut crĂ©er un type T qui est soit A, soit B, soit C,... et Ă©crire des fonctions qui sont polymorphiques sur leur paramĂštre (tu prend en paramĂštre un type T et en fonction du sous-type tu rĂ©agi diffĂ©remment). Du pauvre parce que les sous-type ne peuvent pas ĂȘtre arbitraires comme tu le ferait en haskel.
Je suis un peu loquace ?
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: Shell
PostĂ© par barmic 𩩠. En rĂ©ponse au journal La plus belle ligne de code. ĂvaluĂ© Ă 7.
J'aime beaucoup perl pour ça :
et je le reproduit en shell quand le cas se présente en écrivant ma propre méthode
die()https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: Optional<T>
PostĂ© par barmic 𩩠. En rĂ©ponse au journal La plus belle ligne de code. ĂvaluĂ© Ă 4.
Je n'ai jamais compris pourquoi ils ont implĂ©mentĂ© Optional aussi tĂŽt... Ils avaient dĂ©jĂ l'idĂ©e de ce qui allait se faire et aujourd'hui je trouve que c'est une classe qui utilise mal le langage. Ă mon avis Optional devrait ĂȘtre une interface sealed implĂ©mentĂ©e par un record disons Present et une classe (voir un singleton) Absent. Il ne devrait pas y avoir de mĂ©thode get() et l'interface ne devrait porter que le mĂ©thodes qui en font une monade. Tu aurais une classe dont aucune des mĂ©thodes ne peut lever de NPE et au lieu d'avoir tous les analyseurs statiques qui doivent tenter de vĂ©rifier si tu utilise get() dans un endroit sĂ»r ce serait vĂ©rifiĂ© dans le langage par le typage (et pour le quel l'inlining peut rendre ton code efficace). Et tu n'aurait plus besoin de la mĂ©thode get() grĂące au pattern matching (qui n'en est pas vraiment un en java). On va garder encore 20 ans une classe qui aura finalement rapidement Ă©tait hors de ce que Java peut produire.
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: https ?
PostĂ© par barmic 𩩠. En rĂ©ponse au lien Perdu.com est mort. ĂvaluĂ© Ă 6.
Pour moi aussi c'était une référence en non https, mais je pense plutÎt que le domaine a était perdu et que DreamHost fais des redirections https dans ce genre de cas.
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: Taxe sur les transactions financiĂšres
PostĂ© par barmic 𩩠. En rĂ©ponse au lien HĂŽpital-Le gouvernement veut encore gratter 600 millions (et surtt, on applaudit bien sur le balcon). ĂvaluĂ© Ă 2.
Tu compte l'argent en mille romain ? :p
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: Tout est dans les détails
PostĂ© par barmic 𩩠. En rĂ©ponse au lien Arangodb veut passer son code sous BUSL 1. ĂvaluĂ© Ă 3.
Il n'y en a pas besoin. Ils ne peuvent pas vendre de tĂ©lĂ©phone avec les "services Google" (ou gapps). Ils n'ont mĂȘme pas le droit de vendre des tĂ©lĂ©phones sous AOSP et sous Android d'aprĂšs ce que j'avais lu de fairephone. Comme toutes les grosses boites, Google sait verrouiller sa clientĂšle.
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll