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

Ah, right - I've mostly been working in application code, not
libraries. That said, I think the heuristic still works - I'd
definitely try writing some code that consumes your library, either in
tests or in a dummy project, and apply the same rule: can you give the
namespace a name that makes function calls clearer? Given a single
name, are there pieces that feel out of place?

This is a topic that comes up a lot, and I think that's at least
partially because different domains and library styles call for
different strategies. An ideal library that does one thing really well
might indeed be a good candidate for one big public namespace, but of
course internally it might make a lot of sense to break the
implementation up into focused modules.

You might check out the clojurewerks libraries for some insight from a
group that has written quite a few libraries:

http://clojurewerkz.org/

Travis

On Mon, Apr 15, 2013 at 11:23 AM, Simon Katz <nomisk...@gmail.com> wrote:
> 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> 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
>> > 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
>> > 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.
>> > 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.
>
>

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