Most Clojure libraries I've seen only give you a handful of namespaces. I would expect a moderately large Clojure library to expose, say, half a dozen at most. Remember that Clojure has no concept of star imports, even for Java classes, and imports will generally be qualified somehow (e.g. clojure.set :as set), so exposing a large number of fragmented namespaces will make things seriously inconvenient for your users.
On Wednesday, June 25, 2014 6:34:50 PM UTC-7, Mark P wrote: > > I've only recently started real clojure development, so very much still > learning what styles work and what don't. I have a question about naming > attribute getters... > > Suppose I want to model "fruit" entities. I will use a hash-map to > represent the data for each such entity, and will defn a "make" function to > construct fruit instances. I will put "make" and any other fruit-related > functions within a new namespace "myprog.fruit". > > Because my data representation is a map, strictly speaking I don't need > any attribute getter functions. Because I could simply use the attribute > keywords in the map as my getter functions, eg (:color fru). But I will > create actual getter functions within my namespace anyway, for a few > reasons. > > 1. It will signal to any users of my fruit library, which attributes > are "official" and are expected to be used / supported, versus attributes > which are more of an implementation detail. > 2. Some attributes will simply be (defn color [fru] (:color fru)), > whereas others are less direct, eg (defn red? [fru] (= :red fru)) or > another eg (defn packingvol [{:keys [size]}] (* size size size)). > 3. Down the track I can change my data representation, and just > reimplement the getter functions. Users of my fruit library who have > stuck > to my getter functions interface will not need to change a thing. > > This approach seems okay to me so far, though I am open to critiques and > alternative suggestions. But one issue has come to mind... leading to the > question of this post... > > At the end of 2. above, I have defined a local let symbol "size" as part > of the map destructuring. But it so happens I have already defined a size > getter, namely (defn size [fru] (:size fru)). So within the definition of > packingvol my size getter is masked by the local symbol "size". Now I'm > not sure this masking causes much harm... I don't actually need to use the > size getter here, and if I really needed it I could always use > "myprog.fruit/size"... But something still makes me feel uncomfortable > about it, maybe because this masking could end up happening a lot within my > fruit.clj source code file. > > Now I could just switch to a new naming convention for my getters, ie > "color-get", "red?-get", "size-get", "packingvol-get" etc. But I'm not > sure I like the extra verbosity. And for users of my fruit library - who > will be working in a different namespace - this problem mostly goes away as > they will probably be namespace-qualifying access to my getters. > > Is using self-named attribute getters a good idea? > > Thanks, > > Mark. > > -- 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.