I guess a related concern is abstraction. I notice I often have functions
which work at different levels of abstraction in the same ns which makes me
uncomfortable. In OO land they would be package level or even instance
classes. I haven't yet found a way to solve this in clojure land.

To be explicit, I have a defn which calls a defn which calls a defn which
calls ...., having all of those defns public doesn't capture the hierarchy
of abstraction.
On 14 May 2015 17:14, "Sean Corfield" <s...@corfield.org> wrote:

> On May 13, 2015, at 11:07 PM, Brian Craft <craft.br...@gmail.com> wrote:
>
>
> http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)#As_information_hiding_mechanism
>
>
> In an environment where you can’t trust your co-workers(!), you certainly
> want to hide *mutable* data so they can’t modify your objects’ state. When
> you remove mutability, there’s a lot less damage they can do and they it’s
> really more about which pieces of the system do you not want them to "use"
> (in terms of functional APIs).
>
> The "Clojure Way" seems to be "just make all functions public — they might
> be useful to someone" although that then restricts what refactoring you can
> do in future compared to exposing a smaller surface area. Since you can
> always call private functions anyway (and access private data directly),
> you really need conventions — and code review — to prevent abuse, and at
> that point having foo.api and foo.impl namespaces — and a convention to not
> use foo.impl outside of foo.api — is very reasonable and even automatically
> enforceable through tooling.
>
> When I first started doing Clojure (five years ago — yikes! feels like
> yesterday!) I still had an OOP mindset around data hiding and I used
> *defn-* and *^:private* a lot (well, *^{:private true}* back then I
> guess). These days I tend to make all my functions public and use
> namespaces if necessary to clearly delineate APIs vs implementations. A
> *def* of immutable data tends to be public too. It’s rare that I feel the
> need to make things private since immutability means no one can "abuse" my
> data or my functions.
>
> Sean Corfield -- (904) 302-SEAN
> An Architect's View -- http://corfield.org/
>
> "Perfection is the enemy of the good."
> -- Gustave Flaubert, French realist novelist (1821-1880)
>
>
>
>  --
> 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.
>

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

Reply via email to