Jason, the summary is good, but I'm missing the more efficient data structure array-map that probably wastes less space than the hash-map for the same size of object. [1]
Also Zach Tellman has made some effort with clj-tuple which however use indexes, not keys. [2] [1] http://clojuredocs.org/clojure.core/array-map [2] https://github.com/ztellman/clj-tuple /Linus 2014-10-22 6:25 GMT+02:00 Jason Wolfe <ja...@w01fe.com>: > Hi Tom, > > Maybe this post from would be of use? > > > https://github.com/Prismatic/eng-practices/blob/master/clojure/20130926-data-representation.md > > It's my best attempt (albeit a year or so old) to answer many of these > questions. Happy to answer questions if you've got them. > > Cheers, > Jason > > On Thursday, October 16, 2014 2:19:32 PM UTC-7, Tom Oram wrote: >> >> Hello Clojure people, >> >> First up, apologies because this is going to be a long message. Howver, >> if you do have the time to read and respond, then I would be extremely >> grateful! >> >> Recently I've decided to give Clojure a proper go. Over the past year or >> so I've paid it a bit of attention: I've read books all about how to use it >> and I've spent a bit of time working through tutorials to create little web >> apps and so on. I understand the language (although not to any great depth >> yet), but I'm still unsure about the best approaches to actually working >> with it. >> >> I've got many years of OOP experience, and I'm a big fan of principles >> like SOLID and approaches like DDD. What I want to do now is, try and learn >> how to build well designed models using Clojure, while using best >> practices! I've started having a bit of a crack at it by building a simple >> app, but I'm finding myself trying to transfer a lot of my existing OOP >> techniques into Clojure. It's working, but I'm wandering if I'm overdoing >> it or perhaps just not doing things "the Clojure way". >> >> So, my very first question is are there any good books or resources on >> modelling, application architecture or best practices, using Clojure? >> >> Next up, maps vs records. I've read that the typical approach is to use >> maps until the design starts to solidify and then you can move to records. >> Is the the general attitude of Clojure developers or do some like to dive >> straight in with records? >> >> The next question is encapsulation: I've taken the approach that I'm kind >> of using namespaces like classes. If I want to create customer entity I >> create a namespace for it, then add a "make" function to it which returns a >> map of the right "shape". I'm then shying away from accessing the map >> directly, and rather doing it through other methods in the namespace which >> take the instance as a parameter. E.g. >> >> (ns app.domain.customer) >> >> >> (defn make [name, email] >> {:name name >> :email email}) >> >> >> (defn get-name [customer] >> (:name customer)) >> >> Is this a reasonable approach? If not, what might be a better one? >> >> This leads on to safety and defensive programming. Using the approach >> above, how much "type safety" is required? Obviously, in any API which is >> going to be used by other programmers, you've got to handle bad inputs >> well. But what is the Clojure approach in the "domain model"? Coming from >> the DDD mindset, where models are designed to be un-breakable, part of me >> wants to use records for all entities and typehint for them everywhere. >> However, I wander if the Clojure way is more about rigorous testing to make >> sure the wrong values don't get put in in the first place? Also, what about >> libraries like https://github.com/Prismatic/schema, this could be used >> in :pre conditions to be more explicit, is that a common thing? >> >> Next up, how far do you go with creating "types" vs using primitives? >> Again, referring back to DDD, both the email and the name in the example >> above are suitable candidates for value objects. In Clojure, would you >> consider hiding the data behind a set of specialised functions to create, >> access and use it? Or would you just pass the primitive >> string/map/vector/whatever about and work on it directly? Example: >> >> >> ; Given >> (defn make-customer [name email] >> {:name name, :email email}) >> >> ; Examples >> >> (def customer1 (make-customer "Tom" "em...@address.com")) >> >> ; vs... >> >> (defn make-name [name] name) >> >> (defn make-email [email] email) >> >> (def customer2 >> (make-customer (make-name "Tom") >> (make-email "em...@address.com"))) >> >> >> >> I think that's all I want to ask about now. I do have other questions >> about dependency inversions, but I'll leave that for another time. If >> you've read this far then thank you very very much! Also,I know that no one >> really wants to just sit and read though random peoples code, but, if you >> are interested in my (very very early stages) experimental project, then >> I've put in on https://github.com/tomphp/clojure-cocktails - any >> comments, critiques, PRs or questions would be really great! >> >> Thanks you so much for your times and I look forward to any thoughts or >> suggestions! >> Tom >> > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.