Il y a de nombreuses raisons pour lesquelles le RAII n'est pas plus connu. Tout d'abord, le nom n'est pas particulièrement évident. Si je ne savais pas déjà ce qu'est RAII, je ne le devinerais certainement pas à partir de son nom. (L'acquisition de ressources est une initialisation ? Qu'est-ce que cela a à voir avec le destructeur ou le nettoyage, qui est ce que l'on appelle l'initialisation ? vraiment caractérise RAII ?)
Une autre raison est qu'il ne fonctionne pas aussi bien dans les langages sans nettoyage déterministe.
En C++, nous savons exactement quand le destructeur est appelé, nous connaissons l'ordre dans lequel les destructeurs sont appelés, et nous pouvons les définir pour faire ce que nous voulons.
Dans la plupart des langages modernes, tout est ramassé à la source, ce qui rend la RAII plus difficile à mettre en œuvre. Il n'y a aucune raison pour qu'il ne soit pas possible d'ajouter des extensions RAII à, disons, C#, mais ce n'est pas aussi évident qu'en C++. Mais comme d'autres l'ont mentionné, Perl et d'autres langages supportent RAII malgré le garbage collector.
Cela dit, il est toujours possible de créer votre propre wrapper de type RAII en C# ou dans d'autres langages. Je l'ai fait en C# il y a quelque temps. Je devais écrire quelque chose pour m'assurer qu'une connexion à une base de données était fermée immédiatement après utilisation, une tâche que tout programmeur C++ verrait comme un candidat évident pour RAII. Bien sûr, nous pourrions tout envelopper dans using
-chaque fois que nous utilisons une connexion à la base de données, mais c'est tout simplement désordonné et source d'erreurs.
Ma solution était d'écrire une fonction d'aide qui prenait un délégué comme argument, et qui, lorsqu'elle était appelée, ouvrait une connexion à la base de données, et à l'intérieur d'une déclaration d'utilisation, la transmettait à la fonction déléguée, pseudocode :
T RAIIWrapper<T>(Func<DbConnection, T> f){
using (var db = new DbConnection()){
return f(db);
}
}
Ce n'est toujours pas aussi agréable ou évident que C++-RAII, mais cela permet d'obtenir à peu près la même chose. Chaque fois que nous avons besoin d'une DbConnection, nous devons appeler cette fonction d'aide qui garantit qu'elle sera fermée par la suite.
2 votes
Une fois de plus, SO prouve sa valeur. J'ai généralement tendance à programmer de cette façon, mais je ne savais pas que cela avait été formalisé et appelé RAII. Merci.
2 votes
Les programmeurs BASIC pensent-ils à OEG1K (On Error Goto 1000) ?
0 votes
D'autres langues utilisent parfois le idiome d'exécution pour obtenir un comportement similaire.