@Dru, I feel I'm ahead of you in learning Clojure, but I'm not yet to where 
@Colin is. However, I'm close enough that I recognize how accurate and 
concise his advice is--in fact, I'm saving it to remind myself!

Also, I just finished reading Functional Programming Patterns in Scala and 
Clojure, by Michael Bevilacqua-Linn (Pragmatic Programmer, publisher). In 
it, he takes standard OO patterns, gives Java examples, then shows how the 
same things are accomplished in functional style in Scala and Clojure. I 
found it to be very instructive.

A similar book by Brian Marick, a well-known Clojure programmer, is at 
https://leanpub.com/fp-oo. I haven't read it, but it looks promising.

Good luck on your learning!

-- Gregg

On Sunday, February 8, 2015 at 9:16:40 AM UTC-8, Colin Yates wrote:
>
> +1 This separation of behaviour and state is a key part of Clojure's 
> philosophy. That isn't to say that stateful components are bad as such 
> (Stuart Sierra's https://github.com/stuartsierra/component is an 
> obvious analog here) only that they aren't a given as they are in OO 
> languages. 
>
> As Jony says, when functions only depend on their parameters it makes 
> many things simpler and more flexible, but can appear 'noisy'. 
>
>
> http://thinkrelevance.com/blog/2009/08/12/rifle-oriented-programming-with-clojure-2
>  
> is another good resource here, although I must say I haven't seen some 
> of those examples in the wild :). 
>
> From a similar background (Java) and having learnt some lessons, I 
> wish somebody hammered me on the head with the following: 
>  - get real familiar with the notion of data transformations, particularly 
> maps 
>  - internalise map, reduce, filter, apply, loop/recur and into 
>  - before writing any code check the API doesn't already provide it 
>  - repeat the above three points 
>  - embrace vanilla maps, they really are all you need (and also watch 
> https://www.youtube.com/watch?v=ZQkIWWTygio) 
>  - small functions (10 lines is uncomfortable) always 
>  - embrace pre/post conditions, documentation (defn doc and 
> marginalia) and prismatic schema 
>  - read as much Clojure code as you can get your hands on 
>  - TDD is still a helpful process/technique in Clojure ;) 
>
> Longer term, watch anything from Rich Hickey. 
>
> By far the biggest conceptual shift was thinking in terms of data 
> being the public API and data transformation over blobs of state and 
> data. 
>
> Hope this helps. 
>
>
> On 8 February 2015 at 14:21, Jony Hudson <jonye...@gmail.com <javascript:>> 
> wrote: 
> > To put take a different angle on it: you might soon get to *like* that 
> it's 
> > usual to pass in everything as a parameter explicitly. It has the 
> advantage 
> > that it's easy to reason about what a function does just by looking at 
> the 
> > function. In the example above, when reading AccountRepository.Save you 
> need 
> > to check elsewhere to see how _connection is defined. Whereas with the 
> > function save, so long as the parameters you feed in are sensible, then 
> you 
> > can be pretty sure what it will do. 
> > 
> > Making the functions self-contained like this is also a boon when it 
> comes 
> > to working at the REPL. The OO approach you have often makes it 
> difficult 
> > (for less trivial examples) to run a particular function in the right 
> > context. But with the self-contained function it's just a case of 
> getting 
> > the parameters right, which is often easier to think about. 
> > 
> > 
> > Jony 
> > 
> > 
> > On Saturday, 7 February 2015 16:07:45 UTC, Dru Sellers wrote: 
> >> 
> >> Greetings, 
> >> 
> >> I am trying to convert my mind from OO (C#) to one more functionally 
> >> friendly. I am increasingly comfortable with simple applications in 
> clojure, 
> >> but as I start to build more complex applications, I start to fall down 
> >> about how to structure my application. I don't want to just shove OO 
> ideas 
> >> into the functional nature of Clojure. I'm looking for any help someone 
> can 
> >> provide to help shimmy my brain into the right mental patterns. 
> >> 
> >> Background: Long time C# developer who leans heavily on IoC / DI / 
> >> Interfaces / Testing / Object Encapsulation. 
> >> 
> >> 
> >> Specific Question: Object Encapsulation 
> >> I feel like my function parameter lists are much "wider" than they 
> would 
> >> be in C#. This is due to the "lack" of a constructor. So if I 
> previously had 
> >> a C# class that looked like: 
> >> 
> >> 
> >> public class AccountRepository : IAccountRepository 
> >> { 
> >>   IDatabaseConnection _connection; 
> >> 
> >>   public AccountRepository(IDatabaseConnection connection) 
> >>   { 
> >>     _connection = connection; 
> >>   } 
> >> 
> >>   public void Save(Account account) 
> >>   { 
> >>     _connection.Execute("UPDATE accounts SET coupon=@coupon WHERE 
> id=@id", 
> >> { coupon = account.Coupon, id=account.Id}); 
> >>   } 
> >> } 
> >> 
> >> In the above I have encapsulated the "_connection", the other methods 
> >> don't have to deal with it. In Clojure (especially if you are following 
> >> Sierra's Component pattern) you end up with 
> >> 
> >> (defn save [db account] 
> >>   (update db (:coupon account) (:id account)) 
> >> ) 
> >> 
> >> I end up having to pass this 'db' around all over the place. I think 
> that 
> >> this is just something I'll have to get used to more than anything. Am 
> I 
> >> missing anything? 
> >> 
> >> Thank you for your time. 
> >> 
> >> -d 
> > 
> > -- 
> > 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/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