<?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"
	>
<channel>
	<title>Comments on: Refunctoring</title>
	<atom:link href="http://blog.tmorris.net/refunctoring/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tmorris.net/refunctoring/</link>
	<description>The weblog of Tony Morris</description>
	<pubDate>Tue, 06 Jan 2009 03:45:51 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
		<item>
		<title>By: GramBorder</title>
		<link>http://blog.tmorris.net/refunctoring/#comment-916</link>
		<dc:creator>GramBorder</dc:creator>
		<pubDate>Tue, 20 Mar 2007 08:01:44 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/refunctoring/#comment-916</guid>
		<description>Hi all!

I want to all of you know, World is mine, and yoursite good

G'night</description>
		<content:encoded><![CDATA[<p>Hi all!</p>
<p>I want to all of you know, World is mine, and yoursite good</p>
<p>G&#8217;night</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: J. B. Rainsberger</title>
		<link>http://blog.tmorris.net/refunctoring/#comment-915</link>
		<dc:creator>J. B. Rainsberger</dc:creator>
		<pubDate>Mon, 19 Mar 2007 21:04:36 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/refunctoring/#comment-915</guid>
		<description>True: a good number of refactorings in Fowler's catalog move towards partial application. Still, I just don't see how a book that helps people discover that idea "denigrate[s] the standard of the software development industry". Clearly, one of us is missing something here.

It would have been nice, to be sure, had Fowler explicitly talked about how to see functors sitting inside large swaths of procedural code, but Fowler's work was introductory within its context, and the community-at-large has written and discussed how to identify and extract functors from procedural code. In many cases, simply exposing oneself to Smalltalk, Python or Ruby was enough to make that connection.

Incidentally, object tests (the term I prefer--I agree that 'unit' is too vague to be useful much of the time) and removing duplication alone would be enough to discover functors. You seem to find that roundabout and weak, but I perceive it as particularly powerful, because it simplifies the model I need to understand in order extract a functor from procedural code, as you have done here.

In this case, after I've written the tests, then I am asked to prepend with "AAA" or "BBB", I would remove duplication from the tests, which would point me in the direction of a Contract Test for the "map" functor. After seeing several examples of this pattern over time, I would develop the shortcut for thinking in terms of "map". In fact, that's essentially how I learned about map, select, detect and its cousins. What I find perhaps even more important is that I can use tests and remove duplication to discover the /next/ higher-level design concept that I don't currently understand, or that isn't offered by the language in which I was currently working.

So I applaud your desire to introduce your readers to functors. I only wish you'd made fewer unsubstantiated value judgments along the way. As you write, 'I realise my statement, “denigrate the software industry” is stated without premise, but it is a statement that I stand by unless some seriously compelling evidence in favour of the contraposition comes to light." It's my understanding that I have the responsibility to substantiate my claims, rather than foisting the responsibility on my readers to prove the contrary. I know you didn't ask for my advice, so forgive me, but I recommend you retain your enthusiasm while working harder to back up your negative claims.</description>
		<content:encoded><![CDATA[<p>True: a good number of refactorings in Fowler&#8217;s catalog move towards partial application. Still, I just don&#8217;t see how a book that helps people discover that idea &#8220;denigrate[s] the standard of the software development industry&#8221;. Clearly, one of us is missing something here.</p>
<p>It would have been nice, to be sure, had Fowler explicitly talked about how to see functors sitting inside large swaths of procedural code, but Fowler&#8217;s work was introductory within its context, and the community-at-large has written and discussed how to identify and extract functors from procedural code. In many cases, simply exposing oneself to Smalltalk, Python or Ruby was enough to make that connection.</p>
<p>Incidentally, object tests (the term I prefer&#8211;I agree that &#8216;unit&#8217; is too vague to be useful much of the time) and removing duplication alone would be enough to discover functors. You seem to find that roundabout and weak, but I perceive it as particularly powerful, because it simplifies the model I need to understand in order extract a functor from procedural code, as you have done here.</p>
<p>In this case, after I&#8217;ve written the tests, then I am asked to prepend with &#8220;AAA&#8221; or &#8220;BBB&#8221;, I would remove duplication from the tests, which would point me in the direction of a Contract Test for the &#8220;map&#8221; functor. After seeing several examples of this pattern over time, I would develop the shortcut for thinking in terms of &#8220;map&#8221;. In fact, that&#8217;s essentially how I learned about map, select, detect and its cousins. What I find perhaps even more important is that I can use tests and remove duplication to discover the /next/ higher-level design concept that I don&#8217;t currently understand, or that isn&#8217;t offered by the language in which I was currently working.</p>
<p>So I applaud your desire to introduce your readers to functors. I only wish you&#8217;d made fewer unsubstantiated value judgments along the way. As you write, &#8216;I realise my statement, “denigrate the software industry” is stated without premise, but it is a statement that I stand by unless some seriously compelling evidence in favour of the contraposition comes to light.&#8221; It&#8217;s my understanding that I have the responsibility to substantiate my claims, rather than foisting the responsibility on my readers to prove the contrary. I know you didn&#8217;t ask for my advice, so forgive me, but I recommend you retain your enthusiasm while working harder to back up your negative claims.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: sean</title>
		<link>http://blog.tmorris.net/refunctoring/#comment-914</link>
		<dc:creator>sean</dc:creator>
		<pubDate>Thu, 08 Mar 2007 23:13:33 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/refunctoring/#comment-914</guid>
		<description>&lt;em&gt;Deleted pointless comment&lt;/em&gt;
Why does it seem the Idiot Club visits a few weeks after publication?</description>
		<content:encoded><![CDATA[<p><em>Deleted pointless comment</em><br />
Why does it seem the Idiot Club visits a few weeks after publication?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ricky Clarkson</title>
		<link>http://blog.tmorris.net/refunctoring/#comment-913</link>
		<dc:creator>Ricky Clarkson</dc:creator>
		<pubDate>Sun, 18 Feb 2007 04:30:22 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/refunctoring/#comment-913</guid>
		<description>I think you would seem less attacking, and more humble, if you took out the emotive parts of the posts.

For example, "Many people would also write so-called ‘unit tests’".  I have my own reasons not to use the term 'unit tests', primarily that I don't think there's much value or practicality to their being tests of a small unit, because the extra code required to accurately mock the environment around a unit is not worth it.

However, by saying "so-called" you are implying that something the reader is probably comfortable with is wrong, but not providing a reason.  That puts the reader on edge, and not all readers are comfortable with that.

"I ask instead that it is not a List argument, but a List argument and a List return type."

One might argue in favour of removing the types, if they're getting in the way.  I know what you mean, of course, but it might be more useful to speak of value-based mapping rather than mapping that primarily converts between types.</description>
		<content:encoded><![CDATA[<p>I think you would seem less attacking, and more humble, if you took out the emotive parts of the posts.</p>
<p>For example, &#8220;Many people would also write so-called ‘unit tests’&#8221;.  I have my own reasons not to use the term &#8216;unit tests&#8217;, primarily that I don&#8217;t think there&#8217;s much value or practicality to their being tests of a small unit, because the extra code required to accurately mock the environment around a unit is not worth it.</p>
<p>However, by saying &#8220;so-called&#8221; you are implying that something the reader is probably comfortable with is wrong, but not providing a reason.  That puts the reader on edge, and not all readers are comfortable with that.</p>
<p>&#8220;I ask instead that it is not a List argument, but a List argument and a List return type.&#8221;</p>
<p>One might argue in favour of removing the types, if they&#8217;re getting in the way.  I know what you mean, of course, but it might be more useful to speak of value-based mapping rather than mapping that primarily converts between types.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Tony Morris</title>
		<link>http://blog.tmorris.net/refunctoring/#comment-912</link>
		<dc:creator>Tony Morris</dc:creator>
		<pubDate>Sat, 17 Feb 2007 00:42:11 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/refunctoring/#comment-912</guid>
		<description>Hi Ryan,
Nobody is bashing anyone in particular &#38;mdash; in fact, the intent is quite the opposite &#38;mdash; to identify with the layperson and help them make the transition to more powerful programming languages by using their language and point out that it is a natural progression, rather than an orthogonal paradigm that should be resisted.

I realise my statement, "denigrate the software industry" is stated without premise, but it is a statement that I stand by unless some seriously compelling evidence in favour of the contraposition comes to light.

I'm just as tired of those rants as you are &#38;mdash; it was never the intent. If just one Java programmer thinks, "hey I understand that! I'm going to write my own map function in Haskell. Hey look how cool it is!", then the primary objective is achieved.

For what it's worth, I work for a J2EE consultancy, using Haskell, Scala and CAL. I used to "use Java for a living", since I used to implement it for IBM; both the JDK and WebSphere at different stages.

If you'll allow me to have a whinge, I am tired of being accused of portraying the 'us/them' mentality as if I am on this side of the fence and you are on the other. I have been accused of 'not having real world experience' (just what is that anyway?) and 'not working on a large Java application' (is WebSphere not large enough?), simply what I believe to be an attempt to resist having to invest time and effort into a deeper analysis of the topic at hand. It's just foolish banter that completely ignores the opportunity for one or both parties involved to take a learning experience.

I'm tired of being accused of being 'elitist' or 'arrogant' simply because I am perceived to be attacking the lack of knowledge of my audience (not necessarily on this blog) &#38;mdash; believe me, there are many people who have far more knowledge than I do on these topics and I make every effort to listen and reflect on what I may be able to take from them &#38;mdash; a truly valuable exercise. If someone knows something I don't and I am interested, I embrace the chance to be humbled, rather than erect a defence against what I might perceive as an attack. Furthermore, I encourage others to do so as well, if for no other reason, that I may be able to learn from them in the future. Yes, I am selfish when it comes to knowledge.

Maybe we should have less televisions, less wars, less cultural ignorance and things would change, but this is a very weak conjecture. Got any ideas?</description>
		<content:encoded><![CDATA[<p>Hi Ryan,<br />
Nobody is bashing anyone in particular &#38;mdash; in fact, the intent is quite the opposite &#38;mdash; to identify with the layperson and help them make the transition to more powerful programming languages by using their language and point out that it is a natural progression, rather than an orthogonal paradigm that should be resisted.</p>
<p>I realise my statement, &#8220;denigrate the software industry&#8221; is stated without premise, but it is a statement that I stand by unless some seriously compelling evidence in favour of the contraposition comes to light.</p>
<p>I&#8217;m just as tired of those rants as you are &#38;mdash; it was never the intent. If just one Java programmer thinks, &#8220;hey I understand that! I&#8217;m going to write my own map function in Haskell. Hey look how cool it is!&#8221;, then the primary objective is achieved.</p>
<p>For what it&#8217;s worth, I work for a J2EE consultancy, using Haskell, Scala and CAL. I used to &#8220;use Java for a living&#8221;, since I used to implement it for IBM; both the JDK and WebSphere at different stages.</p>
<p>If you&#8217;ll allow me to have a whinge, I am tired of being accused of portraying the &#8216;us/them&#8217; mentality as if I am on this side of the fence and you are on the other. I have been accused of &#8216;not having real world experience&#8217; (just what is that anyway?) and &#8216;not working on a large Java application&#8217; (is WebSphere not large enough?), simply what I believe to be an attempt to resist having to invest time and effort into a deeper analysis of the topic at hand. It&#8217;s just foolish banter that completely ignores the opportunity for one or both parties involved to take a learning experience.</p>
<p>I&#8217;m tired of being accused of being &#8216;elitist&#8217; or &#8216;arrogant&#8217; simply because I am perceived to be attacking the lack of knowledge of my audience (not necessarily on this blog) &#38;mdash; believe me, there are many people who have far more knowledge than I do on these topics and I make every effort to listen and reflect on what I may be able to take from them &#38;mdash; a truly valuable exercise. If someone knows something I don&#8217;t and I am interested, I embrace the chance to be humbled, rather than erect a defence against what I might perceive as an attack. Furthermore, I encourage others to do so as well, if for no other reason, that I may be able to learn from them in the future. Yes, I am selfish when it comes to knowledge.</p>
<p>Maybe we should have less televisions, less wars, less cultural ignorance and things would change, but this is a very weak conjecture. Got any ideas?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ryan Cooper</title>
		<link>http://blog.tmorris.net/refunctoring/#comment-911</link>
		<dc:creator>Ryan Cooper</dc:creator>
		<pubDate>Fri, 16 Feb 2007 14:16:16 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/refunctoring/#comment-911</guid>
		<description>Good article. It's unfortunate that it comes across as yet another "I'm bitter we're not all using functional languages" rant. I program in Java most of the time for a living. I'd rather program in Lisp, Python, or Ruby (I have yet to really investigate Haskell). I think the industry would certainly be a step or twelve forward if we were all using more powerful languages.

BUT: There are two ways to solve problems. Method A is by changing your context to a more suitable one (changing from programming in Java to programming in a more powerful language, for example). This is great when you can pull it off. Method B is by doing things better within your context (refactoring and unit testing rather than cowboy coding in Java, for example). Sometimes you cannot change your context. For most people, certain aspects of their context will be simply out of their control, in which case you do B.

I'm tired of these rants bashing "Java programmers" and everything related to the Java universe. Yes, most of the specific refatorings listed in Fowler's book disappear in more powerful languages. Yes, most of the design patterns disappear in more powerful lanugages. This does not mean they "served only to denigrate the standard of the software development industry". Far from it. They help people apply method B. Like I said, method A is not always possible, and is not the only useful way to solve a problem.

Sometimes parts of method B are useful even after you change your context. For example, I still believe "improving the design of existing code without changing functionality" (a.k.a. refactoring) and testing individual pieces of code in isolation to ensure they do what you think they do (unit testing) are both still useful ideas in a functional world.</description>
		<content:encoded><![CDATA[<p>Good article. It&#8217;s unfortunate that it comes across as yet another &#8220;I&#8217;m bitter we&#8217;re not all using functional languages&#8221; rant. I program in Java most of the time for a living. I&#8217;d rather program in Lisp, Python, or Ruby (I have yet to really investigate Haskell). I think the industry would certainly be a step or twelve forward if we were all using more powerful languages.</p>
<p>BUT: There are two ways to solve problems. Method A is by changing your context to a more suitable one (changing from programming in Java to programming in a more powerful language, for example). This is great when you can pull it off. Method B is by doing things better within your context (refactoring and unit testing rather than cowboy coding in Java, for example). Sometimes you cannot change your context. For most people, certain aspects of their context will be simply out of their control, in which case you do B.</p>
<p>I&#8217;m tired of these rants bashing &#8220;Java programmers&#8221; and everything related to the Java universe. Yes, most of the specific refatorings listed in Fowler&#8217;s book disappear in more powerful languages. Yes, most of the design patterns disappear in more powerful lanugages. This does not mean they &#8220;served only to denigrate the standard of the software development industry&#8221;. Far from it. They help people apply method B. Like I said, method A is not always possible, and is not the only useful way to solve a problem.</p>
<p>Sometimes parts of method B are useful even after you change your context. For example, I still believe &#8220;improving the design of existing code without changing functionality&#8221; (a.k.a. refactoring) and testing individual pieces of code in isolation to ensure they do what you think they do (unit testing) are both still useful ideas in a functional world.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ramzi</title>
		<link>http://blog.tmorris.net/refunctoring/#comment-910</link>
		<dc:creator>Ramzi</dc:creator>
		<pubDate>Fri, 16 Feb 2007 14:10:03 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/refunctoring/#comment-910</guid>
		<description>in F-Script (supports Array Programming with a smalltalk syntax and works only on OS X)

&#38;gt; '***' ++ @ (({1,2,3} + 10)  @ printString)
{'***11', '***12', '***13'}</description>
		<content:encoded><![CDATA[<p>in F-Script (supports Array Programming with a smalltalk syntax and works only on OS X)</p>
<p>&#38;gt; &#8216;***&#8217; ++ @ (({1,2,3} + 10)  @ printString)<br />
{&#8217;***11&#8242;, &#8216;***12&#8242;, &#8216;***13&#8242;}</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: John Nowak</title>
		<link>http://blog.tmorris.net/refunctoring/#comment-909</link>
		<dc:creator>John Nowak</dc:creator>
		<pubDate>Fri, 16 Feb 2007 13:32:33 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/refunctoring/#comment-909</guid>
		<description>Actually, you don't need self in the above example... not had the morning coffee yet:

List addTenAndPrefix := method(map(v, "***" .. v + 10))</description>
		<content:encoded><![CDATA[<p>Actually, you don&#8217;t need self in the above example&#8230; not had the morning coffee yet:</p>
<p>List addTenAndPrefix := method(map(v, &#8220;***&#8221; .. v + 10))</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: John Nowak</title>
		<link>http://blog.tmorris.net/refunctoring/#comment-908</link>
		<dc:creator>John Nowak</dc:creator>
		<pubDate>Fri, 16 Feb 2007 13:30:46 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/refunctoring/#comment-908</guid>
		<description>This example is ridiculous. Here's how it works in Io:

List addTenAndPrefix := method(self map(v, "***" .. v + 10))

And then to call it:

list(5, 6, 7) addTenAndPrefix
==&#38;gt; list("***15", "***16", "***17")

As someone who does believe in the power of functional programming, I feel such examples as that given in this blog are more harmful than helpful. Java is not the pinnacle of "non-functional" programming. The statement, "How funky is that? Funky enough for you to start looking at funktional programming?" is completely silly.</description>
		<content:encoded><![CDATA[<p>This example is ridiculous. Here&#8217;s how it works in Io:</p>
<p>List addTenAndPrefix := method(self map(v, &#8220;***&#8221; .. v + 10))</p>
<p>And then to call it:</p>
<p>list(5, 6, 7) addTenAndPrefix<br />
==&#38;gt; list(&#8221;***15&#8243;, &#8220;***16&#8243;, &#8220;***17&#8243;)</p>
<p>As someone who does believe in the power of functional programming, I feel such examples as that given in this blog are more harmful than helpful. Java is not the pinnacle of &#8220;non-functional&#8221; programming. The statement, &#8220;How funky is that? Funky enough for you to start looking at funktional programming?&#8221; is completely silly.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ramzi</title>
		<link>http://blog.tmorris.net/refunctoring/#comment-907</link>
		<dc:creator>Ramzi</dc:creator>
		<pubDate>Fri, 16 Feb 2007 11:48:24 +0000</pubDate>
		<guid isPermaLink="false">http://blog.tmorris.net/refunctoring/#comment-907</guid>
		<description>http://nopaste.com/p/3K/plaintext
sorry for the flooding</description>
		<content:encoded><![CDATA[<p><a href="http://nopaste.com/p/3K/plaintext" onclick="javascript:pageTracker._trackPageview('/outbound/comment/nopaste.com');" rel="nofollow">http://nopaste.com/p/3K/plaintext</a><br />
sorry for the flooding</p>
]]></content:encoded>
	</item>
</channel>
</rss>
