I'm considering going this way.  I definitely like that it keeps things 
simpler for me (the implementer), but clients have to know about multiple 
namespaces rather than a single namespace and I don't like that.

I must say I'm finding it hard to decide which way to go.

On Monday, 15 April 2013 15:31:49 UTC+1, travis vachon wrote:
>
> For what it's worth, I've been refactoring big namespaces out into 
> small, focused namespaces lately. A rough heuristic I've found useful 
> is that when I require a namespace I should be able to assign it a 
> name that aids with readability. 
>
> So for example: 
>
> (ns foo.book) 
>
> (defn search [book term] 
>   ;;search the book 
>   ) 
> ------ 
> (ns foo.stacks) 
>
> (defn search [stacks title] 
> ;; search stacks 
> ) 
> ------ 
> (ns foo.library 
>   (require [foo.book :as book] 
>               [foo.stacks :as stacks])) 
>
> (defn find-passage [stacks passage title] 
>   (-> stacks 
>        (stacks/search title) 
>        (books/search passage))) 
> ----- 
>
> This is all pretty contrived, but it seems to work out in the wild 
> pretty well. YMMV, and I'm still not settled on this myself, but 
> hopefully that helps. 
>
> Travis 
>
>
>
>
>
> On Sun, Apr 14, 2013 at 2:16 PM, Simon Katz <nomi...@gmail.com<javascript:>> 
> wrote: 
> > Whoops — when I said "with an extra [namespace] for each protocol", I 
> meant 
> > "with an extra [namespace] for each protocol implementation". 
> > 
> > 
> > On Sunday, 14 April 2013 18:21:19 UTC+1, Simon Katz wrote: 
> >> 
> >> I'm in the process of trying to work out how I want to use namespaces 
> when 
> >> implementing libraries or subsystems. 
> >> 
> >> I'm aware of several approaches: 
> >> 
> >> Use a single namespace, making only the API public (either with 
> everything 
> >> in a single file or breaking things into multiple files and using 
> `load`). 
> >> Use implementation namespaces and create an API in a separate namespace 
> >> (perhaps using Potemkin to simplify the creation of the API). 
> >> Have lots of smaller namespaces and have the client need to know which 
> of 
> >> the smaller namespaces to use for what. 
> >> (And some variations.) 
> >> 
> >> 
> >> I'm fairly happy with large namespaces, so I'm leaning towards using a 
> >> single namespace. 
> >> 
> >> There's one thing I've come across that doesn't fit nicely with putting 
> >> everything into a single namespace, though.  A Google search for 
> "Clojure in 
> >> the Large" led me to a nice talk by Stuart Sierra 
> >> (http://vimeo.com/46163090) in which he suggests putting protocols and 
> their 
> >> implementations in separate namespaces, because, during development 
> >> reloading a protocol breaks existing instances.  (I know Stuart gave a 
> >> similarly presentation at Clojure West recently, but I don't think the 
> video 
> >> of that is available yet.) 
> >> 
> >> Having the separate namespaces would be fine if I was heading down the 
> >> route of having the client know about multiple namespaces, but I don't 
> >> really want to do that.  With the single namespace approach (with an 
> extra 
> >> one for each protocol I define), I end up wanting circular dependencies 
> — a 
> >> namespace containing a protocol implementation needs to refer to the 
> main 
> >> namespace in order to mention the protocol, and the main namespace 
> needs to 
> >> refer to the namespaces containing protocol implementations in order to 
> >> invoke constructors. 
> >> 
> >> Maybe I'll just put everything in a single namespace and be careful 
> about 
> >> reloading the whole thing when I care about existing instances of 
> protocols. 
> >> 
> >> Any other suggestions? 
> >> 
> >> Simon 
> > 
> > -- 
> > -- 
> > You received this message because you are subscribed to the Google 
> > Groups "Clojure" group. 
> > To post to this group, send email to clo...@googlegroups.com<javascript:> 
> > Note that posts from new members are moderated - please be patient with 
> your 
> > first post. 
> > To unsubscribe from this group, send email to 
> > clojure+u...@googlegroups.com <javascript:> 
> > 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+u...@googlegroups.com <javascript:>. 
> > For more options, visit https://groups.google.com/groups/opt_out. 
> > 
> > 
>

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