This could be one way to solve the problem in the example and keep a uniform API: (def joe {:age ((fn [] (- 2011 1979)))}) (:age joe) #> 32
Any comments on that? On Jun 15, 8:41 pm, Colin Yates <colin.ya...@gmail.com> wrote: > Newbie so go gentle please :). > > I am an experienced OO Java developer (decade +) considering jumping fence > to a functional language, and clojure is pretty high up on the list for a > number of reasons. > > I am so used to defining everything as objects which are sealed units of > state and behaviour that I am struggling to see how to solve the same > problem with clojure. I desperately wish somebody would write a "domain > driven design with clojure" :). > > In brief, in OO state is exposed via a well defined API. That state may be > simple properties (values) or it may be calculations (functions). And > critically, the decision as to whether it is a value or a function is an > implementation concern. The Java Bean spec defines accessors for properties > of a class, behind which lies the logic of how to retrieve that state. So, > the very common Person class will expose get/setName(), get/setAge() etc. > and as a consumer I have no idea how the results are calcualted. > > In Clojure, if I understand correctly, the preferred way would be to use a > map (or defstruct) with keys such as :name and :age. These are then > retrieved as (person :name) and (person: age) etc. > > My question is if I suddenly decided that one of those values is best > implemented as a calculation, how can I seamlessly implement that. By > seamless I mean implement it without updating any consumers of a person? > For example, if I changed the age property to be the result of a function, > I could either replace the value of age with a function that calculates age > or write a function(person)->age. > > Both of those are disruptive to the consumers of person. > > I understand that clojure is about explicitly distinguishing between state > and functions, but I see this as a high price to pay. Have I missed > something? The OO in me is saying "well, never introspect a map directly, > rather provide get-X(person) functions" but that is very very noisy. > > That's enough for now - this is, I expect, the first of many cries for help > :) > > Thanks in advance to all who reply! -- 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