On Tue, Jun 9, 2015 at 6:12 AM, Timothy Baldridge <tbaldri...@gmail.com>
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 <ja...@booleanknot.com>
> 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 <d...@drusellers.com> 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 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.
>>
>
>
>
> --
> “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 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.
>



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