If you find yourself passing the same argument over and over, you can 
always work in a partial:

(def save-account (partial save db))


On Sunday, February 8, 2015 at 6:47:29 PM UTC+1, Colin Yates wrote:
>
> I missed the salient point about data transformations which is that of 
> abstractions. In OO (Java at least) almost everything was a special case, 
> in Clojure it is the polar opposite; almost nothing is a special case. 
>
> It is astonishing how many domains can be sufficiently modeled as a 
> sequence of maps [{..} {..} ...] and can be sufficiently transformed with 
> the 'map' function (with assoc/assoc-in).
>
> On Sunday, 8 February 2015 17:16:40 UTC, 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