Я создаю логику для веб-приложения для управления согласиями пользователя.
Класс модели, который сохраняется в БД, будет иметь несколько полей, из которых только набор будет изменен по запросу пользователя. Например В классе будет 10 полей с различными разрешениями, но пользователь захочет изменить только 2 из них. Чтобы не писать большую цепочку if-else, я разработал эти классы, чтобы использовать полиморфизм для выполнения работы за меня, но каким-то образом этот дизайн кажется мне ошибочным. Не могли бы вы сказать мне, если это правильный способ сделать это?
ПРОБЛЕМА: Изменить значения только подмножества полей из большого набора полей в классе.
Ради простоты я удалил методы getter / setters и некоторые поля.
Основная логика для изменения согласия:
public class GdprServiceImpl implements GdprService {
private final ConsentRepository consentRepository;
@Autowired
public GdprServiceImpl(ConsentRepository consentRepository) {
this.consentRepository = consentRepository;
}
@Override
public void changeConsent(User user, List<ConsentDto> consents) {
Optional<Consent> optionalConsent = consentRepository.findByUser(user);
if(optionalConsent.isPresent()) {
Consent consent = optionalConsent.get();
for(ConsentDto consentDto : consents) {
consentDto.apply(consent);
}
consentRepository.save(consent);
}
else {
Consent consent = new Consent();
consent.setUser(user);
for(ConsentDto consentDto : consents) {
consentDto.apply(consent);
}
consentRepository.save(consent);
}
}
Класс модели:
public class Consent {
private Boolean messageConsent;
private Boolean recordConsent;
/*CONSTRUCTOR, OTHER METHODS AND FIELDS OMITTED*/
}
Классы, которые будут изменять набор полей из класса Consent:
public abstract class ConsentDto {
public abstract void apply(Consent consent);
}
public class RecordConsentDto extends ConsentDto {
private boolean consentValue;
public RecordConsentDto(boolean consentValue) {
this.consentValue = consentValue;
}
@Override
public void apply(Consent consent) {
consent.setRecordConsent(consentValue);
}
}
public class MessageConsentDto extends ConsentDto {
private boolean consentValue;
public MessageConsentDto(boolean consentValue) {
this.consentValue = consentValue;
}
@Override
public void apply(Consent consent) {
consent.setMessageConsent(this.consentValue);
}
}