<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"	>
<channel>
	<title>Comments on: &#8230; but please do repeat me</title>
	<atom:link href="http://johannesbrodwall.com/2009/02/14/but-please-do-repeat-me/feed/" rel="self" type="application/rss+xml" />
	<link>http://johannesbrodwall.com/2009/02/14/but-please-do-repeat-me/</link>
	<description>Johannes Brodwall&#039;s Musings on Software Architecture and Programming</description>
	<lastBuildDate>Fri, 27 Jan 2012 09:40:00 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>By: dagblakstad</title>
		<link>http://johannesbrodwall.com/2009/02/14/but-please-do-repeat-me/comment-page-1/#comment-127590</link>
		<dc:creator>dagblakstad</dc:creator>
		<pubDate>Wed, 18 Feb 2009 17:01:49 +0000</pubDate>
		<guid isPermaLink="false">http://brodwall.com/johannes/blog/?p=310#comment-127590</guid>
		<description>Important question, and perhaps it&#039;s all about chossing [b]your[/b] evil in the end. There is no silver bullet and easy way out in this I think.&lt;br&gt;&lt;br&gt;But: The evil chosen should be the one least capable of making a mess in your project. This depends on:&lt;br&gt;* How many software clients do you have that will have to be changed when stirring things up?&lt;br&gt;* Sometimes 2 evils can be better than one: Support multiple simultaneous interfaces or versions (4th evil?) so not everyone must  adapt at the same time&lt;br&gt;&lt;br&gt;Shared code require a lot more forethought and careful crafting than unshared. Having good test coverage will be a good help to avoid breaking the contract accidentially, but this is no new thoughts though (at least I hope it is not)</description>
		<content:encoded><![CDATA[<p>Important question, and perhaps it&#39;s all about chossing [b]your[/b] evil in the end. There is no silver bullet and easy way out in this I think.</p>
<p>But: The evil chosen should be the one least capable of making a mess in your project. This depends on:<br />* How many software clients do you have that will have to be changed when stirring things up?<br />* Sometimes 2 evils can be better than one: Support multiple simultaneous interfaces or versions (4th evil?) so not everyone must  adapt at the same time</p>
<p>Shared code require a lot more forethought and careful crafting than unshared. Having good test coverage will be a good help to avoid breaking the contract accidentially, but this is no new thoughts though (at least I hope it is not)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: dagblakstad</title>
		<link>http://johannesbrodwall.com/2009/02/14/but-please-do-repeat-me/comment-page-1/#comment-106284</link>
		<dc:creator>dagblakstad</dc:creator>
		<pubDate>Wed, 18 Feb 2009 09:01:49 +0000</pubDate>
		<guid isPermaLink="false">http://brodwall.com/johannes/blog/?p=310#comment-106284</guid>
		<description>Important question, and perhaps it&#039;s all about chossing [b]your[/b] evil in the end. There is no silver bullet and easy way out in this I think.&lt;br&gt;&lt;br&gt;But: The evil chosen should be the one least capable of making a mess in your project. This depends on:&lt;br&gt;* How many software clients do you have that will have to be changed when stirring things up?&lt;br&gt;* Sometimes 2 evils can be better than one: Support multiple simultaneous interfaces or versions (4th evil?) so not everyone must  adapt at the same time&lt;br&gt;&lt;br&gt;Shared code require a lot more forethought and careful crafting than unshared. Having good test coverage will be a good help to avoid breaking the contract accidentially, but this is no new thoughts though (at least I hope it is not)</description>
		<content:encoded><![CDATA[<p>Important question, and perhaps it&#39;s all about chossing [b]your[/b] evil in the end. There is no silver bullet and easy way out in this I think.</p>
<p>But: The evil chosen should be the one least capable of making a mess in your project. This depends on:<br />* How many software clients do you have that will have to be changed when stirring things up?<br />* Sometimes 2 evils can be better than one: Support multiple simultaneous interfaces or versions (4th evil?) so not everyone must  adapt at the same time</p>
<p>Shared code require a lot more forethought and careful crafting than unshared. Having good test coverage will be a good help to avoid breaking the contract accidentially, but this is no new thoughts though (at least I hope it is not)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Christian Rørdam</title>
		<link>http://johannesbrodwall.com/2009/02/14/but-please-do-repeat-me/comment-page-1/#comment-106121</link>
		<dc:creator>Christian Rørdam</dc:creator>
		<pubDate>Tue, 17 Feb 2009 06:30:03 +0000</pubDate>
		<guid isPermaLink="false">http://brodwall.com/johannes/blog/?p=310#comment-106121</guid>
		<description>An important discussion, and I think you summarize the dilemma quite well.&lt;br&gt;&lt;br&gt;May I add a point:&lt;br&gt;Sometimes you need a new module that starts out identical to some&lt;br&gt;other module, but actually it is totally independent of the other&lt;br&gt;module and will most likely divert more and more from it. In that case&lt;br&gt;I think you will be better off just copying the whole thing and let it&lt;br&gt;live its own life. I think.</description>
		<content:encoded><![CDATA[<p>An important discussion, and I think you summarize the dilemma quite well.</p>
<p>May I add a point:<br />Sometimes you need a new module that starts out identical to some<br />other module, but actually it is totally independent of the other<br />module and will most likely divert more and more from it. In that case<br />I think you will be better off just copying the whole thing and let it<br />live its own life. I think.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: jhannes</title>
		<link>http://johannesbrodwall.com/2009/02/14/but-please-do-repeat-me/comment-page-1/#comment-105843</link>
		<dc:creator>jhannes</dc:creator>
		<pubDate>Sun, 15 Feb 2009 14:16:13 +0000</pubDate>
		<guid isPermaLink="false">http://brodwall.com/johannes/blog/?p=310#comment-105843</guid>
		<description>Projects do go though such cycles. And your point is very important: At different stages, different choices will be better.&lt;br&gt;&lt;br&gt;However, I&#039;ve seen many instances of code never reaching sufficient maturity before the project becomes too large to avoid a (possibly de facto) code freeze. It is important to recognize this likely failure mode and treat it serious if it occurs.&lt;br&gt;&lt;br&gt;I&#039;ve seen a few examples that especially domain objects end up having this fate. The open-closed principle is often not the way to go for domain entities. This means that  a stable domain model soon may feel anemic.</description>
		<content:encoded><![CDATA[<p>Projects do go though such cycles. And your point is very important: At different stages, different choices will be better.</p>
<p>However, I&#39;ve seen many instances of code never reaching sufficient maturity before the project becomes too large to avoid a (possibly de facto) code freeze. It is important to recognize this likely failure mode and treat it serious if it occurs.</p>
<p>I&#39;ve seen a few examples that especially domain objects end up having this fate. The open-closed principle is often not the way to go for domain entities. This means that  a stable domain model soon may feel anemic.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Eivind</title>
		<link>http://johannesbrodwall.com/2009/02/14/but-please-do-repeat-me/comment-page-1/#comment-105842</link>
		<dc:creator>Eivind</dc:creator>
		<pubDate>Sun, 15 Feb 2009 14:05:40 +0000</pubDate>
		<guid isPermaLink="false">http://brodwall.com/johannes/blog/?p=310#comment-105842</guid>
		<description>This subject has interested me for a long time. Thank you for bringing it up. Isn&#039;t there a life cycle here, and won&#039;t changing options over time help?&lt;br&gt;&lt;br&gt;You sketch three different approaches, that I attempt to rephrase as follows:&lt;br&gt;1. Duplicate code, so that change at one place does not affect code somewhere else, but at the cost of duplicated changes of common logic&lt;br&gt;2. Share code, to avoid duplicated changes of common logic, but at the cost of requiring change in all the clients when the logic of any of the suppliers changes&lt;br&gt;3. Do not allow changes, to avoid both of the inconveniences above, but at the cost of conserving unsatisfactory solutions&lt;br&gt;&lt;br&gt;I tend to think that the solution will change over time.&lt;br&gt;* Initial code is unstable and has only a few clients. Apply approach 2.&lt;br&gt;* As code matures and stabilizes, fix its contract (precondition and postcondition). Apply rule 3 and the open/closed principle.&lt;br&gt;* A subsequent change may of may not break the contract.&lt;br&gt;   1. If it does not (weaker precondtion, stronger postcondition), there is nothing to worry about - clients are not affected by the change. All tests will pass unchanged.&lt;br&gt;   2. If it does, apply rule 1 and define a new function for the new contract, possibly making the old definition deprecated to leave a transision time for the clients.&lt;br&gt;&lt;br&gt;Just some thoughts.</description>
		<content:encoded><![CDATA[<p>This subject has interested me for a long time. Thank you for bringing it up. Isn&#39;t there a life cycle here, and won&#39;t changing options over time help?</p>
<p>You sketch three different approaches, that I attempt to rephrase as follows:<br />1. Duplicate code, so that change at one place does not affect code somewhere else, but at the cost of duplicated changes of common logic<br />2. Share code, to avoid duplicated changes of common logic, but at the cost of requiring change in all the clients when the logic of any of the suppliers changes<br />3. Do not allow changes, to avoid both of the inconveniences above, but at the cost of conserving unsatisfactory solutions</p>
<p>I tend to think that the solution will change over time.<br />* Initial code is unstable and has only a few clients. Apply approach 2.<br />* As code matures and stabilizes, fix its contract (precondition and postcondition). Apply rule 3 and the open/closed principle.<br />* A subsequent change may of may not break the contract.<br />   1. If it does not (weaker precondtion, stronger postcondition), there is nothing to worry about &#8211; clients are not affected by the change. All tests will pass unchanged.<br />   2. If it does, apply rule 1 and define a new function for the new contract, possibly making the old definition deprecated to leave a transision time for the clients.</p>
<p>Just some thoughts.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

