On Tue, Jun 9, 2015 at 6:12 AM, Timothy Baldridge <[email protected]>
wrote:
> Stuart addresses two anti-patterns in your PRs. Perhaps I can help explain
> them.
>
> Let's say we have a system that looks like this:
>
> (defrecord DBConnection [])
>
> (defrecord DBLayer [db-connection])
>
> (defrecord AppLayer [db-layer])
>
> We can construct a system thusly:
>
> {:db-connection (->DBConnection ...)
> :db-layer (->DBLayer ...)
> :app-layer (->AppLayer ...)}
>
> And start it up:
>
> (def my-system (start-system system-map))
>
>
> First of all, what you need to recognize is that every component now has
> it's dependencies assoc'ed into the component. So each component should
> only deal with it's local view of the system:
>
> (defrecord AppLayer [db-layer]
> IDoStuff
> (do-stuff [this]
> (print-data (get-data db-layer)
> (get-data2 (:db-layer this)))
>
> What should not happen is that the AppLayer should do this:
>
> (print-data (:db-layer my-system))
>
> If a component does this it now has access to the entire system, and that
> circumvents one of the reasons component was created, to help improve
> separation of concerns.
>
> In your other example you're doing something like this:
>
> (defrecord AppLayer [db-layer]
> IDoStuff
> (do-stuff [this]
> (run-query (:db-conn db-layer) "select foo from bar")))
>
> The problem with this is that AppLayer is assuming that the db-layer has a
> connection to the db. This also violates the separation of concerns.
> Instead AppLayer should include a db-connection as a dependency if it is
> needed by the app layer code.
>
This is also known as The Law of Demeter. (
http://en.wikipedia.org/wiki/Law_of_Demeter)
- Each unit should have only limited knowledge about other units: only
units "closely" related to the current unit.
- Each unit should only talk to its friends; don't talk to strangers.
- Only talk to your immediate friends.
>
> So that sums up Stuart's two replies. a) don't touch the system from
> inside a component, the system map is only for starting and stopping the
> system, and to provide an entry point. b) don't reach into other components
> from a component
>
>
> Timothy
>
> On Mon, Jun 8, 2015 at 9:35 PM, James Reeves <[email protected]>
> wrote:
>
>> My recommendation is to use a closure. So I'd write your example as:
>>
>> (defn username-endpoint [{:keys [db]}]
>> (routes
>> (GET "/:username" [username]
>> (let [user (users/get-user db username)]
>> (str "<h1>Hello " (:name user) "</h1>")))))
>>
>> So you pass your configuration map into the endpoint function, which
>> returns a handler.
>>
>> You can then wrap this in a component:
>>
>> (defrecord EndpointComponent [build-routes]
>> component/Lifecycle
>> (start [component]
>> (if (:routes component)
>> component
>> (assoc component :routes (build-routes component))))
>> (stop [component]
>> (dissoc component :routes)))
>>
>> Incidentally, the above code is taken directly from Duct
>> <https://github.com/weavejester/duct>, a template and small supporting
>> library I've written for building component-based web apps.
>>
>> I've also written a blog article
>> <https://www.booleanknot.com/blog/2015/05/22/structuring-clojure-web-apps.html>
>> around
>> general best practice for this type of style.
>>
>> - James
>>
>>
>> On 8 June 2015 at 22:51, Dru Sellers <[email protected]> wrote:
>>
>>> So, I guess I am a bit lost, how does someone actually use component? I
>>> have an application all set up with it and it seems to be working as I
>>> would expect but Stuart seems to be steering me in a different direction.
>>>
>>> https://github.com/stuartsierra/component/pull/35
>>>
>>> https://github.com/stuartsierra/component/issues/34
>>>
>>> So I'll try and paint a full picture.
>>> https://gist.github.com/drusellers/8109dce4b9fb19c14ebb
>>>
>>> I know compojure and component / reloaded may not play well, but I'm
>>> trying to figure out how to best use the system var. Am I close, I'd love
>>> to give back a decent PR to the README.md of the component repo to help
>>> others as they come along.
>>>
>>> -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]
>>> 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.
>>>
>>
>> --
>> 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.
>>
>
>
>
> --
> “One of the main causes of the fall of the Roman Empire was that–lacking
> zero–they had no way to indicate successful termination of their C
> programs.”
> (Robert Firth)
>
> --
> 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.
>
--
Kind Regards,
Atamert Ölçgen
◻◼◻
◻◻◼
◼◼◼
www.muhuk.com
www.olcgen.com
--
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.