Re: Immutable Utility Objects
Chris Morris <[email protected]> Sun, 4 Dec 2011 10:31:06 -0600
| Newsgroups | gmane.comp.programming.language-of-the-year |
|---|---|
| Message-ID | <CA+HVNMd5RfWDf0Y9GUZzZz=foAjXmVdN5cgkFRkWpWYo_Ek+zg@mail.gmail.com> |
--0016e659f236942cf504b346ba83 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable I think my objections stem from abuse I've seen in codebases**. In your case, it sounds like you're being reasonable about it. I'm okay with it as long as that code is properly groomed and refactored as it grows, and usually that means away from class level into instance level - so sometimes I'll just start there rather than worry about a team making the transition when the time comes. ** (a) a set of static methods that all take the same or similar arguments and pass them among each other or (b) utility classes or packages that become a kitchen sink of functionality that become a hub to couple everything to everything else. On Thu, Dec 1, 2011 at 1:43 PM, Steve Wart <[email protected]> wrote: > ** > > > Why do some people feel so strongly that implementing class-side behavior > is bad design? > > For example, I've got an object with no mutable state, and no required > inheritance, just a set of related utility functions that are needed to > fire off some processing. > > I've heard arguments that this approach "inhibits testing" - but does tha= t > trump the KISS principle? I seem to be able to test just fine. > > After all if I need a singleton, or even multiple instances, there's > nothing stopping me from refactoring. > > Could it be I'm mistaken in the assumption that people think it's bad? > After all most languages these days have a "Math" import that has nothing > but static behavior, and I'm sure there are many other application-specif= ic > examples of this. > > Alternatively, could it be that creating instances to execute all behavio= r > overcomes problems with static semantics? > > Just curious. > > Thanks, > Steve >=20=20 > --=20 Chris http://livingsocial.com | http://clabs.org --0016e659f236942cf504b346ba83 Content-Type: text/html; charset=windows-1252 Content-Transfer-Encoding: quoted-printable <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/htm= l4/strict.dtd"> <html> <head> </head> <body style=3D"background-color: #fff;"> <span style=3D"display:none"> </span> <!--~-|**|PrettyHtmlStartT|**|-~--> <div id=3D"ygrp-mlmsg" style=3D"position:relative;"> <div id=3D"ygrp-msg" style=3D"z-index: 1;"> <!--~-|**|PrettyHtmlEndT|**|-~--> <div id=3D"ygrp-text" > =20=20=20=20=20=20 =20=20=20=20=20=20 <p><div>I think my objections stem from abuse I've seen in codeba= ses**. In your case, it sounds like you're being reasonable about it. I= 'm okay with it as long as that code is properly groomed and refactored= as it grows, and usually that means away from class level into instance le= vel - so sometimes I'll just start there rather than worry about a team= making the transition when the time comes.</div> <div><br></div><div>** (a) a set of static methods that all take the same o= r similar arguments and pass them among each other or (b) utility classes o= r packages that become a kitchen sink of functionality that become a hub to= couple everything to everything else.</div> <div><br><div class=3D"gmail_quote">On Thu, Dec 1, 2011 at 1:43 PM, Steve W= art <span dir=3D"ltr"><<a href=3D"mailto:[email protected]" target=3D= "_blank">[email protected]</a>></span> wrote:<br><blockquote class=3D= "gmail_quote" style=3D"border-left:1px #ccc solid;"> <u></u> <div style=3D"background-color:#fff;"> <span>=A0</span> <div> <div> <div> =20=20=20=20=20=20 =20=20=20=20=20=20 <p>Why do some people feel so strongly that implementing class-side b= ehavior is bad design?<br><br>For example, I've got an object with no m= utable state, and no required inheritance, just a set of related utility fu= nctions that are needed to fire off some processing.<br> <br>I've heard arguments that this approach "inhibits testing"= ; - but does that trump the KISS principle? I seem to be able to test just = fine.<br><br>After all if I need a singleton, or even multiple instances, t= here's nothing stopping me from refactoring.<br> <br>Could it be I'm mistaken in the assumption that people think it'= ;s bad? After all most languages these days have a "Math" import = that has nothing but static behavior, and I'm sure there are many other= application-specific examples of this.<br> <br>Alternatively, could it be that creating instances to execute all behav= ior overcomes problems with static semantics?<br><br>Just curious.<br><br>T= hanks,<br>Steve<br> </p> </div> =20=20=20=20=20 =20=20=20=20 <div style=3D"color:#fff;"></div> </div> =20=20 </div></div></blockquote></div><br><br clear=3D"all"><div><br></div>-- <br>= Chris<div><a href=3D"http://livingsocial.com" target=3D"_blank">http://livi= ngsocial.com</a> |=A0<a href=3D"http://clabs.org" target=3D"_blank">http://= clabs.org</a><br></div> <br> </div> </p> </div> =20=20=20=20=20 <!--~-|**|PrettyHtmlStart|**|-~--> <div style=3D"color: #fff; height: 0;">__._,_.___</div> =20=20=20=20=20=20=20=20 =20=20 =20=20=20 <div id=3D"ygrp-actbar" style=3D"clear: both; margin-bottom: 10px; whit= e-space: nowrap; color: #666; padding-top: 15px;"> <div> <a href=3D"mailto:[email protected]?subject=3DRe%3A%20%5Bpragprog%5= D%20Immutable%20Utility%20Objects" style=3D"margin-right: 0; padding-right:= 0;"> Reply to <span style=3D"font-weight: 700;">sender</span></a> | <a href=3D"mailto:[email protected]?subject=3DRe%3A%20%5Bpra= gprog%5D%20Immutable%20Utility%20Objects"> Reply to <span style=3D"font-weight: 700;">group</span></a> | <a href=3D"http://groups.yahoo.com/group/pragprog/post;_ylc=3DX3= oDMTJxNHRua2NhBF9TAzk3MzU5NzE0BGdycElkAzI4Mzg3MDgEZ3Jwc3BJZAMxNzA1MDA3MjA3B= G1zZ0lkAzEwMjE0BHNlYwNmdHIEc2xrA3JwbHkEc3RpbWUDMTMyMzAxNjI3MQ--?act=3Dreply= &messageNum=3D10214">Reply <span style=3D"font-weight: 700;">via web post</= span></a> | <a href=3D"http://groups.yahoo.com/group/pragprog/post;_ylc=3D= X3oDMTJlM3UxMGMxBF9TAzk3MzU5NzE0BGdycElkAzI4Mzg3MDgEZ3Jwc3BJZAMxNzA1MDA3MjA= 3BHNlYwNmdHIEc2xrA250cGMEc3RpbWUDMTMyMzAxNjI3MQ--" style=3D"font-weight: 70= 0;">Start a New Topic</a> </div> <a href=3D"http://groups.yahoo.com/group/pragprog/message/1= 0211;_ylc=3DX3oDMTM2djE2ZWxyBF9TAzk3MzU5NzE0BGdycElkAzI4Mzg3MDgEZ3Jwc3BJZAM= xNzA1MDA3MjA3BG1zZ0lkAzEwMjE0BHNlYwNmdHIEc2xrA3Z0cGMEc3RpbWUDMTMyMzAxNjI3MQ= R0cGNJZAMxMDIxMQ--">Messages in this topic</a> (<span style=3D"font-weight: 700;">4</span>) </div>=20 <!------- Start Nav Bar ------> <!-- |**|begin egp html banner|**| --> <div id=3D"ygrp-vital" style=3D"background-color: #e0ecee; font-family: Ver= dana; font-size: 10px; margin-bottom: 10px; padding: 10px;"> <span id=3D"vithd" style=3D"font-weight: bold; color: #333; text-tran= sform: uppercase; ">Recent Activity:</span> <ul style=3D"list-style-type: none; margin: 0; padding: 0; display: inl= ine;"> </ul> =20=20=20=20 <div style=3D"clear: both; padding-top: 2px; color: #1e66ae;"> <a href=3D"http://groups.yahoo.com/group/pragprog;_ylc=3DX3oDMTJlNGlrYz= NxBF9TAzk3MzU5NzE0BGdycElkAzI4Mzg3MDgEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwN2dGwEc= 2xrA3ZnaHAEc3RpbWUDMTMyMzAxNjI3MQ--" style=3D"text-decoration: none;">Visit= Your Group</a> </div> </div> <div id=3D"ygrp-mkp" style=3D"border: 1px solid #d8d8d8; clea= r: both; float: left; font-family: Arial; margin: 5px 0 10px 0; padding: 0 = 10px;"> <div id=3D"hd" style=3D"color: #628c2a; font-size: 85%; font-weight: = 700; line-height: 122%; margin: 10px 0;">MARKETPLACE</div> <div id=3D"ads" style=3D"margin-bottom: 10px;"> <div class=3D"ad" style=3D"color: #628C2A; font-family: A= rial; font-weight: 700; padding: 0 0;"> <p><a href=3D"http://global.ard.yahoo.com/SIG=3D15opgmb37/M=3D4= 93064.14543979.14562481.13298430/D=3Dgroups/S=3D1705007207:MKP1/Y=3DYAHOO/E= XP=3D1323023471/L=3D6062c3ec-1e95-11e1-b78b-4f28fb539fb1/B=3DjaPgNUoGYzo-/J= =3D1323016271411255/K=3D5LqU4pFjboqZHaoTCClitg/A=3D6060255/R=3D0/SIG=3D1194= m4keh/*http://us.toolbar.yahoo.com/?.cpdl=3Dgrpj">Stay on top of your group= activity without leaving the page you're on - Get the Yahoo! Toolbar now.<= /a></p> <script language=3Djavascript> if(window.yzq_d=3D=3Dnull)window.yzq_d=3Dnew Object(); window.yzq_d['jaPgNUoGYzo-']=3D'&U=3D13ci6ok17%2fN%3djaPgNUoGYzo-%2fC%3d493= 064.14543979.14562481.13298430%2fD%3dMKP1%2fB%3d6060255%2fV%3d1'; </script><noscript><img width=3D1 height=3D1 alt=3D"" src=3D"http://us.bc.y= ahoo.com/b?P=3D6062c3ec-1e95-11e1-b78b-4f28fb539fb1&T=3D1dhh8ak3t%2fX%3d132= 3016271%2fE%3d1705007207%2fR%3dgroups%2fK%3d5%2fV%3d2.1%2fW%3dH%2fY%3dYAHOO= %2fF%3d3397134827%2fH%3dY29udGVudD0iWWFob29fVGVjaDtHbztXaWRnZXRzO1dlYnNpdGV= fU2VydmljZXM7UG9kY2FzdHM7RmxpY2tyO1lhaG9vX1NlYXJjaF9NYXJrZXRpbmc7RmluYW5jZT= tCcmllZmNhc2U7Q2FsZW5kYXI7IiBkaXNhYmxlc2h1ZmZsaW5nPSIxIiBzZXJ2ZUlkPSI2MDYyY= zNlYy0xZTk1LTExZTEtYjc4Yi00ZjI4ZmI1MzlmYjEiIHNpdGVJZD0iNDQ1MjU1MSIgdFN0bXA9= IjEzMjMwMTYyNzEzODc0NzkiIA--%2fQ%3d-1%2fS%3d1%2fJ%3d9F238962&U=3D13ci6ok17%= 2fN%3djaPgNUoGYzo-%2fC%3d493064.14543979.14562481.13298430%2fD%3dMKP1%2fB%3= d6060255%2fV%3d1"></noscript><!--QYZ ,;;MKP1;1705007207;2;--> </di= v> </div> </div> =20=20 <div id=3D"ft" style=3D"font-family: Arial; font-size: 11px; margin-top: 5p= x; padding: 0 2px 0 0; clear: both;"> <a href=3D"http://groups.yahoo.com/;_ylc=3DX3oDMTJkNDd2ZHNlBF9TAzk3NDc2NT= kwBGdycElkAzI4Mzg3MDgEZ3Jwc3BJZAMxNzA1MDA3MjA3BHNlYwNmdHIEc2xrA2dmcARzdGltZ= QMxMzIzMDE2Mjcx" style=3D"float: left;"><img src=3D"http://l.yimg.com/a/i/u= s/yg/logo/us.gif" height=3D"15" width=3D"137" alt=3D"Yahoo! Groups" style= =3D"border: 0;"/></a> <div style=3D"color: #747575; float: right;">Switch to: <a href=3D"mailto= :[email protected]?subject=3DChange Delivery Format: Tra= ditional" style=3D"text-decoration: none;">Text-Only</a>, <a href=3D"mailto= :[email protected]?subject=3DEmail Delivery: Digest" class=3D= "margin-rt" style=3D"text-decoration: none;">Daily Digest</a> • <a hre= f=3D"mailto:[email protected]?subject=3DUnsubscribe" sty= le=3D"text-decoration: none;">Unsubscribe</a> • <a href=3D"http://docs= .yahoo.com/info/terms/" style=3D"text-decoration: none;">Terms of Use</a></= div> </div> <!-- |**|end egp html banner|**| --> </div> <!-- ygrp-msg --> <!-- Sponsor --> <!-- |**|begin egp html banner|**| --> <div id=3D"ygrp-sponsor" style=3D"width:160px; float:right; clear:none; m= argin:0 0 25px 0; background: #fff;"> <!-- Start Recommendations --> <div id=3D"ygrp-reco"> </div> <!-- End Recommendations --> </div> <!-- |**|end egp html banner|**| --> <div style=3D"clear:both; color: #FFF; font-size:1px;">.</div> </div> <img src=3D"http://geo.yahoo.com/serv?s=3D97359714/grpId=3D2838708/grpspI= d=3D1705007207/msgId=3D10214/stime=3D1323016271/nc1=3D3848644/nc2=3D4507179= /nc3=3D5898812" width=3D"1" height=3D"1"> <br> <div style=3D"color: #fff; height: 0;">__,_._,___</div> <!--~-|**|PrettyHtmlEnd|**|-~--> </body> <!--~-|**|PrettyHtmlStart|**|-~--> <head> <style type=3D"text/css"> <!-- #ygrp-mkp { border: 1px solid #d8d8d8; font-family: Arial; margin: 10px 0; padding: 0 10px; } #ygrp-mkp hr { border: 1px solid #d8d8d8; } #ygrp-mkp #hd { color: #628c2a; font-size: 85%; font-weight: 700; line-height: 122%; margin: 10px 0; } #ygrp-mkp #ads { margin-bottom: 10px; } #ygrp-mkp .ad { padding: 0 0; } #ygrp-mkp .ad p { margin: 0; } #ygrp-mkp .ad a { color: #0000ff; text-decoration: none; } #ygrp-sponsor #ygrp-lc { font-family: Arial; } #ygrp-sponsor #ygrp-lc #hd { margin: 10px 0px; font-weight: 700; font-size: 78%; line-height: 122%; } #ygrp-sponsor #ygrp-lc .ad { margin-bottom: 10px; padding: 0 0; } a { color: #1e66ae; } #actions { font-family: Verdana; font-size: 11px; padding: 10px 0; } #activity { background-color: #e0ecee; float: left; font-family: Verdana; font-size: 10px; padding: 10px; } #activity span { font-weight: 700; } #activity span:first-child { text-transform: uppercase; } #activity span a { color: #5085b6; text-decoration: none; } #activity span span { color: #ff7900; } #activity span .underline { text-decoration: underline; } .attach { clear: both; display: table; font-family: Arial; font-size: 12px; padding: 10px 0; width: 400px; } .attach div a { text-decoration: none; } .attach img { border: none; padding-right: 5px; } .attach label { display: block; margin-bottom: 5px; } .attach label a { text-decoration: none; } =20=20 blockquote { margin: 0 0 0 4px; } .bold { font-family: Arial; font-size: 13px; font-weight: 700; } .bold a { text-decoration: none; } dd.last p a { font-family: Verdana; font-weight: 700; } dd.last p span { margin-right: 10px; font-family: Verdana; font-weight: 700; } dd.last p span.yshortcuts { margin-right: 0; } div.attach-table div div a { text-decoration: none; } div.attach-table { width: 400px; } div.file-title a, div.file-title a:active, div.file-title a:hover, div.fi= le-title a:visited { text-decoration: none; } div.photo-title a, div.photo-title a:active, div.photo-title a:hover, div= .photo-title a:visited { text-decoration: none; } div#ygrp-mlmsg #ygrp-msg p a span.yshortcuts { font-family: Verdana; font-size: 10px; font-weight: normal; } .green { color: #628c2a; } .MsoNormal { margin: 0 0 0 0; } o { font-size: 0; } #photos div { float: left; width: 72px; } #photos div div { border: 1px solid #666666; height: 62px; overflow: hidden; width: 62px; } #photos div label { color: #666666; font-size: 10px; overflow: hidden; text-align: center; white-space: nowrap; width: 64px; } #reco-category { font-size: 77%; } #reco-desc { font-size: 77%; } .replbq { margin: 4px; } #ygrp-actbar div a:first-child { /* border-right: 0px solid #000;*/ margin-right: 2px; padding-right: 5px; } #ygrp-mlmsg { font-size: 13px; font-family: Arial, helvetica,clean, sans-serif; *font-size: small; *font: x-small; } #ygrp-mlmsg table { font-size: inherit; font: 100%; } #ygrp-mlmsg select, input, textarea { font: 99% Arial, Helvetica, clean, sans-serif; } #ygrp-mlmsg pre, code { font:115% monospace; *font-size:100%; } #ygrp-mlmsg * { line-height: 1.22em; } #ygrp-mlmsg #logo { padding-bottom: 10px; } #ygrp-mlmsg a { color: #1E66AE; } #ygrp-msg p a { font-family: Verdana; } #ygrp-msg p#attach-count span { color: #1E66AE; font-weight: 700; } #ygrp-reco #reco-head { color: #ff7900; font-weight: 700; } #ygrp-reco { margin-bottom: 20px; padding: 0px; } #ygrp-sponsor #ov li a { font-size: 130%; text-decoration: none; } #ygrp-sponsor #ov li { font-size: 77%; list-style-type: square; padding: 6px 0; }=20 #ygrp-sponsor #ov ul { margin: 0; padding: 0 0 0 8px; } #ygrp-text { font-family: Georgia; } #ygrp-text p { margin: 0 0 1em 0; } #ygrp-text tt { font-size: 120%; } #ygrp-vital ul li:last-child { border-right: none !important;=20 }=20 --> </style> </head> <!--~-|**|PrettyHtmlEnd|**|-~--> </html> <!-- end group email --> --0016e659f236942cf504b346ba83--