You might wish to consider a different data structure. For example, the
inner objects might be better off as maps with named keys, so your lookup
keys would be things like :amount rather than 5. And instead of out of band
values like the string "N/A" you'd just omit a mapping in such cases. At
the very least you may wish to consider using nil instead of "N/A" as an
out of band value for "not there".

But a map would allow easily adding more data later on, as well as enable
giving the lookup keys meaningful names, and would keep the existing keys
stable when new ones were added. A map may also perform better if you end
up with a lot of optional keys, as missing mappings don't take up space
while "N/A" values in a vector do.

As for naming integer positions using constants, such as (def amount 5),
there are two weaknesses with that approach.

First, inserting new values will shift all of the existing ones that are
farther to the right to higher indices, so you'd have to change "amount" to
6 and hope you hadn't missed any direct lookups with 5 instead of amount.
But if you use a map with a key of :amount, adding more keys can never move
the actual amount value away from :amount.

And second, you can namespace keys to avoid collisions, with :my-ns/amount
and :other-ns/amount not colliding. You can namespace def'd integer
constants too, with (in-ns 'my-ns) (def amount 5) and (in-ns 'other-ns)
(def amount 7), but if one day you end up with a situation where two
namespaces def two different things to the key 5, the namespacing isn't
going to help you.

Maps with named and namespaceable :keyword keys are much more robust and
scalable in large (or potentially-in-the-future-large) projects and in the
presence of many optional keys. With Clojure, it's strongly recommended to
use maps with named keys instead of positionally-significant entries in
vectors to represent structured tuples of data like you seem to have here.
The robustness becomes especially significant if you save and load data and
keep old data around as the application grows. If you reorder the vectors,
or insert new fields before existing ones, and then read in old data, the
values will end up with the wrong keys, whereas if you use maps, keywords,
and edn format the values in old data can never end up reading back in with
the wrong keys (as long as you never rename already-used keys for any
reason, which with meaningful names and especially namespacing you should
never need to do).

-- 
-- 
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