модификация класса case и общий способ проектирования

#scala #shapeless

#scala #бесформенный

Вопрос:

фрагменты кода упрощены, выбраны для целей этого сообщения.

 case class Person(firstName:String,lstName:String)
  

Этот класс person использовался повсеместно в кодовой базе. Теперь более поздние требования изменились и решили добавить phoneNumber в класс person case

например

 case class Person(firstName:String,lstName:String,phoneNumber:String)
  

опять же, примеры в сообщении чрезвычайно упрощены. На самом деле происходят более интересные вещи. Обратите внимание, что phoneNumber это Option не обязательное поле. Обычно нужно пойти и обновить весь код, использующий Person class, для обслуживания нового поля lastName . что довольно утомительно, когда у вас есть 100 ссылок на него.

Может ли shapeless помочь в создании более гибкого HList класса get go vs case?

Ответ №1:

Самый простой способ сделать это — предоставить значение по умолчанию для phoneNumber :

 case class Person(firstName: String, lastName: String, phoneNumber: String = "")
  

В качестве альтернативы вы можете создать сопутствующий объект и реализовать apply() метод для обоих случаев, то есть с и без phoneNumber . Если вы решите использовать этот подход и используете класс case в сопоставлениях с образцом, вы также можете захотеть реализовать соответствующие unapply() методы.

Комментарии:

1. Вам также может потребоваться создать unapply() методы, если вы не хотите нарушать соответствие шаблону