
Pollux :
Mais bon, excuse-moi mais c'est pas comme si Pascal était une référence en terme de langage bien conçu, hein (bon, ça a été en grande partie corrigé par Delphi, je suis bien d'accord, mais je veux dire que ton argument d'autorité à propos des concepteurs de Pascal ne vaut pas grand-chose ^^)
Pour reprendre l'exemple de l'utilisateur avec des propriétés, c'est certain que yAro n'a *jamais* dû rajouter de champs aux profils yN parce qu'il avait tout bien conçu dès le départ
Zephyr
:Pollux :
Mais bon, excuse-moi mais c'est pas comme si Pascal était une référence en terme de langage bien conçu, hein (bon, ça a été en grande partie corrigé par Delphi, je suis bien d'accord, mais je veux dire que ton argument d'autorité à propos des concepteurs de Pascal ne vaut pas grand-chose ^^)
Heu sans vouloir être vexant... Même si c'est pas ton langage favori ils ont quand même un tout petit peu plus de crédibilité que toi, moi, ou n'importe qui sur yN à ce point de vue, hein
Pour reprendre l'exemple de l'utilisateur avec des propriétés, c'est certain que yAro n'a *jamais* dû rajouter de champs aux profils yN parce qu'il avait tout bien conçu dès le départProbablement pas, mais t'es sûr que yAronet est un modèle de conception à suivre ? ^^
En admettant qu'il l'eut été, l'exemple est quand même mal choisi : j'ai la liste de champs en question, et le seul qui ne pouvait pas exister dans la 1ere version est celui qui indique le forum d'inscription. Or pour faire un peu d'histoire de yAronet, ça a quand même donné la v2 de yN et donc "quelques" changements de code (je sais pas quelle est la proportion qui a été conservée, mais ce champ en plus était à mon avis assez insignifiant par rapport au reste ^^)
Pollux :
Pascal a été vivement critiqué à l'époque pour ses features pas très bien pensées (entre autres par le concepteur d'un langage qui s'appelait "C")
Sally
: Ben, déjà, il s'agit des premières versions du C, pas du C iso si ? ie le truc sans les prototypes de fonctions, si je ne m'abuse ? si ça a été changé c'est sans doute qu'il y avait un problème...
Et aussi (c'est un détail mais bon), les priorités des opérateurs << et >> sont complètement stupides...
Sally :
Ben ce n'était pas tant une question de propreté que de « features pas très bien pensées »![]()
Pour être plus précis, j'ai vraiment du mal à comprendre le coup de la virgule. « e1, e2 » ça évalue e1, puis ça évalue e2, puis ça renvoie la valeur de e2 ; bon, très bien. Mais « e1; e2 », ça fait quoi, déjà ? ben, ça évalue e1 puis ça évalue e2... ah, oui, mais la différence c'est que ce n'est pas une expression valide, ça ne peut être utilisé que comme statement, et donc ça ne renvoie pas la valeur de e2. Mais ça coûterait quoi d'en faire une expression valide ?
et je ne comprends vraiment pas pourquoi ils se sont fait chier à utiliser la virgule pour faire ça alors qu'elle sert déjà à séparer les arguments d'une fonction.
En fait, plus généralement, toute la distinction entre expressions et statements me semble assez fumeuse. "a = 3" n'a aucune raison d'être une expression valide
et inversement "<statement quelconque>; <expression>" n'a aucune raison de ne pas en être une à partir du moment où on accepte que les expressions aient des effets de bord...
De la même façon, qu'est-ce que ça aurait coûté d'utiliser des crochets pour écrire les initialiseurs de tableaux plutôt que des accolades ? ben, rien, et ç'aurait été bien plus clair...
Pollux :Ben, ça dépend, mais en tous cas je ne trouve pas logique que ça ait un statut différent de « if(youpi) a = 3; », qui n'est pas une expression du tout. C'est vrai que je n'avais pas pensé au a = b = truc, mais tout "sucre syntaxique" est-il bon à prendre ?
En fait, plus généralement, toute la distinction entre expressions et statements me semble assez fumeuse. "a = 3" n'a aucune raison d'être une expression valideJ'ai l'impression que tu voudrais plutôt que ça soit une expression qui renvoie void, c'est pas tout à fait pareil ^^
Pollux :Euh j'ai pas dit qu'il y avait un risque de confusion, c'est juste une question de facilité de lecture du code pour l'humain. D'habitude les accolades ça définit un compound statement, et là non. Mais à vrai dire le truc qui me dérange plus que la lisibilité c'est le fait qu'à cause de cette syntaxe (enfin c'est peut-être juste à cause du parser qui est pas doué, en fait ^^) tu ne peux pas mettre des "literals" de tableaux ailleurs que dans l'initialisation d'une variable, c'est pénible.
je ne vois pas bien quel risque de confusion il pourrait y avoir entre des listes de statements séparés par des ; et le contenu d'un tableau
mais en comparaison Pascal n'avait même pas d'opérateurs booléens...Bah....justement, c'est l'un des aspects dont je parlais : Pascal t'oblige à réfléchir et définir ce que tu vas faire.![]()
Sally
:Pollux :Ben, ça dépend, mais en tous cas je ne trouve pas logique que ça ait un statut différent de « if(youpi) a = 3; », qui n'est pas une expression du tout.
En fait, plus généralement, toute la distinction entre expressions et statements me semble assez fumeuse. "a = 3" n'a aucune raison d'être une expression valideJ'ai l'impression que tu voudrais plutôt que ça soit une expression qui renvoie void, c'est pas tout à fait pareil ^^
C'est vrai que je n'avais pas pensé au a = b = truc, mais tout "sucre syntaxique" est-il bon à prendre ?Enfin c'est vrai qu'avec les warnings le fait que ce soit une expression est moins gênant, mais bon. C'est quand même pas tellement plus long de mettre a = b à part (ou de faire a = (b = truc, b))
Pollux :Euh j'ai pas dit qu'il y avait un risque de confusion, c'est juste une question de facilité de lecture du code pour l'humain. D'habitude les accolades ça définit un compound statement, et là non.[/cite]
je ne vois pas bien quel risque de confusion il pourrait y avoir entre des listes de statements séparés par des ; et le contenu d'un tableau
Mais à vrai dire le truc qui me dérange plus que la lisibilité c'est le fait qu'à cause de cette syntaxe (enfin c'est peut-être juste à cause du parser qui est pas doué, en fait ^^) tu ne peux pas mettre des "literals" de tableaux ailleurs que dans l'initialisation d'une variable, c'est pénible.
Sinon pour le point-virgule en caml, oui c'est le même problème ; ceci dit je pense qu'il est moins fréquent de vouloir mettre des expressions compliquées dans un "literal" liste que dans les arguments d'un appel de fonction, mais bon c'est quand même un peu pourri aussi c'est sûr... (mais le truc c'est que comme d'après moi l'une des utilisations de la virgule en C est inutile, ils auraient pu éviter le problème plus facilement ^^)
if (condition) f("hello",(a++,b),(dostuff(),42));
if (condition) a++, dostuff(), f("hello",b,42);
spectras
:mais en comparaison Pascal n'avait même pas d'opérateurs booléens...Bah....justement, c'est l'un des aspects dont je parlais : Pascal t'oblige à réfléchir et définir ce que tu vas faire.![]()
Les opérateurs booléens sont booléens sur les types boolean, et bitwise sur les entiers (et interdits sur les autres types). Moi ça me semble plutôt logique comme définition.
Pollux :Euh mon argument n'était pas si sophistiqué que ça, je disais juste que je trouve qu'une affectation n'a pas plus de raison de renvoyer quelque chose qu'un if. D'ailleurs c'est évident que if (foo) bar; ne peut pas avoir le type de bar, mais par contre il pourrait très bien renvoyer foo (je veux dire que c'est techniquement possible) et si ça se trouve on pourrait trouver une utilité à ça si c'était le cas, mais bon ^^.
Ben non, le fait que "if (foo) bar;" soit obligatoirement void n'est absolument pas un argument pour dire que "bar;" devrait être void, parce que "if (foo) bar;" est *obligatoirement* void quel que soit bar
Pollux :Ah ok
Non mais en fait la vraie raison c'est que mettre des virgules dans un paramètre de fonction est inutile puisque l'ordre d'évaluation des arguments est non-spécifié
Pollux :Euh mon argument n'était pas si sophistiqué que ça, je disais juste que je trouve qu'une affectation n'a pas plus de raison de renvoyer quelque chose qu'un if. D'ailleurs c'est évident que if (foo) bar; ne peut pas avoir le type de bar, mais par contre il pourrait très bien renvoyer foo (je veux dire que c'est techniquement possible) et si ça se trouve on pourrait trouver une utilité à ça si c'était le cas, mais bon ^^.
Ben non, le fait que "if (foo) bar;" soit obligatoirement void n'est absolument pas un argument pour dire que "bar;" devrait être void, parce que "if (foo) bar;" est *obligatoirement* void quel que soit bar
Mais bon si tu veux un exemple plus sophistiqué tu peux prendre "if (foo) bar; else return;" : lui il pourrait avoir le type de bar.
void f() { if (condition_f) bar; else halt(); } void g() { if (condition_g) bar; else halt(); }
Sinon, oui, c'est plus la possibilité d'utiliser par inadvertance = à la place de == et d'obtenir du code quand même valide qui me dérange
Pollux :
Enfin moralement "if (foo) bar; else bar;" devrait être en tout point équivalent à "bar;", donc je ne vois pas très bien comment foo pourrait intervenir dans la valeur de retour, même quand le membre de gauche et le membre de droite sont distincts ^^
(je suppose que tu veux dire "le type de foo")Euh je voulais bien dire le type de bar, ça n'avait pas de rapport direct avec ce que j'ai dit juste avant (qui était en fait une digression
Sally
:Pollux :
Enfin moralement "if (foo) bar; else bar;" devrait être en tout point équivalent à "bar;", donc je ne vois pas très bien comment foo pourrait intervenir dans la valeur de retour, même quand le membre de gauche et le membre de droite sont distincts ^^
Hm, non, moralement il devrait être en tout point équivalent à "foo; bar;" plutôt
(je suppose que tu veux dire "le type de foo")Euh je voulais bien dire le type de bar, ça n'avait pas de rapport direct avec ce que j'ai dit juste avant (qui était en fait une digression, c'est pour ça que ça commence par « d'ailleurs »), mais avec ce que j'avais dit encore avant ^^
c'est-à-dire que dans « je ne vois pas pourquoi "a = 3" a un statut différent de "if (youpi) a = 3;" » tu peux remplacer le deuxième par "if (youpi) a = 3; else return;" et là il n'y a vraiment plus de raison de les considérer différemment.
En fait tout à l'heure je n'avais pas pensé à cet exemple, juste à "if (youpi) a = 3; else a = 4;" mais je ne l'ai pas mis parce qu'on aurait pu m'objecter que si on veut que ce soit une expression il suffit d'écrire "a = youpi ? 3 : 4" donc c'est pas vraiment gênant. Alors qu'avec le return je ne vois pas trop comment on pourrait faire...
void plouf() { if (setjmp(buf)) return; ... a = youpi ? 3 : (longjmp(buf,1),42); ... }
Sinon le "if (foo) ..." qui renverrait la valeur de foo j'ai juste dit qu'on pourrait s'amuser à décider que c'est le cas, pas que c'était intelligent, hein ^^. C'est juste pour dire que la valeur de retour d'un truc qui est censé ne faire que des effets de bord (comme une affectation) c'est quelque chose que tu choisis un peu comme tu veux, enfin pour moi le fait que "a = bidule" renvoie la valeur de bidule est juste une convention, moralement c'est quand même void
alors certes le fait que ça renvoie cette valeur a des avantages, mais si if (foo) renvoyait la valeur de foo on pourrait peut-être aussi trouver des cas où ça a des avantages, donc c'est un peu pareil (même si l'une de ces conventions est plus stupide que l'autre)
Bah c'est un exemple d'application concrète, où les besoins évoluent au cours du temps, et je ne vois pas comment tu peux éviter ça avec une meilleure "conception"...
Tiens, c'est marrantC'est si vieux que ça, "Afficher tous les connectés ?", "Ne pas afficher les signatures dans les posts ?", "Forcer position avatar :" et "Taille police (par défaut 10px) : :" ? (c'est une vraie question, hein)
Zephyr
:Tiens, c'est marrantC'est si vieux que ça, "Afficher tous les connectés ?", "Ne pas afficher les signatures dans les posts ?", "Forcer position avatar :" et "Taille police (par défaut 10px) : :" ? (c'est une vraie question, hein)
Non, mais tu n'as pas lu ce que j'ai dit (pr changer) : ce sont des features qui ne dépendent de rien qui n'existait pas à la création de yAronet (contrairement à ce qui touche aux forums, qui sont apparus plus tard), dont elles auraient pu (du, amha) être prévues dès le départ ^^
Pollux :Euh j'essayais de rien dire de plus, tout ça ça commentait la phrase « toute la distinction entre expressions et statements me semble assez fumeuse. » ^^ Le seul truc c'est que j'ai dit « puisque le if blabla n'est pas une expression valide, alors je ne vois pas pourquoi l'affectation en est une », donc superficiellement ça peut donner l'impression que je ne suis pas d'accord avec toi, mais en fait c'est juste la contraposée de ce que tu dis toi ^^
Ah mais je ne dis pas que les statements devraient être distincts des expressions, au contraire ; je ne vois pas bien ce que tu essayes de dire![]()
Pollux :Non, c'est pas ce que j'ai dit, j'ai dit que si l'utilité de cette fonction réside dans ses effets de bord, la valeur de retour peut être choisie de différentes manières sans que ça modifie la, euh, fonction de la fonction. « moralement, c'est void » ça veut juste dire que, dans l'idée, la valeur de retour n'est pas le « résultat » de la fonction mais plutôt un indicateur sur ce qu'elle a fait, le résultat de la fonction étant ses effets de bord ; et dans 99% des cas tu n'utiliseras d'ailleurs pas la valeur de retour.
Ah, une fonction qui a des effets de bord n'est pas censé renvoyer une valeur
Pollux
: Bah pas forcément, ça suit l'évolution des skins, des demandes des utilisateurs, etc... (peut-être qu'on peut aussi vouloir afficher les infos du profil dans chaque post ? pourtant l'option n'existe pas, est-ce qu'elle aurait dû être prévue dès le départ à ton avis ?)
D'ailleurs le fait de permettre ou non de cacher certains éléments est un facteur important dans la façon dont les gens vont interagir sur un forum (de même que d'autres facteurs comme l'espacement entre les posts, ou la présence d'un formulaire directement en bas de la page), en changeant par exemple leur propension à écrire un post même s'il est court, ou qu'il n'apporte pas grand chose, ou au contraire leur propension à faire des gros trolls cite-point-par-point ; donc ce genre de feature ne peut pas être prévu directement au début, et doit évoluer en fonction des gens qui fréquentent le forum, et de la façon dont ils s'en servent ^^
Moumou :
En caml quand une fonction intermédiaire (cad suivie d'un ";") avec effets de bord renvoie autre chose que "void", il faut l'inclure dans un appel à ignore, sinon le compilateur sort un warning.
Zephyr
: au pire une nouvelle méthode dans un des objets, mais le namespace ne devrait pas changer du point de vue du "with"
Yep, ça rejoint ma réponse à la question précedente, on peut détailler un peu plus. En admettant que yN soit programmé avec une vision objet (je ne pense pas que ça soit le cas, mais peu importe), les champs des différentes classes devraient alors grosso modo ressembler fortement aux tables respectives de la base sql (qui elle, pour le coup, a plutôt interet à ne pas trop bouger au fil du temps; on y reflechit à 2 fois avant d'ajouter un nouveau champ à une table qui contient déjà des milliers d'enregistrements ^^).
Pollux
: Ben une préférence en plus, ça rajoute forcément un champ...
Pourquoi donc ? C'est vraiment si coûteux que ça de rajouter un champ à chaque profil ?
(et quand bien même ça serait effectivement coûteux, on peut envisager d'autres solutions pour rajouter un flag, du style avoir un champ de flags dans la table sql pour les préférences : mais le namespace de l'objet, lui, aurait bien un champ en plus ^^)