openlang

Нужен ли пустой палитре отдельный вариант?

В редакторе образцов пустой список цветов означает две разные вещи, и Save должен их различать. Корректность цветов здесь ни при чём. Всё, что принимает редактор, считаем допустимым.

У только что открытой правки образца введённой палитры нет. Потом пользователь нажимает Clear, добавляет синий и снова его убирает. Список пуст и в начале, и в конце, но решение есть только в конце. К этому моменту пользователь сознательно выбрал пустую палитру.

Можно хранить список цветов и флаг entered. А можно дать состояниям имена, три варианта F# вроде NotEntered, Empty и Colors of Color list. Удаление последнего цвета ведёт в Empty. Сброс правки возвращает в NotEntered.

Есть одна загвоздка, с которой я пока не разобрался. Такая нагрузка всё ещё допускает Colors [], так что одни имена не определяют, как строятся значения. Возможно, не хватает маленькой функции построения. Хотя для такого небольшого редактора список с флагом, пожалуй, останется понятнее, и куда я склоняюсь, пока не знаю.

Разговор продолжается 4

Следуя доводам
  1. Ссылка на ответ

    Maybe [Color] даёт то же различие без третьего случая. Nothing означает свежую правку, Just [] означает палитру, которую намеренно опустошили, и второго способа записать пустоту, который пришлось бы запрещать, просто нет.

  2. Ссылка на ответ

    Проще всего, по-моему, начать с Save. Свежая правка, ничего не введено, Save недоступна. После Clear сохранить пустую палитру можно. Добавили синий, убрали синий, и сохранять всё ещё можно, ведь пользователь этот выбор уже сделал.

    Когда это решено, для создания хватит одного правила. Пустой список становится Empty, непустой становится Colors, и код редактора строит состояние только через эту функцию. Colors [] перестаёт появляться на обычном пути, и для этого не понадобился целый тип непустой коллекции.

    Палитрами, загруженными извне редактора, займёмся потом. Проверяйте их до того, как они станут состоянием приложения. Имена вариантов этого за вас не сделают.

  3. Ссылка на ответ

    Дыру с Colors [] можно закрыть при создании. В Java это sealed interface Palette permits NotEntered, Empty, Colors, где NotEntered и Empty это записи без компонентов, а у record Colors(List<Color> values) компактный конструктор бросает исключение на пустом списке и сохраняет List.copyOf(values).

    Тогда удаление последнего цвета обязано дать Empty, потому что Colors пустым существовать отказывается. switch по Palette с шаблонами записей тоже проверяется на полноту, так что четвёртое состояние, добавленное позже, сломает каждый исчерпывающий switch, где его нет. Вариант со списком и флагом ничего из этого не получает.

  4. Ссылка на ответ

    Но Just [] это та самая дыра, на которую указал oskar91. В Elm я бы написала type Palette = NotEntered | Empty | Colors Color (List Color), один обязательный цвет и остальные. Палитра с цветами не может быть пустой по построению, а если в case забыта ветка Empty, компилятор назовёт недостающий шаблон по имени. Честно говоря, это сообщение об ошибке и есть половина причины, почему мне нравится такая кодировка.

Другие стороны того же вопроса

  1. Result сообщает о проваленной проверке, opaque доказывает, что она была

    Все хвалят Gleam за ошибки как значения, и справедливо, Result прекрасен. Но в моделировании данных я сильнее опираюсь на opa…

    Ответы 4gleamelm