Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2098 connectés 

 

Sujet(s) à lire :
    - Who's who@Programmation
 

 Mot :   Pseudo :  
  Aller à la page :
 
 Page :   1  2  3  4  5  ..  24665  24666  24667  ..  27197  27198  27199  27200  27201  27202
Auteur Sujet :

[blabla@olympe] Le topic du modo, dieu de la fibre et du monde

n°2413520
___alt
Posté le 29-03-2022 à 17:05:19  profilanswer
 

Reprise du message précédent :

el muchacho a écrit :


Mais c'est quoi le problème avec Lombok ?

 

Tu rajoutes une adhérence à une lib invasive pour résoudre ce qui constitue essentiellement un non-problème dans ta base de code, sauf si ton métier au quotidien c'est d'écrire des toString() et des paires de getter/setter, auquel cas il faut quand même sérieusement revoir sa façon de développer.
Je rappelle qu'une dépendance supplémentaire, ça se maintient, c'est potentiellement un problème en cas de montée de version de Java (surtout pour celles qui font de la génération de bytecode et pas mal d'utilisateurs de Lombok ont été emmerdés pour le passage à Java 8 ou Java 11) et il est parfois coûteux de s'en séparer.

Message cité 1 fois
Message édité par ___alt le 29-03-2022 à 17:20:23

---------------
TRIPS RIGHT BUNCH F SHUTTLE TOM AND JERRY RIGHT YELLOW
mood
Publicité
Posté le 29-03-2022 à 17:05:19  profilanswer
 

n°2413521
damtoul
Un boulot!
Posté le 29-03-2022 à 17:08:33  profilanswer
 

Et meme si tu chies des getters setters equals hashC9de au quotidien eclipse te fait ca en 5s et intellij en 3s avec du code encore plus propre.

 

Je plussoie sur les records, je savoure d'avance.
Un tour sur SOF sur lombok pro/con ça donne des frissons.  :O


---------------
Pronouns: Les/Vals/Euses
n°2413522
ratibus
Posté le 29-03-2022 à 17:10:55  profilanswer
 

Kenshineuh a écrit :

Après ça reste que des visites. Quand tu auras plein d’offres tu pourras voir mais là pour moi ça veut rien dire.


On a le droit d'être content sur la première étape non ? :D
 

gfive a écrit :

Joli,
 
Par contre quitte à avoir rangé la chambre du petit, t'aurais pu planquer l'énorme sextoy dans le coin de la suite parentale (ou de la chambre d'amis : celle avec le dreamcatcher au dessus du lit 2 places)


T'es con :D

Hermes le Messager a écrit :


 
Au contraire.  [:bool_de_gom]  
 
Rien de tel que de stimuler l'imagination de l'acheteur en lui faisant croire qu'il retrouvera une vie sexuelle riche dans cet appart.  [:ronfl]


Appartement fertile :o

n°2413523
Kenshineuh
Posté le 29-03-2022 à 17:11:42  profilanswer
 

ratibus a écrit :


On a le droit d'être content sur la première étape non ? :D


 
Ah mais carrément, je te le souhaite. L'appart a l'air vraiment cool. :jap:

n°2413525
Flaie
Posté le 29-03-2022 à 17:36:03  profilanswer
 

C'est à dire qu'equals et hashcode c'est tout de même un minimum important, néanmoins ça peut être automatisé, tout comme les getters et setters, du code inutile à checkin dans un repository 99% du temps.
 
Les records sont là et font la même chose qu'un @Value de Lombok à la différence des accessors versus getters et d'autres choses plus low-level.
 
Mais Lombok possède apporte plein de choses, ne serait-ce que les builders, qui va s'amuser à en écrire à la main ? Pas moi. Les records ne supportent d'ailleurs pas les builders en standard, il faut passer par des librairies. Autre truc que j'utilises tout le temps @Log/@Slf4j et consort.  
 
Bien sur y'a des downsides, par exemple equals/hashcode sur des entités JPA, faire gaffe au lazy encore sur JPA, l'ordre de paramètres de même type générés pour des constructeurs si on les réorganise ça peut foutre la grouille, et d'autres encore. N'importe quel tooling dans les mains de quelqu'un qui ne sait pas s'en servir peut être dangereux.
 
Autre problème qui peut arriver quand on a plusieurs annotations processor, genre MapStruct, l'ordre peut parfois être délicat, de même Lombok + AspectJ,
 
Est-ce que Lombok est utile et que ça vaut le coup ? chacun à sa sensibilité, moi je pense que oui, dans tous les cas ce n'est pas de la merde, loin de là, il a servi son temps, j'espère qu'on pourra s'en passer le plus tôt sera le mieux, mais y'a tellement de code base avec des architectures tellement WTF et des décisions entreprise cargo cult de merde, qu'il faut limite mieux être au chômage que bosser sans.
 
Mon seul vrai concern est à propos de Lombok qui un jour pourra peut-être plus accéder aux internals de futurs JDK pour faire sa tambouille sans downgrader un level de sécurité qui sera peut-être mis en place, mais je pense qu'on a le temps de voir venir un minimum. Le jour là ce sera la baise, ou alors les gens devront mettre une grosse exception dans un fichier de config java ou autre, et là ça risque de ne plus passer.

n°2413526
gfive
Posté le 29-03-2022 à 17:51:50  profilanswer
 

___alt a écrit :


 
Tu rajoutes une adhérence à une lib invasive pour résoudre ce qui constitue essentiellement un non-problème dans ta base de code, sauf si ton métier au quotidien c'est d'écrire des toString() et des paires de getter/setter, auquel cas il faut quand même sérieusement revoir sa façon de développer.
Je rappelle qu'une dépendance supplémentaire, ça se maintient, c'est potentiellement un problème en cas de montée de version de Java (surtout pour celles qui font de la génération de bytecode et pas mal d'utilisateurs de Lombok ont été emmerdés pour le passage à Java 8 ou Java 11) et il est parfois coûteux de s'en séparer.


 
+1
 

Flaie a écrit :

C'est à dire qu'equals et hashcode c'est tout de même un minimum important, néanmoins ça peut être automatisé,


 
Justement non: si tu peux ne pas réfléchir à l'implémentation de Equals/hashCode, alors dans 99.99% des cas tu peux t'en passer.
 

Flaie a écrit :


 tout comme les getters et setters, du code inutile à checkin dans un repository 99% du temps.
 
Les records sont là et font la même chose qu'un @Value de Lombok à la différence des accessors versus getters et d'autres choses plus low-level.
 
 
Mais Lombok possède apporte plein de choses, ne serait-ce que les builders, qui va s'amuser à en écrire à la main ? Pas moi. Les records ne supportent d'ailleurs pas les builders en standard, il faut passer par des librairies. Autre truc que j'utilises tout le temps @Log/@Slf4j et consort.  
 
 
[quotemsg=2413525,986604,159627]
Bien sur y'a des downsides, par exemple equals/hashcode sur des entités JPA, faire gaffe au lazy encore sur JPA, l'ordre de paramètres de même type générés pour des constructeurs si on les réorganise ça peut foutre la grouille, et d'autres encore. N'importe quel tooling dans les mains de quelqu'un qui ne sait pas s'en servir peut être dangereux.
 
Autre problème qui peut arriver quand on a plusieurs annotations processor, genre MapStruct, l'ordre peut parfois être délicat, de même Lombok + AspectJ,
 
Est-ce que Lombok est utile et que ça vaut le coup ? chacun à sa sensibilité, moi je pense que oui, dans tous les cas ce n'est pas de la merde, loin de là, il a servi son temps, j'espère qu'on pourra s'en passer le plus tôt sera le mieux, mais y'a tellement de code base avec des architectures tellement WTF et des décisions entreprise cargo cult de merde, qu'il faut limite mieux être au chômage que bosser sans.
 
Mon seul vrai concern est à propos de Lombok qui un jour pourra peut-être plus accéder aux internals de futurs JDK pour faire sa tambouille sans downgrader un level de sécurité qui sera peut-être mis en place, mais je pense qu'on a le temps de voir venir un minimum. Le jour là ce sera la baise, ou alors les gens devront mettre une grosse exception dans un fichier de config java ou autre, et là ça risque de ne plus passer.


 
Perso j'écris mes builders quand j'en ai besoin, ça me dérange pas plus que ça. Ca permet aussi accessoirement de mettre de la logique de validation dedans.
 
Au passage,la diff entre un annotation processor "classique" à la MapStruct (que j'aime pas trop non plus parce que dès que ça devient complexe tu passes plus de temps à le configurer que tu n'en aurais passé à écrire les mappers à la main), c'est que Lombok ne crache pas de code
 
Donc il casse la navigation dans le code des IDE. Et rien que ça pour moi c'est un chiffon rouge.


---------------
Tous les sud africains sont ségrégationistes, à part Ted. (P. Desproges)
n°2413527
el muchach​o
Comfortably Numb
Posté le 29-03-2022 à 18:00:42  profilanswer
 

damtoul a écrit :

Et meme si tu chies des getters setters equals hashC9de au quotidien eclipse te fait ca en 5s et intellij en 3s avec du code encore plus propre.
 


ouai mais c'est moche. Ca reste du boilerplate.

 

L'usage que j'en ai, c'est pour tout ce qui est interface de sérialisation avec une BD ou du JSON ou je ne sais quoi qui est essentiellement des classes de données (DTO, DAO, blabla), tout ce genre de truc. C'est effectivement pas exactement difficile avec les générateurs de code des IDE, mais ça fait quand même plein de boilerplate là où une seule annotation @Data au niveau de la classe fait le job. Tu vois immédiatement tes données membres et pas de bordel autour à te demander si par hasard on n'aurait pas oublié un setter ou autre.
Pour le vrai code métier roulé sous les aisselles, je reconnais que c'est pas indispensable et que ça allonge les temps de build de 2 secondes.
 

Citation :


Je plussoie sur les records, je savoure d'avance.
Un tour sur SOF sur lombok pro/con ça donne des frissons.  :O


Je veux bien voir.

Message cité 1 fois
Message édité par el muchacho le 29-03-2022 à 18:25:48

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°2413528
Flaie
Posté le 29-03-2022 à 18:09:07  profilanswer
 

gfive a écrit :


Justement non: si tu peux ne pas réfléchir à l'implémentation de Equals/hashCode, alors dans 99.99% des cas tu peux t'en passer.


Excuse moi de te le dire, mais tu dis n'importe quoi.
Tu ne peux pas t'en passer, à moins que tu n'utilises jamais de collections peut-être.

 

Simple exemple:

Code :
  1. import java.util.List;
  2. import java.util.Objects;
  3.  
  4. class Person {
  5.    final String firstName;
  6.    final String lastName;
  7.  
  8.    public Person(String firstName, String lastName) {
  9.        this.firstName = firstName;
  10.        this.lastName = lastName;
  11.    }
  12. }
  13.  
  14. class Pet {
  15.    final String name;
  16.    final int age;
  17.  
  18.    public Pet(String name, int age) {
  19.        this.name = name;
  20.        this.age = age;
  21.    }
  22.  
  23.  
  24.    // généré par IntelliJ
  25.    @Override
  26.    public boolean equals(Object o) {
  27.        if (this == o) return true;
  28.        if (o == null || getClass() != o.getClass()) return false;
  29.        Pet animal = (Pet) o;
  30.        return age == animal.age && Objects.equals(name, animal.name);
  31.    }
  32.  
  33.    @Override
  34.    public int hashCode() {
  35.        return Objects.hash(name, age);
  36.    }
  37. }
  38.  
  39. public class Foo {
  40.  
  41.    public static void main(String[] args) {
  42.        var persons = List.of(new Person("g", "five" ), new Person("foo", "bar" ));
  43.        System.out.println(persons.contains(new Person("g", "five" )));
  44.  
  45.        var animals = List.of(new Pet("cat", 10), new Pet("doggo", 5));
  46.        System.out.println(animals.contains(new Pet("doggo", 5)));
  47.    }
  48. }
 

Output:

Code :
  1. false
  2. true


 [:didierlachance:5]

 

Cela fonctionne de même pour les autres collections comme les Set, les Map etc.

 

Du coup à choisir je préfère :

 
Code :
  1. import lombok.Value;
  2.  
  3. import java.util.List;
  4.  
  5. @Value
  6. class Person {
  7.    String firstName;
  8.    String lastName;
  9. }
  10.  
  11. @Value
  12. class Pet {
  13.    String name;
  14.    int age;
  15. }
  16.  
  17. public class Foo {
  18.  
  19.    public static void main(String[] args) {
  20.        var persons = List.of(new Person("g", "five" ), new Person("foo", "bar" ));
  21.        System.out.println(persons.contains(new Person("g", "five" )));
  22.  
  23.        var animals = List.of(new Pet("cat", 10), new Pet("doggo", 5));
  24.        System.out.println(animals.contains(new Pet("doggo", 5)));
  25.    }
  26. }
 

Et l'output qui va avec:

 
Code :
  1. true
  2. true
 

Mais pour ce point nous sommes d'accord qu'utiliser des records aurait fait la même chose et alors je préfère encore les utiliser si disponible:

 
Code :
  1. import java.util.List;
  2.  
  3. record Person(String firstName, String lastName) {}
  4. record Pet(String name, int age) {}
  5.  
  6. public class Foo {
  7.  
  8.    public static void main(String[] args) {
  9.        var persons = List.of(new Person("g", "five" ), new Person("foo", "bar" ));
  10.        System.out.println(persons.contains(new Person("g", "five" )));
  11.  
  12.        var animals = List.of(new Pet("cat", 10), new Pet("doggo", 5));
  13.        System.out.println(animals.contains(new Pet("doggo", 5)));
  14.    }
  15. }
 

Et l'output qui va avec:

 
Code :
  1. true
  2. true
 
gfive a écrit :

 

Perso j'écris mes builders quand j'en ai besoin, ça me dérange pas plus que ça. Ca permet aussi accessoirement de mettre de la logique de validation dedans.

 

Au passage,la diff entre un annotation processor "classique" à la MapStruct (que j'aime pas trop non plus parce que dès que ça devient complexe tu passes plus de temps à le configurer que tu n'en aurais passé à écrire les mappers à la main), c'est que Lombok ne crache pas de code

 

Donc il casse la navigation dans le code des IDE. Et rien que ça pour moi c'est un chiffon rouge.


Tu peux également avoir de la validation avec un builder lombok.

 

Mais même sans ça, entre ceci:

 
Code :
  1. @ToString
  2. @Builder
  3. class Person {
  4.    String firstName;
  5.    String lastName;
  6. }
 

et cela

 
Code :
  1. class Person {
  2.    String firstName;
  3.    String lastName;
  4.  
  5.    Person(String firstName, String lastName) {
  6.        this.firstName = firstName;
  7.        this.lastName = lastName;
  8.    }
  9.  
  10.    // /!\ le code qui suit a une très très grosse valeur ajoutée, écrivez-le vous même
  11.    public static PersonBuilder builder() {
  12.        return new PersonBuilder();
  13.    }
  14.  
  15.    public String toString() {
  16.        return "Person(firstName=" + this.firstName + ", lastName=" + this.lastName + " )";
  17.    }
  18.  
  19.    public static class PersonBuilder {
  20.        private String firstName;
  21.        private String lastName;
  22.  
  23.        PersonBuilder() {
  24.        }
  25.  
  26.        public PersonBuilder firstName(String firstName) {
  27.            this.firstName = firstName;
  28.            return this;
  29.        }
  30.  
  31.        public PersonBuilder lastName(String lastName) {
  32.            this.lastName = lastName;
  33.            return this;
  34.        }
  35.  
  36.        public Person build() {
  37.            return new Person(firstName, lastName);
  38.        }
  39.    }
  40. }

 

Pour moi la question elle est vite répondue :o

 

De même pour MapStruct, quel est l'intérêt d'ecrire à la main du code de mapping par exemple pour tout ce qui est plomberie DTO etc ? Zéro, d'après moi, mais c'est toi qui écrit le code, pas moi.

 

Concernant la navigation via Lombok, je ne sais pas quel IDE tu utilises, mais ça fonctionne dans IntelliJ depuis plus de 8 ans, et encore je suis sympa je suis quasiment certain que ça fonctionnait bien bien avant ça , tu click sur un setter ça va sur le field, tu renommes un field ça renomme les setter générés par lombok. Bref pour moi c'est une légende urbaine :)

Message cité 1 fois
Message édité par Flaie le 29-03-2022 à 18:21:36
n°2413529
damtoul
Un boulot!
Posté le 29-03-2022 à 18:20:34  profilanswer
 

Interessant vos arguments.   :jap:


---------------
Pronouns: Les/Vals/Euses
n°2413530
Kenshineuh
Posté le 29-03-2022 à 18:22:37  profilanswer
 

Dès qu'il y a un nouveau ça parle dev une journée et après on en revient au vrai sujet de la vie. :o

mood
Publicité
Posté le 29-03-2022 à 18:22:37  profilanswer
 

n°2413531
___alt
Posté le 29-03-2022 à 18:23:11  profilanswer
 

el muchacho a écrit :

ouai mais c'est moche. Ca reste du boilerplate.


 
Ouais enfin si jamais tu supportes pas le boilerplate, faire du Java c'était une erreur majeure :D
 
Pour tout ce qui est equals/hashcode, je génère ça via l'IDE, c'est pas beaucoup plus compliqué.
Après j'entends bien que Lombok semble apporter de la valeur à certains, je sais que j'ai un biais contre le sucre syntaxique tierce partie, c'est aussi un truc chiant dans le monde Scala (salut cats !).
 


---------------
TRIPS RIGHT BUNCH F SHUTTLE TOM AND JERRY RIGHT YELLOW
n°2413532
el muchach​o
Comfortably Numb
Posté le 29-03-2022 à 18:23:25  profilanswer
 

Je me disais aussi que c'était louche, le post de gfive. :o


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°2413533
Flaie
Posté le 29-03-2022 à 18:26:41  profilanswer
 

___alt a écrit :

 

Ouais enfin si jamais tu supportes pas le boilerplate, faire du Java c'était une erreur majeure :D

 

Pour tout ce qui est equals/hashcode, je génère ça via l'IDE, c'est pas beaucoup plus compliqué.
Après j'entends bien que Lombok semble apporter de la valeur à certains, je sais que j'ai un biais contre le sucre syntaxique tierce partie, c'est aussi un truc chiant dans le monde Scala (salut cats !).

 



Puisque c'est évitable, non.

 

Effectivement, mais c'est du code que tu dois commit, voir dans ton IDE, ça pollue la vision de l'essentiel. Et de plus faut pas oublier de regénérer le equals/hashcode si tu ajoutes des champs, c'est tout autant error prone qu'un @EqualsAndHashCode qui prendrait un nouveau champ dont tu ne voulais pas (typiquement le cas pour les entités JPA où tu ne veux généralement que le champ id) :jap:


Message édité par Flaie le 29-03-2022 à 18:27:35
n°2413534
Flaie
Posté le 29-03-2022 à 18:28:04  profilanswer
 

Kenshineuh a écrit :

Dès qu'il y a un nouveau ça parle dev une journée et après on en revient au vrai sujet de la vie. :o


Y'a pas quelqu'un qui fait des travaux ? :lol:

n°2413535
gfive
Posté le 29-03-2022 à 18:36:36  profilanswer
 

Flaie a écrit :


Excuse moi de te le dire, mais tu dis n'importe quoi.
Tu ne peux pas t'en passer, à moins que tu n'utilises jamais de collections peut-être.

 

Simple exemple:

Code :
  1. import java.util.List;
  2. import java.util.Objects;
  3.  
  4. class Person {
  5. final String firstName;
  6. final String lastName;
  7.  
  8. public Person(String firstName, String lastName) {
  9. this.firstName = firstName;
  10. this.lastName = lastName;
  11. }
  12. }
  13.  
  14. class Pet {
  15. final String name;
  16. final int age;
  17.  
  18. public Pet(String name, int age) {
  19. this.name = name;
  20. this.age = age;
  21. }
  22.  
  23.  
  24. // généré par IntelliJ
  25. @Override
  26. public boolean equals(Object o) {
  27. if (this == o) return true;
  28. if (o == null || getClass() != o.getClass()) return false;
  29. Pet animal = (Pet) o;
  30. return age == animal.age && Objects.equals(name, animal.name);
  31. }
  32.  
  33. @Override
  34. public int hashCode() {
  35. return Objects.hash(name, age);
  36. }
  37. }
  38.  
  39. public class Foo {
  40.  
  41. public static void main(String[] args) {
  42. var persons = List.of(new Person("g", "five" ), new Person("foo", "bar" ));
  43. System.out.println(persons.contains(new Person("g", "five" )));
  44.  
  45. var animals = List.of(new Pet("cat", 10), new Pet("doggo", 5));
  46. System.out.println(animals.contains(new Pet("doggo", 5)));
  47. }
  48. }
 

Output:

Code :
  1. false
  2. true


[:didierlachance:5]

 

Cela fonctionne de même pour les autres collections comme les Set, les Map etc.

 

Du coup à choisir je préfère :

 
Code :
  1. import lombok.Value;
  2.  
  3. import java.util.List;
  4.  
  5. @Value
  6. class Person {
  7. String firstName;
  8. String lastName;
  9. }
  10.  
  11. @Value
  12. class Pet {
  13. String name;
  14. int age;
  15. }
  16.  
  17. public class Foo {
  18.  
  19. public static void main(String[] args) {
  20. var persons = List.of(new Person("g", "five" ), new Person("foo", "bar" ));
  21. System.out.println(persons.contains(new Person("g", "five" )));
  22.  
  23. var animals = List.of(new Pet("cat", 10), new Pet("doggo", 5));
  24. System.out.println(animals.contains(new Pet("doggo", 5)));
  25. }
  26. }
 

Et l'output qui va avec:

 
Code :
  1. true
  2. true
 

Mais pour ce point nous sommes d'accord qu'utiliser des records aurait fait la même chose et alors je préfère encore les utiliser si disponible:

 
Code :
  1. import java.util.List;
  2.  
  3. record Person(String firstName, String lastName) {}
  4. record Pet(String name, int age) {}
  5.  
  6. public class Foo {
  7.  
  8. public static void main(String[] args) {
  9. var persons = List.of(new Person("g", "five" ), new Person("foo", "bar" ));
  10. System.out.println(persons.contains(new Person("g", "five" )));
  11.  
  12. var animals = List.of(new Pet("cat", 10), new Pet("doggo", 5));
  13. System.out.println(animals.contains(new Pet("doggo", 5)));
  14. }
  15. }
 

Et l'output qui va avec:

 
Code :
  1. true
  2. true
 


 
Flaie a écrit :


Tu peux également avoir de la validation avec un builder lombok.

 

Mais même sans ça, entre ceci:

 
Code :
  1. @ToString
  2. @Builder
  3. class Person {
  4. String firstName;
  5. String lastName;
  6. }
 

et cela

 
Code :
  1. class Person {
  2. String firstName;
  3. String lastName;
  4.  
  5. Person(String firstName, String lastName) {
  6. this.firstName = firstName;
  7. this.lastName = lastName;
  8. }
  9.  
  10. // /!\ le code qui suit a une très très grosse valeur ajoutée, écrivez-le vous même
  11. public static PersonBuilder builder() {
  12. return new PersonBuilder();
  13. }
  14.  
  15. public String toString() {
  16. return "Person(firstName=" + this.firstName + ", lastName=" + this.lastName + " )";
  17. }
  18.  
  19. public static class PersonBuilder {
  20. private String firstName;
  21. private String lastName;
  22.  
  23. PersonBuilder() {
  24. }
  25.  
  26. public PersonBuilder firstName(String firstName) {
  27. this.firstName = firstName;
  28. return this;
  29. }
  30.  
  31. public PersonBuilder lastName(String lastName) {
  32. this.lastName = lastName;
  33. return this;
  34. }
  35.  
  36. public Person build() {
  37. return new Person(firstName, lastName);
  38. }
  39. }
  40. }

 

Pour moi la question elle est vite répondue :o

 

De même pour MapStruct, quel est l'intérêt d'ecrire à la main du code de mapping par exemple pour tout ce qui est plomberie DTO etc ? Zéro, d'après moi, mais c'est toi qui écrit le code, pas moi.

 

Concernant la navigation via Lombok, je ne sais pas quel IDE tu utilises, mais ça fonctionne dans IntelliJ depuis plus de 8 ans, et encore je suis sympa je suis quasiment certain que ça fonctionnait bien bien avant ça , tu click sur un setter ça va sur le field, tu renommes un field ça renomme les setter générés par lombok. Bref pour moi c'est une légende urbaine :)

 


Sur le equals/hashcode de ta classe, ok, mais dès qu'on est dans le domaine de la persistance ça ne marche plus.

 

Parce que l'id entre en jeu, et il definit l'identité de ton objet.
Donc ton contains(new Pet(x,y)) répondra toujours faux si ta collection vient de la DB, mais true si ta collection vient d'un mapping.

 

Donc bon, je pense que sur le fond du fond on est a peu près d'accord sur un truc : equals, hashcode, et dans une moindre mesure tostring, c'est des trucs sensibles, importants, qui ne doivent pas être pris a la légère.
Or je constate que la plupart des devs qui utilisent Lombok le font de la manière la plus con qui soit, en collant un @Data ou un @Value partout, en définissant des égalités métier dans equals alors que tu devrais plutôt avoir des méthodes dédiées pour ça (d'abord parce que les modèles métier sont pas nécessairement en correspondance 1:1 avec le(s) modèles techniques, surtout côté persistance.

 

Je préfère voir un dev perdre du temps et se poser qques questions sur ce qu'il fait que de le voir en gagner au moment du dev mais pas piger la moitié du fonctionnement de son code. [:spamafote]

 

Quand au mapping, j'avoue je j'en fais de moins en moins.
J'utilise la config de  Jackson (des serializers/deserializrs dédiés, des views et des mixins) pour les cas où le Json ressemble pas au modèle métier,. Parce que ai final, quand tu mappes entité ->modele->dto et que ensuite tu serialize le dto en Json, je trouve que ça fait beaucoup d'étapes


---------------
Tous les sud africains sont ségrégationistes, à part Ted. (P. Desproges)
n°2413536
hephaestos
Sanctis Recorda, Sanctis deus.
Posté le 29-03-2022 à 18:45:16  profilanswer
 

Pendant qu'on est sur les outils dont on doute de la valeur qu'ils apportent, il y en a ici qui a un avis sur NgRx ? J'arrive pas à arriver à trouver une bonne raison de le garder...

n°2413537
Flaie
Posté le 29-03-2022 à 18:46:06  profilanswer
 

gfive a écrit :


 
 
Sur le equals/hashcode de ta classe, ok, mais dès qu'on est dans le domaine de la persistance ça ne marche plus.
 
Parce que l'id entre en jeu, et il definit l'identité de ton objet.
Donc ton contains(new Pet(x,y)) répondra toujours faux si ta collection vient de la DB, mais true si ta collection vient d'un mapping.  
 
Donc bon, je pense que sur le fond du fond on est a peu près d'accord sur un truc : equals, hashcode, et dans une moindre mesure tostring, c'est des trucs sensibles, importants, qui ne doivent pas être pris a la légère.  
Or je constate que la plupart des devs qui utilisent Lombok le font de la manière la plus con qui soit, en collant un @Data ou un @Value partout, en définissant des égalités métier dans equals alors que tu devrais plutôt avoir des méthodes dédiées pour ça (d'abord parce que les modèles métier sont pas nécessairement en correspondance 1:1 avec le(s) modèles techniques, surtout côté persistance.
 
Je préfère voir un dev perdre du temps et se poser qques questions sur ce qu'il fait que de le voir en gagner au moment du dev mais pas piger la moitié du fonctionnement de son code. [:spamafote]
 
Quand au mapping, j'avoue je j'en fais de moins en moins.
J'utilise la config de  Jackson (des serializers/deserializrs dédiés, des views et des mixins) pour les cas où le Json ressemble pas au modèle métier,. Parce que ai final, quand tu mappes entité ->modele->dto et que ensuite tu serialize le dto en Json, je trouve que ça fait beaucoup d'étapes  


Non pour les entités tu fais fausse route, le seul point d'ancrage pour ton equals et hash code est l'identifiant, donc tu le trouveras également dans la liste de tes mapping sur cette base alors que sans redéfinir equals et hashcode tu ne me retrouvera pas. C'est ta seule source de vérité pour savoir si une collection contient une entité persistee, l'id. Et c'est bien pour ça qu'on dit de ne pas utiliser @Data pour des entités sauf à faire ça proprement avec @EqualsAndHashCode(of="id" )
 
comme je disais lombok est un outil tu peux mal t'en servir après tout j'ai l'impression que les rêve ont déjà du mal avec les basics du langage, le prob est ah niveau de l'humain pas de l'outil.
 
concernant les mixins de jsonviewer pas d'avis ça peut vite devenir compliqué également à configurer, et de toute façon c'est pas une solution hyper pratique quand on fait du schéma first plutôt que du code first par exemple pour des API.

n°2413538
Flaie
Posté le 29-03-2022 à 18:47:57  profilanswer
 

hephaestos a écrit :

Pendant qu'on est sur les outils dont on doute de la valeur qu'ils apportent, il y en a ici qui a un avis sur NgRx ? J'arrive pas à arriver à trouver une bonne raison de le garder...


j'aime bien redux c'est clair et bien séparé mais c'est très complexe pour des petites app.  
 
À la COGIP la on a une app qui a grossit les devs voulaient pas partir sur redux ils s'en mordent les couilles à devoir gérer eux même des co effect, des sagas etc à la main

n°2413539
hephaestos
Sanctis Recorda, Sanctis deus.
Posté le 29-03-2022 à 18:50:29  profilanswer
 

Flaie a écrit :


j'aime bien redux c'est clair et bien séparé mais c'est très complexe pour des petites app.

 

À la COGIP la on a une app qui a grossit les devs voulaient pas partir sur redux ils s'en mordent les couilles à devoir gérer eux même des co effect, des sagas etc à la main


Je sais pas ce que c'est, tu as des exemples ?

Message cité 1 fois
Message édité par hephaestos le 29-03-2022 à 18:50:47
n°2413540
Flaie
Posté le 29-03-2022 à 18:53:55  profilanswer
 

hephaestos a écrit :


Je sais pas ce que c'est, tu as des exemples ?


euh la sur le tel à la salle de sport entre deux répétitions mais en gros lancer des requêtes qui en appellent d'autres (des actions dans le concept redux). Redux s'occupe d'ordonnancer les promises failure potentiellement multiple etc, à la main c'est la merde a coup de Promise.all sans compter le fait que la réduction peut arriver dans un ordre différent et être sub optimale  
 
sur l'ordinateur je peux te montrer mieux
 
mais principalement moi redux me plaît pour le cadre et la séparation qu'il donne, et l'unique source of truth des données, sans compter que la réduction peut être écrite succinctement

Message cité 1 fois
Message édité par Flaie le 29-03-2022 à 18:57:19
n°2413541
koskoz
They see me trollin they hatin
Posté le 29-03-2022 à 18:58:29  profilanswer
 

Dion a écrit :

Je pense que koskoz parlait de loc, où c'est probablement encore plus rapide car moins d'enjeu.

 

Et j'ai justement visité bien plus d'appartements que ça, avec des agents immo qui salivaient sur le dossier avant d'avoir le retour de leurs services juridiques :whistle:

 

T'essayes de nous dire que tu gagnes plus d'un ratibus ? [:kiki]


---------------
Twitter
n°2413542
Kenshineuh
Posté le 29-03-2022 à 18:58:57  profilanswer
 

Flaie a écrit :


j'aime bien redux c'est clair et bien séparé mais c'est très complexe pour des petites app.

 

À la COGIP la on a une app qui a grossit les devs voulaient pas partir sur redux ils s'en mordent les couilles à devoir gérer eux même des co effect, des sagas etc à la main

 

Pour avoir utilisé par mal de gestionnaire de State (Redux, MobX et Reaclette :sol: ), je reviendrais jamais sur Redux. Ce truc complexifie le code pour quedal, MobX fait aussi bien.

Message cité 1 fois
Message édité par Kenshineuh le 29-03-2022 à 19:05:41
n°2413543
Flaie
Posté le 29-03-2022 à 19:02:53  profilanswer
 

Kenshineuh a écrit :


 
Pour avoir utilisé par mal de gestionnaire de State (Redux, MobX et maintenant le notre en interne), je reviendrais jamais sur Redux. Ce truc complexifie le code pour quedal, MobX fait aussi bien.


Le simple fait que le store mobx soit mutable c'est un big no pour moi, je suis pas fan des observable, le debugging était à des années lumières de redux la dernière fois que j'ai testé, et c'est pas pure, désolé mais mon petit cœur fait en clojure pleure des larmes de sang :(

n°2413544
Kenshineuh
Posté le 29-03-2022 à 19:05:08  profilanswer
 

Le debug est casse couille en effet. Mais mnt doit y'avoir du mieux je pense. Ou au moins un gestionnaire de state convenable par rapport à tous ces ancêtres.

n°2413545
Flaie
Posté le 29-03-2022 à 19:06:34  profilanswer
 

Kenshineuh a écrit :

Le debug est casse couille en effet. Mais mnt doit y'avoir du mieux je pense. Ou au moins un gestionnaire de state convenable par rapport à tous ces ancêtres.


redux roi du game sur ce point précis, predictable, time travel, pure.  
 
truc correct vu la sensibilité, je pars pas pour moins bien, ce qui est le cas de mobx pour moi :p

n°2413546
Dion
Acceuil
Posté le 29-03-2022 à 19:07:48  profilanswer
 

koskoz a écrit :


 
T'essayes de nous dire que tu gagnes plus d'un ratibus ? [:kiki]


Non, mais par contre quand tu visites des clapiers de la taille de sa terrasse avec des revenus présentés sans couverture sociale, retraite et sécu, ça fait vite de gros multiples de loyers.  
Bon par contre on est pas des bêtes, donc on est sur de la superhuman à double compartiment :o


---------------
It is not called show art
n°2413547
gfive
Posté le 29-03-2022 à 19:07:54  profilanswer
 

Flaie a écrit :


Non pour les entités tu fais fausse route, le seul point d'ancrage pour ton equals et hash code est l'identifiant, donc tu le trouveras également dans la liste de tes mapping sur cette base alors que sans redéfinir equals et hashcode tu ne me retrouvera pas. C'est ta seule source de vérité pour savoir si une collection contient une entité persistee, l'id. Et c'est bien pour ça qu'on dit de ne pas utiliser @Data pour des entités sauf à faire ça proprement avec @EqualsAndHashCode(of="id" )

 

Bah si tu ne met que l'id dans equals/hashcode dans les entités, tu ne peux pas t'en servir comme méthode d'égalité métier.

 

Et du coup, si l'instance que tu as pour comparer vient de l'entitymanager et qu'elle a le même id, alors en fait, ben c'est la même instance, et le equals par défaut marche .

 

Si l'instance ne vient pas de l'entitymanager, elle n'a pas d'id, a moins de le coller toi même dedans a la construction.
Si c'est un id métier alors ok
Si c'est une valeur de séquence avec un générateur JPA, tu peux pas faire ça.

 

Mais sinon, le problème de l'égalité/identité et du partage de cette notion entre le code, le sgbd et le métier est sans réelle solution. Et il est complexe.
L'adresser "a la légère" avec un outil qui a l'air magique pour un gain assez minime, je suis assez contre (du coup: Lombok ça fait des trucs sympa, mais risqués si on maîtrise pas ces notions, et le coût du risque me semble supérieur au gain de son utilisation)

 

C'est d'ailleurs une question que je pose souvent en ITW :

 

- la diff entre Set et List?
- il y a pas de doublon dans un Set.
- qu'est ce que vous voulez dire par doublon?

 

Et la généralement c'est le drame.

 


A cet égard je trouve que les records qui font entrer la notion d'égalité champ a champ avec le même nom de méthode que l'égalité d'instance du Object.equals() nous préparent de grands moment de perplexité chez les devs qui se sont jamais intéressés au problème.


---------------
Tous les sud africains sont ségrégationistes, à part Ted. (P. Desproges)
n°2413548
Kenshineuh
Posté le 29-03-2022 à 19:09:21  profilanswer
 

Flaie a écrit :


redux roi du game sur ce point précis, predictable, time travel, pure.

 

truc correct vu la sensibilité, je pars pas pour moins bien, ce qui est le cas de mobx pour moi :p

 

Oui bon, y'a aussi beaucoup de branlette autour de ça. Souvent quand tu debug ton state c'est parce que tu as mal branlé ton composant. :o

 

Le nombre de projet qui l'intègre alors qu'un useContext fait le taf, voilà quoi.
Et dédicace aussi à ceux qui font des milliers de micro composant partout alors que rien n'est jamais utilisé deux fois alors qu'une bonne page suffit et est plus simple à gérer aussi niveau state. :o


Message édité par Kenshineuh le 29-03-2022 à 19:13:54
n°2413549
masklinn
í dag viðrar vel til loftárása
Posté le 29-03-2022 à 19:29:25  profilanswer
 

gfive a écrit :

- la diff entre Set et List?
- il y a pas de doublon dans un Set.


C'est toi qui les amène à ça? Parce qu'une autre différence assez majeure c'est que le set ne maintient pas d'ordre (et par conséquent ne permet pas non plus de le manipuler).

gfive a écrit :

A cet égard je trouve que les records qui font entrer la notion d'égalité champ a champ avec le même nom de méthode que l'égalité d'instance du Object.equals() nous préparent de grands moment de perplexité chez les devs qui se sont jamais intéressés au problème.


IMO c'est une des grosses améliorations dans les langages modernes (genre Swift ou Rust) héritées des langages fonctionnels: ce genre d'opérations est optionnelle et opt-in, donc tend à être beaucoup plus délibéré, et documenté.able.

Message cité 1 fois
Message édité par masklinn le 29-03-2022 à 19:32:09

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2413550
gfive
Posté le 29-03-2022 à 19:41:07  profilanswer
 

masklinn a écrit :


C'est toi qui les amène à ça? Parce qu'une autre différence assez majeure c'est que le set ne maintient pas d'ordre (et par conséquent ne permet pas non plus de le manipuler).

 
masklinn a écrit :


IMO c'est une des grosses améliorations dans les langages modernes (genre Swift ou Rust) héritées des langages fonctionnels: ce genre d'opérations est optionnelle et opt-in, donc tend à être beaucoup plus délibéré, et documenté.able.

 

L'ordre ils y pensent, mais après le pas de doublon, qui est vraiment le premier truc qui sort.

 

Ce qui est marrant avec Set, c'est que les objets sont les clés de la Map cachée dedans.
Donc si tu fais pas gaffe à ton equals/hashcode tu peux faire :

 

Machin truc = New Machin(nom, prénom)
(Hashcode défini sur nom et prénom)
set.put(truc);

 

truc.setNom(hahaha)
set.contains(New Machin(hahaha, prénom) -> false
Truc.equals(New Machin(hahaha, prénom) -> true.

 

Diablerie!!!

Message cité 1 fois
Message édité par gfive le 29-03-2022 à 20:23:06

---------------
Tous les sud africains sont ségrégationistes, à part Ted. (P. Desproges)
n°2413551
hephaestos
Sanctis Recorda, Sanctis deus.
Posté le 29-03-2022 à 19:50:50  profilanswer
 

Flaie a écrit :


euh la sur le tel à la salle de sport entre deux répétitions mais en gros lancer des requêtes qui en appellent d'autres (des actions dans le concept redux). Redux s'occupe d'ordonnancer les promises failure potentiellement multiple etc, à la main c'est la merde a coup de Promise.all sans compter le fait que la réduction peut arriver dans un ordre différent et être sub optimale

 

sur l'ordinateur je peux te montrer mieux

 

mais principalement moi redux me plaît pour le cadre et la séparation qu'il donne, et l'unique source of truth des données, sans compter que la réduction peut être écrite succinctement


Je me suis mal fait comprendre. J'aime bien redux, et j'utilise ça dans mes applis. Par contre, ça me semble trivial à implémenter, du coup je vous pas trop l'intérêt de se traîner un truc comme NgRx qui rajoute du frottement et une couche d'abstraction imbitable pour quiconque n'est pas habitué. Je cherche des arguments pour garder NgRx.

n°2413552
masklinn
í dag viðrar vel til loftárása
Posté le 29-03-2022 à 19:58:59  profilanswer
 

gfive a écrit :

L'ordre ils y pensent, mais après le pas de doublon, qui est vraiment le premier truc qui sort.
 
Ce qui est marrant avec Set, c'est que les objets sont les clés de la Map cachée dedans.


C’est pas toujours une map pour raisons d’efficacité (tous les langages ont pas des types de talle 0, donc tu perds de la mémoire pour rien à mettre genre des valeurs nulles).
 
Mais sinon oui, mettre des objets mutables dans un set et garder un handle dessus c’est un piège classique.
 
Ça te nique aussi bien un (b)treeset aussi quand t’as un objet qui est pas au bon endroit :D

Spoiler :

là encore un piège difficile à rencontrer en rust, faut que la clé soit un RefCell, et ça marche pas avec les hash parce que RefCell n’implémente que Eq et Ord, pas Hash

Message cité 1 fois
Message édité par masklinn le 29-03-2022 à 20:01:10

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2413553
gfive
Posté le 29-03-2022 à 20:23:50  profilanswer
 

masklinn a écrit :


C’est pas toujours une map pour raisons d’efficacité (tous les langages ont pas des types de talle 0, donc tu perds de la mémoire pour rien à mettre genre des valeurs nulles).

 

Mais sinon oui, mettre des objets mutables dans un set et garder un handle dessus c’est un piège classique.

 

Ça te nique aussi bien un (b)treeset aussi quand t’as un objet qui est pas au bon endroit :D

Spoiler :

là encore un piège difficile à rencontrer en rust, faut que la clé soit un RefCell, et ça marche pas avec les hash parce que RefCell n’implémente que Eq et Ord, pas Hash


 

(Je fais des itw que pour du java)


---------------
Tous les sud africains sont ségrégationistes, à part Ted. (P. Desproges)
n°2413554
masklinn
í dag viðrar vel til loftárása
Posté le 29-03-2022 à 20:38:34  profilanswer
 

gfive a écrit :


 
(Je fais des itw que pour du java)


Et c’est une map sous le hashset pas une implémentation séparée? Parce que java étant justement un langage sans zst (afaik) tu perds 8 octets par bucket.


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2413555
koskoz
They see me trollin they hatin
Posté le 29-03-2022 à 20:49:32  profilanswer
 
n°2413556
hephaestos
Sanctis Recorda, Sanctis deus.
Posté le 29-03-2022 à 21:34:15  profilanswer
 

Bon bah j'ai pas été pris...

 

Les recruteurs étaient assez surpris en voyant ma tronche mais ils l'ont assez bien pris. J'ai pas pu m'attarder j'étais au tennis...

n°2413557
Dion
Acceuil
Posté le 29-03-2022 à 21:35:07  profilanswer
 

Je croyais qu’il n’y avait pas la vidéo  :sweat:


---------------
It is not called show art
n°2413558
hephaestos
Sanctis Recorda, Sanctis deus.
Posté le 29-03-2022 à 21:52:06  profilanswer
 

Dion a écrit :

Je croyais qu’il n’y avait pas la vidéo :sweat:


Oups :o

n°2413559
Dion
Acceuil
Posté le 29-03-2022 à 22:01:09  profilanswer
 

Je te gardais une opportunité de complément de revenus depuis quelques jours mais si tu ne passes même pas les tests du premier round… :/
 
 

Citation :

Hi,
If you are planning for certifications like:
 
- TOGAF / ITILv4
- AWS / AZURE / GCP
- PMP / PRINCE2 / PgMP
- CCSP / CISSP / CISA / CISM / CEH
 
We can offer proxy and you’ll get good deals and offers.
Please accept my request & drop the details to have a discussion.
 
Whatsapp No. :
Certification :


---------------
It is not called show art
n°2413561
beel1
Posté le 30-03-2022 à 00:10:32  profilanswer
 

Nouvelle idée dans mon désert médical : un n° de tél mutualisé pour avoir un RDV avec un généraliste en cas d'urgence relative (une vingtaine de médecins de l'agglo ont bloqué des créneaux de 2h pour ces RDV hors patientèle).
 
Lundi c'était le jour de l'ouverture du service : implosion des urgences du CH. 2x plus d'entrées qu'avant. 1 décès sur un brancard. 90% des parameds du SAU s'est mis en arrêt le soir même. Great success.
(L'ARS a répondu : "démerdez-vous" )

n°2413562
R3g
fonctionnaire certifié ITIL
Posté le 30-03-2022 à 07:01:52  profilanswer
 

beel1 a écrit :

Nouvelle idée dans mon désert médical : un n° de tél mutualisé pour avoir un RDV avec un généraliste en cas d'urgence relative (une vingtaine de médecins de l'agglo ont bloqué des créneaux de 2h pour ces RDV hors patientèle).
 
Lundi c'était le jour de l'ouverture du service : implosion des urgences du CH. 2x plus d'entrées qu'avant. 1 décès sur un brancard. 90% des parameds du SAU s'est mis en arrêt le soir même. Great success.
(L'ARS a répondu : "démerdez-vous" )


Tiens c’est marrant parce que c’est une des propositions de campagne de Macron (et Pecresse aussi ?)


---------------
Au royaume des sourds, les borgnes sont sourds.
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  ..  24665  24666  24667  ..  27197  27198  27199  27200  27201  27202

Aller à :
Ajouter une réponse
 

Sujets relatifs
Plus de sujets relatifs à : [blabla@olympe] Le topic du modo, dieu de la fibre et du monde


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)