<?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:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:rawvoice="http://www.rawvoice.com/rawvoiceRssModule/"
	>
<channel>
	<title>Comments on: Episode 82: Organization of Large Code Bases with Juergen Hoeller</title>
	<atom:link href="http://www.se-radio.net/2008/01/episode-82-organization-of-large-code-bases-with-juergen-hoeller/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.se-radio.net/2008/01/episode-82-organization-of-large-code-bases-with-juergen-hoeller/</link>
	<description>The Podcast for Professional Software Developers</description>
	<lastBuildDate>Tue, 14 May 2013 01:48:59 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
	<item>
		<title>By: edward.young</title>
		<link>http://www.se-radio.net/2008/01/episode-82-organization-of-large-code-bases-with-juergen-hoeller/#comment-21</link>
		<dc:creator>edward.young</dc:creator>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<guid isPermaLink="false">#comment-21</guid>
		<description><![CDATA[I listened to the podcast and was intrigued by the discussion of &quot;jazz&quot; or &quot;jass&quot;, but see no links to it here and would like some more information. 

Thanks!

-Ed]]></description>
		<content:encoded><![CDATA[<p>I listened to the podcast and was intrigued by the discussion of &#8220;jazz&#8221; or &#8220;jass&#8221;, but see no links to it here and would like some more information. </p>
<p>Thanks!</p>
<p>-Ed</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Markus</title>
		<link>http://www.se-radio.net/2008/01/episode-82-organization-of-large-code-bases-with-juergen-hoeller/#comment-22</link>
		<dc:creator>Markus</dc:creator>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<guid isPermaLink="false">#comment-22</guid>
		<description><![CDATA[I think you refer to the Jazz project from the previous episode with Erich Gamma? 

If you go to the previous episode, you&#039;ll find a link there.

Cheers,
Markus]]></description>
		<content:encoded><![CDATA[<p>I think you refer to the Jazz project from the previous episode with Erich Gamma? </p>
<p>If you go to the previous episode, you&#8217;ll find a link there.</p>
<p>Cheers,<br />
Markus</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: chihiro</title>
		<link>http://www.se-radio.net/2008/01/episode-82-organization-of-large-code-bases-with-juergen-hoeller/#comment-23</link>
		<dc:creator>chihiro</dc:creator>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<guid isPermaLink="false">#comment-23</guid>
		<description><![CDATA[Juergen did not give much useful information on how to achieve backwards compatibility.
Perhaps the issue is hindered by java interfaces. 
See what eclipse came up with =&gt;
http://wiki.eclipse.org/FAQ_Why_do_the_names_of_some_interfaces_end_with_the_digit_2%3F

In the case where the modification to an existing contract is merely additional methods &amp; NOT refactorings that would involve promiscuous removals/modifications of existing methods; don&#039;t you think abstract super classes would be better? Will structural typing in &lt;strong&gt;scala&lt;/strong&gt; help in this area ?

However I liked the part about using reflection to detect hibernate versions.
&quot;If it quacks like a duck, it&#039;s a duck&quot;.

Regards,

Gavin Bong
http://raverun.com/jayway]]></description>
		<content:encoded><![CDATA[<p>Juergen did not give much useful information on how to achieve backwards compatibility.<br />
Perhaps the issue is hindered by java interfaces.<br />
See what eclipse came up with =><br />
<a href="http://wiki.eclipse.org/FAQ_Why_do_the_names_of_some_interfaces_end_with_the_digit_2%3F" rel="nofollow">http://wiki.eclipse.org/FAQ_Why_do_the_names_of_some_interfaces_end_with_the_digit_2%3F</a></p>
<p>In the case where the modification to an existing contract is merely additional methods &#038; NOT refactorings that would involve promiscuous removals/modifications of existing methods; don&#8217;t you think abstract super classes would be better? Will structural typing in <strong>scala</strong> help in this area ?</p>
<p>However I liked the part about using reflection to detect hibernate versions.<br />
&#8220;If it quacks like a duck, it&#8217;s a duck&#8221;.</p>
<p>Regards,</p>
<p>Gavin Bong<br />
<a href="http://raverun.com/jayway" rel="nofollow">http://raverun.com/jayway</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ollie</title>
		<link>http://www.se-radio.net/2008/01/episode-82-organization-of-large-code-bases-with-juergen-hoeller/#comment-26</link>
		<dc:creator>Ollie</dc:creator>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<guid isPermaLink="false">#comment-26</guid>
		<description><![CDATA[Hello Jürgen, hello Eberhard,

I enjoyed listening to the episode especially after already having seen Jürgens presentation on that topic on infoq.com. I missed one question that we currently deal with. Spring heavily relies on 3rd party libraries, that of course require further libraries and so on. How do you manage to find a suitable version of transitive library Z if maybe library X relies on Z in version 1.6 and Y relies on Z in 1.8. You might drop in 1.8 and rely on backwards compatibility, but that does not feel quite comfortable to me.

Is there some managed process (Jürgenization - as I was told ;) or at least some best practice?

Regards,
Ollie]]></description>
		<content:encoded><![CDATA[<p>Hello Jürgen, hello Eberhard,</p>
<p>I enjoyed listening to the episode especially after already having seen Jürgens presentation on that topic on infoq.com. I missed one question that we currently deal with. Spring heavily relies on 3rd party libraries, that of course require further libraries and so on. How do you manage to find a suitable version of transitive library Z if maybe library X relies on Z in version 1.6 and Y relies on Z in 1.8. You might drop in 1.8 and rely on backwards compatibility, but that does not feel quite comfortable to me.</p>
<p>Is there some managed process (Jürgenization &#8211; as I was told <img src='http://www.se-radio.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  or at least some best practice?</p>
<p>Regards,<br />
Ollie</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: juergen.hoeller</title>
		<link>http://www.se-radio.net/2008/01/episode-82-organization-of-large-code-bases-with-juergen-hoeller/#comment-27</link>
		<dc:creator>juergen.hoeller</dc:creator>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<guid isPermaLink="false">#comment-27</guid>
		<description><![CDATA[Actually, Spring doesn&#039;t really on third-party libraries that heavily: It&#039;s only core dependency is commons-logging :-) That said, you&#039;re of course right that Spring integrates with many third-party libraries; hence typical Spring setups do involve managing all those third-party jars.

Even if it sounds naive: Backwards compatibility is actually not that much of an issue with typical transitive third-party dependencies. Those transitive jars are usually Jakarta Commons libraries which actually do have a pretty good track record of backwards compatibility. So the simple rule would be to pick the highest required version of the transitive dependency and expect that to work for all callers.

It&#039;s a bit harder with libraries like iText, used behind the scenes by e.g. JasperReports but maybe also used directly in the same application. However, in my experience, even those scenarios are not that big of a problem in practice. It usually just works. I warned you that it may sound naive :-)

What we do in the Spring codebase in case of a non-backwards-compatible new version of a third-party library is a reflective check (yes, like the one for Hibernate!). This allows Spring to remain compatible with both the old and the new version of that library, despite maybe some API signature changes. We did that for some Quartz and iBATIS versions, for example. This is usually completely transparent to application developers; you&#039;ll simply keep whatever version you picked. Other clients of such third-party libraries should show the same level of adaptability; however, that&#039;s rare. Fortunately the need for it is rare too.

Juergen]]></description>
		<content:encoded><![CDATA[<p>Actually, Spring doesn&#8217;t really on third-party libraries that heavily: It&#8217;s only core dependency is commons-logging <img src='http://www.se-radio.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  That said, you&#8217;re of course right that Spring integrates with many third-party libraries; hence typical Spring setups do involve managing all those third-party jars.</p>
<p>Even if it sounds naive: Backwards compatibility is actually not that much of an issue with typical transitive third-party dependencies. Those transitive jars are usually Jakarta Commons libraries which actually do have a pretty good track record of backwards compatibility. So the simple rule would be to pick the highest required version of the transitive dependency and expect that to work for all callers.</p>
<p>It&#8217;s a bit harder with libraries like iText, used behind the scenes by e.g. JasperReports but maybe also used directly in the same application. However, in my experience, even those scenarios are not that big of a problem in practice. It usually just works. I warned you that it may sound naive <img src='http://www.se-radio.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>What we do in the Spring codebase in case of a non-backwards-compatible new version of a third-party library is a reflective check (yes, like the one for Hibernate!). This allows Spring to remain compatible with both the old and the new version of that library, despite maybe some API signature changes. We did that for some Quartz and iBATIS versions, for example. This is usually completely transparent to application developers; you&#8217;ll simply keep whatever version you picked. Other clients of such third-party libraries should show the same level of adaptability; however, that&#8217;s rare. Fortunately the need for it is rare too.</p>
<p>Juergen</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: juergen.hoeller</title>
		<link>http://www.se-radio.net/2008/01/episode-82-organization-of-large-code-bases-with-juergen-hoeller/#comment-28</link>
		<dc:creator>juergen.hoeller</dc:creator>
		<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
		<guid isPermaLink="false">#comment-28</guid>
		<description><![CDATA[Interfaces may indeed pose a problem with respect to backwards compatibility. What we usually do in Spring is to provide extended versions of established interfaces, with only those extended versions featuring the new methods. Take BeanPostProcessor and InstantiationAwareBeanPostProcessor, for example. Existing implementors do not have to care about the new callback methods then.

This only applies to interfaces that are typically implemented by application code, though. Framework APIs like BeanFactory and ApplicationContext do not suffer from the extensibility problem since new methods there only have to be implemented in the framework-provided implementation classes. Even if somebody customizes those, this usually happens through subclassing of framework-provided base classes.

So indeed, providing abstract base classes is technically a better choice for backwards compatibility purposes. However, providing extended versions of interfaces (as outlined above) may often be a viable alternative. And sticking with interfaces has a couple of positive side effects, like easier proxying (and decoration), clearer definition of individual roles, etc.

Juergen]]></description>
		<content:encoded><![CDATA[<p>Interfaces may indeed pose a problem with respect to backwards compatibility. What we usually do in Spring is to provide extended versions of established interfaces, with only those extended versions featuring the new methods. Take BeanPostProcessor and InstantiationAwareBeanPostProcessor, for example. Existing implementors do not have to care about the new callback methods then.</p>
<p>This only applies to interfaces that are typically implemented by application code, though. Framework APIs like BeanFactory and ApplicationContext do not suffer from the extensibility problem since new methods there only have to be implemented in the framework-provided implementation classes. Even if somebody customizes those, this usually happens through subclassing of framework-provided base classes.</p>
<p>So indeed, providing abstract base classes is technically a better choice for backwards compatibility purposes. However, providing extended versions of interfaces (as outlined above) may often be a viable alternative. And sticking with interfaces has a couple of positive side effects, like easier proxying (and decoration), clearer definition of individual roles, etc.</p>
<p>Juergen</p>
]]></content:encoded>
	</item>
</channel>
</rss>
