Thanks Jonah.

Appreciate the reply, it was very helpful. 


On Monday, September 23, 2013 9:03:35 AM UTC+5:30, jonah wrote:
>
> Hi Murtaza,
>
> The short answer is that  it's not necessarily that there are pros or cons 
> between having components know about each other in their "constructed" vs 
> "started" forms- it's that immutability imposes limitations in the way that 
> components can maintain local references to other components in the context 
> of the composite system global state management pattern Stuart is 
> describing.
>
> If you want to use this pattern and have components that have circular 
> dependencies on each other, those components better have mutable 
> initialization operations. If they don't, the circular dependencies will 
> need to be factored out.
>
> Jonah
>
> ==
> Longer answer with an example-
>
> Stuart's original insight, documented here [1] and referenced in that post 
> has to do with keeping all global system entities- like a database 
> connection, a routing table, a cache, a configuration object, etc, anything 
> that would be a singleton in a generic java application- in a single 
> composite data structure (map, record, vector, etc) that itself can be a 
> local variable, rather than storing each component individually as a global 
> var in a namespace, as has been the informal convention in much open source 
> Clojure application code. This single composite data structure pattern 
> allows for a clean code reloads and application state reconstruction at the 
> repl, easy testability, and a host of other benefits.
>
> However, the pattern is not without its complications. Once you make a 
> commitment to working in accordance with this pattern, you run into the 
> situation where some of those individual singleton components have 
> lifecycle requirements, where after being created/constructed, they need 
> further setup to be made ready for use. A database has to be connected to. 
> A cache has to be started and given a backing store. A configuration object 
> has to be loaded with data.
>
> In that situation you then run into the problem of managing the sequencing 
> of and dependencies between those singleton lifecycle operations. Perhaps 
> the configuration object has to be loaded with data and then given to the 
> database which needs to be opened, and then the opened database connection 
> needs to be given to the cache, which fronts the database. And whatever is 
> done at initialization time to get all those components ready probably has 
> to be undone in the reverse order when the system is shutting down. 
>
> Finally, the last piece that adds complexity to the mix is immutability. 
> From an immutability perspective, the result of a lifecycle initialization 
> operation on a component should be a new version of that component- even if 
> in practice the initialization of the particular component under the covers 
> is some mutable operation. But immutability leading to the expected 
> creation of a new version creates issues when there are dependencies 
> between the components.
>
> For instance, say that the configuration object has to know about the 
> cache, because other objects expect to get the cache through configuration. 
> Then say the cache has to know about the database, because it has to know 
> about its backing store. But then the database may have to know about the 
> configuration object, because that's where it gets credentials and 
> connection URIs from.
>
> With immutability, this cyclical knowledge dependency is impossible to 
> implement, as the new instance of each individual component as it is 
> updated with the knowledge of a predecessor dependent and is initialized, 
> or "started", obviates the reference that a successor dependent was 
> initialized or "started" with. When individual component initialization is 
> a mutable operation, the cyclical update problem goes away- but there is 
> still a bit of code smell because the pattern of preserving the results of 
> what looks to be an immutable operation isn't maintained.
>
> In any event, this is what Stuart is talking about when he makes the 
> distinction between components knowing about each other in the 
> "constructed" forms- as an unconnected database, a non-started cache, etc- 
> and their "started" forms- their post-initialization state of being 
> connected to database or as a cache that is ready for work. 
>
> Hope that helps.
>
> 1. http://thinkrelevance.com/blog/2013/06/04/clojure-workflow-reloaded
>
>
>
> On Fri, Sep 20, 2013 at 1:21 PM, Murtaza Husain <
> murtaza...@sevenolives.com <javascript:>> wrote:
>
>> Hi,
>>
>> I am going through the blog of Stuart Sierra regarding lifecycle 
>> composition. http://stuartsierra.com/2013/09/15/lifecycle-composition
>>
>> In the end there is this para - 
>>
>> "This technique is a form of dependency injection through constructors.
>> The choice of whether to make the individual components mutable,
>> stateful objects has an impact on how I can use them later on. In the
>> original version of this pattern using mutable objects, each component
>> gets stable references to other components it depends on. In the later
>> version using immutable data structures, each component gets
>> references to the *constructed* versions of other components it
>> depends on, but not the *started* versions of those components,
>> i.e. the values returned from start."
>>
>> I am unable to discern the pros and cons of both the versions 
>> (approaches). Any concrete examples will be appreciated. 
>>
>> Thanks,
>> Murtaza
>>
>> -- 
>> -- 
>> 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/groups/opt_out.
>>
>
>

-- 
-- 
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/groups/opt_out.

Reply via email to