J'adore le «modèle» immuable en raison de ses points forts, et dans le passé, je l'ai trouvé bénéfique pour concevoir des systèmes avec des types de données immuables (certains, la plupart ou même tous). Souvent, lorsque je le fais, je me retrouve à écrire moins de bogues et le débogage est beaucoup plus facile.
Cependant, mes pairs en général évitent l'immuable. Ils ne sont pas du tout inexpérimentés (loin de là), mais ils écrivent des objets de données de manière classique - des membres privés avec un getter et un setter pour chaque membre. Ensuite, généralement, leurs constructeurs ne prennent aucun argument, ou peuvent simplement prendre quelques arguments pour plus de commodité. Si souvent, la création d'un objet ressemble à ceci:
Foo a = new Foo();
a.setProperty1("asdf");
a.setProperty2("bcde");
Peut-être qu'ils font ça partout. Peut-être qu'ils ne définissent même pas un constructeur qui prend ces deux chaînes, quelle que soit leur importance. Et peut-être qu'ils ne changent pas la valeur de ces chaînes plus tard et n'en ont jamais besoin. De toute évidence, si ces choses sont vraies, l'objet serait mieux conçu comme immuable, non? (le constructeur prend les deux propriétés, pas de setters du tout).
Comment décidez-vous si un type d'objet doit être conçu comme immuable?Existe-t-il un bon ensemble de critères pour le juger?
Je suis actuellement en train de débattre de la nécessité de changer certains types de données de mon propre projet en immuables, mais je devrais le justifier auprès de mes pairs, et les données dans les types pourraient (TRÈS rarement) changer - à quel moment vous pouvez bien sûr changer il de façon immuable (créez-en un nouveau, en copiant les propriétés de l'ancien objet à l'exception de celles que vous souhaitez modifier). Mais je ne sais pas si c'est juste mon amour pour les immuables qui transparaît, ou s'il y a un réel besoin / bénéfice d'eux.