Проблема
Я продолжаю сталкиваться с этой парадигмой, где мне приходится писать функции вида maybeUpdateEnabled
, где я изменяю одну переменную, которая определяет видимость, и должна проверять нагрузку других.
Пример
Представьте, что у меня есть следующие данные (для удобства представлены здесь в виде строк):
["apple", "pear", "tomato", "celery", "red pepper"]
, и я предоставляю пользователю графический интерфейс с двумя кнопками-переключателямиодин - для фильтрации всего красного, а другой - для овощей.Пользователь сначала отфильтровывает все красные, а затем все овощи, и остаются только груши.Когда пользователь затем переключает красный переключатель, red peppers
, которые были первоначально отфильтрованы, все еще должны быть невидимыми, так как они все еще скрыты через овощной фильтр.
Вопрос
Существуют ли какие-либо шаблоны проектирования, которые могут помочь облегчить это?Я подумывал об использовании битовых масок или какого-либо другого стека, но не думаю, что смогу логически избежать парадигмы maybeUpdate
, которая ужасно пахнет для меня.
Редактировать
Я также хотел бы добавить, что это не обязательно вопрос «как мне это сделать», а скорее «как сделать так, чтобы это не причиняло боль в шее».Я могу иметь любое количество n
полей, ни одно из которых не имеет каких-либо конкретных гарантий того, какие условия могут отфильтровывать любое количество m
объектов.У меня есть временное исправление для этой цели, но я бы хотел воспользоваться практикой рефакторинга для обеспечения чистого API без необходимости реорганизовывать почти все.
Edit 2
ХотяЯ не могу опубликовать код, я могу абсолютно вам сказать, что используется куча JFXToggleButtons
, и слушатели подключаются к «сигналу» selectedProperty
, который, на мой взгляд, создает очень тесную связь между представлениемМодель и контроллер, поскольку представление и контроллер, по сути, являются одними и теми же базовыми структурами данных и классами (что много отстой).Изменение свойств без графического интерфейса имеет то преимущество, что автоматически обновляет контроллер, но, к сожалению, генерирование изменений для каждого отдельного изменения свойства в соответствии с приведенным выше редактированием ужасно неэффективно (и да, я его профилировал).