Преувеличенное резюме (ТМ)
Вы получаете несколько вещей.
- Прототип наследования и клонирования
- Динамическое добавление новых свойств
- Сосуществование объектов разных версий (уровней спецификации) одного и того же класса.
- Объекты, принадлежащие к более поздним версиям (уровням спецификации), будут иметь дополнительные «необязательные» свойства.
- Самоанализ свойств, старых и новых
- Самоанализ правил проверки (обсуждается ниже)
Есть один фатальный недостаток.
- Компилятор не проверяет строки с ошибками для вас.
- Инструменты автоматического рефакторинга не будут переименовывать имена ключей свойств, если вы не заплатите за причудливые.
Дело в том, что вы можете получить самоанализ, используя ... самоанализ. Это то, что обычно происходит:
- Включить отражение.
- Добавьте большую библиотеку самоанализа в свой проект.
- Отметьте различные методы и свойства объекта с помощью атрибутов или аннотаций.
- Пусть библиотека самоанализа сделает волшебство.
Другими словами, если вам никогда не нужно взаимодействовать с FP, вам не нужно принимать советы Rich Hickey.
И последнее, но не по значимости (и не самое красивое), хотя использование в String
качестве ключа свойства имеет самый простой смысл, вам не нужно использовать String
s. Многие унаследованные системы, в том числе Android ™, широко используют целочисленные идентификаторы во всей структуре для ссылки на классы, свойства, ресурсы и т. Д.
Android является товарным знаком Google Inc.
Вы также можете сделать оба мира счастливыми.
Для мира Java реализуйте методы получения и установки как обычно.
Для мира FP реализуйте
Object getPropertyByName(String name)
void setPropertyByName(String name, Object value) throws IllegalPropertyChangeException
List<String> getPropertyNames()
Class<?> getPropertyValueClass(String name)
Внутри этих функций, да, некрасивый код, но есть плагины IDE, которые заполнят это для вас, используя ... умный плагин, который читает ваш код.
С Java стороны все будет так же производительно, как обычно. Они никогда не будут использовать эту уродливую часть кода. Возможно, вы даже захотите скрыть это от Javadoc.
FP сторона мира может написать любой «легкий» код, который они хотят, и они обычно не кричат на вас, что код медленный.
В общем, использование карты (пакета свойств) вместо объекта является обычным явлением в разработке программного обеспечения. Он не уникален для функционального программирования или каких-либо конкретных типов языков. Это не может быть идиоматическим подходом для любого языка, но есть ситуации, которые требуют этого.
В частности, сериализация / десериализация часто требует аналогичного метода.
Просто некоторые общие мысли относительно "карты как объекта".
- Вы все еще должны предоставить функцию для проверки такой «карта как объект». Разница в том, что «карта как объект» позволяет использовать более гибкие (менее ограничительные) критерии проверки.
- Вы можете легко добавить дополнительные поля к «карте как объекту».
- Чтобы указать минимальные требования к действительному объекту, вам необходимо:
- Перечислите «минимально необходимый» набор ключей, ожидаемых на карте
- Для каждого ключа, значение которого необходимо проверить, укажите функцию проверки значения
- Если существуют правила проверки, которые должны проверять несколько значений ключей, укажите это также.
- В чем выгода? Предоставление спецификации таким способом является интроспективным: вы можете написать программу для запроса минимально необходимого набора ключей и для получения функции проверки для каждого ключа.
- В ООП все они свернуты в черный ящик под названием «инкапсуляция». Вместо машиночитаемой логики проверки вызывающая сторона может читать только читаемую человеком «документацию по API» (если, к счастью, она существует).