В этом видео Рич Хикки , создатель Clojure, он советует использовать карту для представления данных вместо использования класса для их представления, как это сделано в Java. Я не понимаю, как это может быть лучше, так как как пользователь API может узнать, что такое ключи ввода, если они просто представлены в виде карт.
Пример :
PersonAPI {
Person addPerson(Person obj);
Map<String, Object> addPerson(Map<String, Object> personMap);
}
Во второй функции, как пользователь API может узнать, что является входом для создания человека?
Ответы:
Преувеличенное резюме (ТМ)
Вы получаете несколько вещей.
Есть один фатальный недостаток.
Дело в том, что вы можете получить самоанализ, используя ... самоанализ. Это то, что обычно происходит:
Другими словами, если вам никогда не нужно взаимодействовать с 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 сторона мира может написать любой «легкий» код, который они хотят, и они обычно не кричат на вас, что код медленный.
В общем, использование карты (пакета свойств) вместо объекта является обычным явлением в разработке программного обеспечения. Он не уникален для функционального программирования или каких-либо конкретных типов языков. Это не может быть идиоматическим подходом для любого языка, но есть ситуации, которые требуют этого.
В частности, сериализация / десериализация часто требует аналогичного метода.
Просто некоторые общие мысли относительно "карты как объекта".
источник
commonplace
кажется немного сильным для меня. Я имею в виду, что он используется, как вы описываете, но это также одна из тех печально известных / хрупких вещей (таких как массивы байтов или голые указатели), которые библиотеки стараются изо всех сил скрывать.Это отличный разговор того, кто действительно знает, о чем говорит. Я рекомендую читателям посмотреть все это. Это всего 36 минут.
Одним из его основных моментов является то, что простота открывает возможности для изменений в будущем. Выбор класса для представления
Person
обеспечивает немедленную выгоду от создания статически проверяемого API, как вы указали, но это связано со стоимостью ограничения возможностей или увеличения затрат на изменения и повторное использование в дальнейшем.Он считает, что использование класса может быть разумным выбором, но это должен быть осознанный выбор с полным осознанием его стоимости, и программисты традиционно очень плохо замечают эти затраты, не говоря уже о том, чтобы их учитывать. Этот выбор следует пересмотреть по мере роста ваших требований.
Ниже приведены некоторые изменения кода (одно или два из которых были упомянуты в докладе), которые потенциально проще использовать список карт по сравнению с использованием списка
Person
объектов:Map
примитивов в передаваемый формат, может использоваться многократно и может даже предоставляться в библиотеке. ДляPerson
выполнения той же задачи объекту, вероятно, потребуется собственный код).Мы решаем подобные проблемы постоянно, и у нас есть шаблоны и инструменты для них, но редко задумываемся о том, не упростит ли наша работа более простое и гибкое представление данных в начале.
источник
Choosing a class to represent a Person provides the immediate benefit of creating a statically-verifiable API... but that comes with the cost of limiting opportunities or increasing costs for change and reuse later on.
Неправильно и невероятно неискренне. Это улучшает ваши возможности для внесения изменений позднее, потому что, когда вы вносите критические изменения, компилятор автоматически найдет и укажет для вас все места, которые необходимо обновить, чтобы ускорить работу всей кодовой базы. Именно в динамическом коде, где вы не можете этого сделать, вы действительно привязаны к предыдущему выбору!Если у данных мало или нет поведения с гибким содержимым, которое может измениться, используйте карту. IMO, типичный «javabean» или «объект данных», который состоит из анемичной доменной модели с N полями, N установщиками и N получателями, является пустой тратой времени. Не пытайтесь поразить окружающих своей прославленной структурой, обернув ее в причудливый умный класс. Будьте честны, проясните свои намерения и используйте карту. (Или, если это имеет какой-то смысл для вашего домена, объект JSON или XML)
Если данные имеют существенное реальное поведение, или методы ( скажи, не спрашивай ), используйте класс. И похлопайте себя по спине за использование реального объектно-ориентированного программирования :-).
Если у данных много важных проверочных действий и обязательных полей, используйте класс.
Если данные имеют умеренную степень проверки, это граница.
Если данные запускают события изменения свойств, это на самом деле проще и гораздо менее утомительно с картой. Просто напишите маленький подкласс.
Одним из основных недостатков использования Map является то, что пользователь должен преобразовывать значения в Strings, Ints, Foos и т. Д. Если это очень раздражает и подвержено ошибкам, рассмотрите класс. Или рассмотрите вспомогательный класс, который оборачивает карту соответствующими получателями.
источник
API для
map
имеет два уровня.API можно описать на карте условно. Например, пара
:api api-validate
может быть размещена на карте или:api-foo validate-foo
может быть условной. Карта может даже хранитьapi api-documentation-link
.Использование соглашений позволяет программисту создавать предметно-ориентированный язык, который стандартизирует доступ к «типам», реализованным в виде карт. Использование
(keys map)
позволяет определять свойства во время выполнения.В картах нет ничего волшебного, в объектах нет ничего волшебного. Это все отправка.
источник