1 votes

La fonctionnalité des constantes doit-elle être étendue ?

EDIT : cette question pourrait probablement utiliser un titre plus approprié. N'hésitez pas à en suggérer un dans les commentaires.

En utilisant le C++ avec un grand ensemble de classes, j'ai un jour rencontré une situation dans laquelle const est devenu une source de tracas, non pas à cause de sa fonctionnalité, mais parce qu'il a une définition très simpliste. Son applicabilité à un entier ou une chaîne de caractères est évidente, mais pour des classes plus compliquées, il y a souvent plusieurs propriétés qui pourraient être modifiées indépendamment les unes des autres. J'imagine que de nombreuses personnes ont dû apprendre ce que le mutable mot-clé fait pourrait avoir eu des frustrations similaires.

L'exemple le plus évident pour moi serait une classe de matrice, représentant une transformation 3D. Une matrice représentera à la fois une translation et une rotation, chacune d'entre elles pouvant être modifiée sans modifier l'autre. Imaginez la classe et les fonctions suivantes avec l'ajout hypothétique de "multi-property const".

class Matrix {
     void translate(const Vector & translation) const("rotation");
     void rotate(const Quaternion & rotation) const("translation");
}

public void spin180(const("translation") & Matrix matrix);
public void moveToOrigin(const("rotation") & Matrix matrix);

Ou imaginez des mots-clés const prédéfinis comme "_comparable" qui vous permettent de définir des fonctions qui modifient l'objet à volonté tant que vous promettez de ne rien changer qui affecterait l'ordre de tri de l'objet, facilitant ainsi l'utilisation d'objets dans des conteneurs triés.

Quels seraient les avantages et les inconvénients de ce type de fonctionnalité ? Pouvez-vous imaginer une utilisation pratique de cette fonctionnalité dans votre code ? Existe-t-il une bonne approche pour réaliser ce type de fonctionnalité avec la fonctionnalité actuelle du mot-clé const ?

Gardez à l'esprit

  • Je sais qu'une telle fonctionnalité linguistique pourrait facilement faire l'objet d'abus. On peut dire la même chose de nombreuses caractéristiques du langage C++.
  • Comme const Je m'attendrais à ce qu'il s'agisse d'une fonctionnalité strictement liée à la compilation.
  • Si vous pensez déjà const est la chose la plus stupide depuis la boue tranchée, je considère que vous pensez la même chose à ce sujet. Pas besoin de poster, merci.

EDIT : En réponse au commentaire de SBK sur le marquage des membres, je suggère que vous n'en avez pas. Pour les classes / membres marqués const, cela fonctionne exactement comme cela a toujours été le cas. Pour tout ce qui est marqué const("foo"), il traite tous les membres comme mutables, sauf indication contraire, laissant à l'auteur de la classe le soin de s'assurer que ses fonctions fonctionnent comme prévu. En outre, dans une matrice représentée en interne comme un tableau 2D, vous ne pouvez pas marquer les champs individuels comme const ou non const pour la translation ou la rotation, car tous les degrés de liberté se trouvent dans une seule déclaration de variable.

1voto

B.S. Points 252

Je ne pense pas qu'il soit possible de réaliser cela en tant que fonctionnalité strictement compilatoire.

Je n'arrive pas à trouver un bon exemple, donc ce modèle strictement fonctionnel devra faire l'affaire :

struct Foo{
    int bar;
};

bool operator <(Foo l, Foo r){
    return (l.bar & 0xFF) < (r.bar & 0xFF);
}

Maintenant je mets un peu de Foos dans un ensemble trié. Évidemment, les 8 bits inférieurs de bar doivent rester inchangés afin que l'ordre soit préservé. Les bits supérieurs peuvent toutefois être modifiés librement. Cela signifie que les Foos de l'ensemble ne sont pas constants mais ne sont pas non plus mutables. Cependant, je ne vois pas comment vous pourriez décrire ce niveau de constance sous une forme utile générale sans utiliser la vérification d'exécution.

Si vous formalisiez les exigences, je pourrais même imaginer que vous puissiez prouver qu'aucun compilateur capable de faire cela (au moment de la compilation) ne pourrait même exister.

0voto

Tyler McHenry Points 35551

Je ne pense pas que la langue de base, et surtout le const mot-clé, serait le bon endroit pour cela. Le concept de const en C++ est destiné à exprimer l'idée qu'une action particulière ne modifiera pas une certaine zone de la mémoire. Il s'agit d'une idée de très bas niveau.

Ce que vous proposez est une constance logique qui a à voir avec la sémantique de haut niveau de votre programme. Le problème principal, tel que je le vois, est que la sémantique peut varier tellement entre les différentes classes et les différents programmes qu'il n'y aurait aucun moyen d'avoir une construction de langage unique pour cela.

Ce qu'il faudrait, c'est que le programmeur puisse écrire un code de validation que le compilateur exécuterait afin de vérifier que des opérations particulières répondent à sa définition de la constance sémantique (ou "logique"). En y réfléchissant, cependant, un tel code, s'il était exécuté au moment de la compilation, ne serait pas très différent d'un test unitaire.

Ce que vous voulez vraiment, c'est que le compilateur teste si les fonctions adhèrent à un contrat sémantique particulier. C'est à cela que servent les tests unitaires. Donc, ce que vous demandez, c'est qu'il y ait une fonctionnalité du langage qui exécute automatiquement les tests unitaires pour vous pendant l'étape de compilation. Je pense que ce n'est pas très utile, étant donné la complexité du système.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X