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 <[email protected]
>> <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 [email protected]
>> <javascript:>
>> > Note that posts from new members are moderated - please be patient with
>> your
>> > first post.
>> > To unsubscribe from this group, send email to
>> > [email protected] <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 [email protected] <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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.