Реализация модели данных для предотвращения распространенных ошибок

Кажется, есть несколько способов реализации моделей данных в Clojure:

  • обычные встроенные типы данных (карты / lists / sets / vectors)
  • встроенные типы данных + метаданные - например: (type ^ {: type :: mytype} {: fieldname 1})
  • встроенные типы данных + специальные функции доступа (например, get ting несуществующего ключа из карты вызывает исключение, вместо того, чтобы молча возвращать nil )
  • deftype
  • defstruct
  • defrecord
  • defprotocol

Мы достигли точки, когда карты / списки больше не работают для нас - мы сталкиваемся с множеством ошибок, которые предварительные / постусловия могут легко отловить, но занимают очень много времени в противном случае время выследить (и трудно написать эффективный re / post-условия для функций, которые принимают вложенные карты / списки / векторы), но мы не уверены, что из вышеперечисленного выбрать.

У нас есть три основные цели:

  • написать идиоматический код на Clojure
  • избежать тратить много времени на поиск глупых ошибок типа
  • иметь уверенность в нашей способности изменять / рефакторировать код, незаметно взламывая что-либо

Как мы можем использовать возможности Clojure, чтобы помочь нам?

7
задан Matt Fenwick 26 October 2011 в 18:57
поделиться