11
votes

Pourquoi n'utiliser-on pas une classe de cas exclusivement?

Pourquoi ne devrait-on pas utiliser des classes de cas exclusivement?

Après tout, ils favorisent l'immutabilité, la correspondance des motifs sur les méthodes accessoires, etc.?


1 commentaires

Cela me semble comme une question technique parfaitement bonne; J'ai voté pour rouvrir.


3 Réponses :


15
votes

Les gens utilisent fréquemment des classes de cas, puis essayez de les personnaliser / les abuser de faire autre chose que ce que les classes de cas sont censées faire.

E.g. Si vous voulez p>

  • Faites des champs privés li>
  • Personnaliser l'égalité / Hashcode Li>
  • avoir un état mutable li>
  • appliquer des invariants lors de la construction d'instances li> ul>

    Vous devez utiliser une classe normale, même si vous devez taper un peu plus. P>

    Utilisez une classe de cas pour les données pures, immuables et publiques. Fondamentalement, un tuple avec des éléments nommés, rien de plus. Utilisez des classes normales pour E.G. Poignées à des ressources mutables (fichiers, contrôles d'interface graphique, etc.) p>

    Les gens pensent fréquemment que vous pouvez abuser des classes de cas pour effectuer des tâches réservées aux classes normales. Voici donc un certain nombre d'exemples d'utilisation abusive des classes de cas: p>

    membres privés h3>

    membres d'une classe de cas ne sont jamais vraiment privés p> xxx pré>

    Constructeur privé h3>

    Vous pensez peut-être que, en faisant le constructeur privé, il est possible de faire respecter les invariants. Dans l'exemple ci-dessous, vous pouvez penser qu'il est impossible de créer une plage avec min> max. P> xxx pré>

    mais ce n'est pas le cas: p>

    scala> val wrong = Range.create(2,1).copy(min = 1000)
    wrong: Range = Range(1000,2)
    


0 commentaires

0
votes

Parce que vous n'en avez tout simplement pas besoin toujours. Par défaut, ils génèrent par défaut. getters publics pour champs. De plus, les classes de cas créent automatiquement un objet compagnon avec le même nom que la classe, qui contient Appliquer et non apply .


0 commentaires

0
votes

Les classes de cas ne sont pas universellement bonnes. Ils sont inutiles lorsque vous ne voulez pas tous vos champs publics et / ou ne vous souciez pas de la logique de comparaison et de clonage par défaut, ou lorsque vous avez besoin d'un accesseur non trivial ou d'une logique d'initialisateur.

Ils ne peuvent pas non plus avoir plus de 22 membres et vous ne pouvez pas construire des hiérarchies d'entre eux (au moins, pas exclusivement, car une héritage de cas à cas-à-cas est interdite, mais en prolonge même une classe de cas avec une classe normale t une très bonne idée).


0 commentaires