new to clojure, in the process of unlearning years of OO.  sorry for the 
long post.

struggling with a design/impl and hoping to get some outside opinions so I 
can understand my options (clojure better)

basic concepts are straightforward and in a nutshell I'm modeling entities 
and relationships  (aren't we all)

---

created a pool of entities (people and groups) implemented as maps.  each 
map has a :rels which is set of relationships to other entities.  the pool 
is an atom.

first approach; relationships are in the entity, add RHS entities into the 
LHS :rels.  the state of the RHS can change, I need the latest state of RHS 
not as it was when the relationship was created. I decided not to make each 
entity a ref (ref, atom, agent), it seemed too fine grained. *thoughts?*

each entity has a uuid

second approach, a pool of relationships (:lhs uuid :rhs uuid :type x). 
pool has all the relationships, also an atom.  the pool has lots of 
benefits it "improves" other parts of the code.

it doesn't solve the original problem, just moves it around, i still can't 
put the actual RHS, so i'm using the uuid as a reference, i look up RHS get 
the latest. (second guessing why didn't i make them atoms and use @uuid).

now my relationships aren't embedded in my entity, that doesn't feel right, 
anyone dealing with the entity should still be able to say... (:rels 
entity) and get the relationships, so i add a function to :rels that 
returns all the relationship based on the uuid of the LHS, this works 
great. syntax changes and requires me to use ((:rels entity)).

*the problem is... (assumes everything within a single process)*

I want to pass this data structure around and now dereferencing is bleeding 
out.  Instead of passing around a data structure, I'm passing around a data 
structure that has functions embedded in it.  which seems like a cool idea, 
but now the callee needs to know that :rels returns a function, when it's 
supposed to have data in it. (which is the same thing?) but I don't know 
how to treat it seamlessly.  (i have not considered eval).

for the :rels it's not too bad.  doesn't feel like I'm using all the power 
correctly, but it works.

*additional problem is, my rels look like this.*

(:lhs uuid :rhs uuid :type x)

 :lhs and :rhs "should be" entities, not references.  more functions?  I 
make :lhs and :rhs return functions which dereference entities. of course 
that makes selecting from rel-pool much harder 

that's when I knew I had to seek professional help [image: (smile)]

even with a long post hard to capture all the requirements... 


   1. the pools aren't supposed to be "public" so I can't have all the 
   callee functions understanding how to do the dereference.  
   2. the :rels function isn't one function, the truth is the rels-pool 
   doesn't have all relationships, some are virtual, the function creates them 
   on the fly, each entity could have it's own version of "get-relationships"
   
any help is appreciated.

i've considered

   - creating a function that "denormalizes" the data before sending it out 
   to.  now its fully formed but i lose some recency (not much diff i know)
   - centralizing all the derefs functions - so the callee knows that all 
   the data isn't embedded but the functions don't live in structure, just the 
   uuids... that works well for LHS/RHS deref, but makes the per entity 
   virtual relationships much harder.  
   - rethinking my atom granularity and using @ but i don't think that 
   really helps


thanks for reading

-- 
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/groups/opt_out.

Reply via email to