Re: DRY vs. KISS

Omer Zak <w1-W6cp89mEpD1mR6Xm/[email protected]> Thu, 12 Nov 2009 20:41:09 +0200
Newsgroups gmane.culture.hackers.israel
Message-ID <[email protected]>
--1545KZ9aD6RlyiseFMTGnZOP7r29oYYmrZBXF3j
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

On Thu, 2009-11-12 at 19:24 +0200, Shlomi Fish wrote:
[... an example was snipped ...]
> So the question to you is: do you think DRY and KISS can sometimes contradict 
> one another? If so, which one is more important, or that you should just use 
> your reason. I should also note that I've been feeling that less expressive 
> languages sometimes result in being unable to avoid duplicate code or 
> undesirable "patterns" in the code (in accordance to DRY). Possibly the only 
> family of languages that completely avoids duplicate code is Lisp.

I think that more important than DRY, KISS or whatever is the principle
of not overloading the memory of whomever is going to read the software.

You overload his memory if he has to look up elsewhere for definitions
of variables, functions, closures or whatever constructs you are using.
According to this criteria, LISP can be very bad.

If you define another function in order to avoid code repetition at 3
places in your project, then whomever is reading the code needs to look
up the new function definition.  If it's the only function in the
statement - OK.  But if the statement already invokes 7 functions to
compute values, return a function pointer to be invoked, and the address
of the variable to receive the result, then adding 8th function would
already overflow the reader's short term memory.

And sometimes when you need to modify all copies of an expression in
your project, egrep can do good enough work - so no need to make them a
function to enable code modification at one place.  In a way it would be
"virtual DRY" - the entity which you don't repeat is the egrep pattern.

Those are vague ideas.  I hope that someone would continue the
conversation and can distill those ideas and find the hidden principle -
it surely would be a gem!
                                              --- Omer
-- 
Eli Marmor's Law:  netiquette forbids people from replying "I agree with
you" to messages in mailing lists, skewing discussions in favor of the
troublemaker type of dissenters.
My own blog is at http://www.zak.co.il/tddpirate/

My opinions, as expressed in this E-mail message, are mine alone.
They do not represent the official policy of any organization with which
I may be affiliated in any way.
WARNING TO SPAMMERS:  at http://www.zak.co.il/spamwarning.html


--1545KZ9aD6RlyiseFMTGnZOP7r29oYYmrZBXF3j
Content-Type: text/html; charset=US-ASCII
Content-Transfer-Encoding: 7bit




<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
</head>







<body style="background-color: #fff;">
<span style="display:none">&nbsp;</span>

<!--~-|**|PrettyHtmlStartT|**|-~-->
<div id="ygrp-mlmsg" style="position:relative;">
  <div id="ygrp-msg" style="z-index: 1;">
<!--~-|**|PrettyHtmlEndT|**|-~-->

    <div id="ygrp-text" >
      
      
      <p>On Thu, 2009-11-12 at 19:24 &#43;0200, Shlomi Fish wrote:<br>
[... an example was snipped ...]<br>
&gt; So the question to you is: do you think DRY and KISS can sometimes contradict <br>
&gt; one another? If so, which one is more important, or that you should just use <br>
&gt; your reason. I should also note that I've been feeling that less expressive <br>
&gt; languages sometimes result in being unable to avoid duplicate code or <br>
&gt; undesirable &quot;patterns&quot; in the code (in accordance to DRY). Possibly the only <br>
&gt; family of languages that completely avoids duplicate code is Lisp.<br>
<br>
I think that more important than DRY, KISS or whatever is the principle<br>
of not overloading the memory of whomever is going to read the software.<br>
<br>
You overload his memory if he has to look up elsewhere for definitions<br>
of variables, functions, closures or whatever constructs you are using.<br>
According to this criteria, LISP can be very bad.<br>
<br>
If you define another function in order to avoid code repetition at 3<br>
places in your project, then whomever is reading the code needs to look<br>
up the new function definition.  If it's the only function in the<br>
statement - OK.  But if the statement already invokes 7 functions to<br>
compute values, return a function pointer to be invoked, and the address<br>
of the variable to receive the result, then adding 8th function would<br>
already overflow the reader's short term memory.<br>
<br>
And sometimes when you need to modify all copies of an expression in<br>
your project, egrep can do good enough work - so no need to make them a<br>
function to enable code modification at one place.  In a way it would be<br>
&quot;virtual DRY&quot; - the entity which you don't repeat is the egrep pattern.<br>
<br>
Those are vague ideas.  I hope that someone would continue the<br>
conversation and can distill those ideas and find the hidden principle -<br>
it surely would be a gem!<br>
                                              --- Omer<br>
-- <br>
Eli Marmor's Law:  netiquette forbids people from replying &quot;I agree with<br>
you&quot; to messages in mailing lists, skewing discussions in favor of the<br>
troublemaker type of dissenters.<br>
My own blog is at <a href="http://www.zak.co.il/tddpirate/">http://www.zak.<wbr>co.il/tddpirate/</a><br>
<br>
My opinions, as expressed in this E-mail message, are mine alone.<br>
They do not represent the official policy of any organization with which<br>
I may be affiliated in any way.<br>
WARNING TO SPAMMERS:  at <a href="http://www.zak.co.il/spamwarning.html">http://www.zak.<wbr>co.il/spamwarnin<wbr>g.html</a><br>
<br>
</p>

    </div>
     

    <!--~-|**|PrettyHtmlStart|**|-~-->
    <div style="color: #fff; height: 0;">__._,_.___</div>

        
  
   
    <div id="ygrp-actbar" style="clear: both; margin-bottom: 10px; white-space: nowrap; color: #666; padding-top: 15px;">
      <div>
        <a href="mailto:w1-W6cp89mEpD1mR6Xm/[email protected]?subject=Re: [hackers-il] DRY vs. KISS">
          Reply to <span style="font-weight: 700;">sender</span></a>
          | <a href="mailto:[email protected]?subject=Re: [hackers-il] DRY vs. KISS">
        Reply to <span style="font-weight: 700;">group</span></a>
      </div>

                <a href="http://groups.yahoo.com/group/hackers-il/message/5094;_ylc=X3oDMTM0ZDRzaWRoBF9TAzk3MzU5NzE0BGdycElkAzE4NTczMzIEZ3Jwc3BJZAMxNzA1MDA2NzY0BG1zZ0lkAzUwOTUEc2VjA2Z0cgRzbGsDdnRwYwRzdGltZQMxMjU4MDUxNDk2BHRwY0lkAzUwOTQ-">Messages in this topic</a>
          (<span style="font-weight: 700;">2</span>)
          </div> 
<!------- Start Nav Bar ------>

<!-- |**|begin egp html banner|**| -->
<div id="ygrp-vital" style="background-color: #e0ecee; font-family: Verdana; font-size: 10px; margin-bottom: 10px; padding: 10px;">
      <span id="vithd" style="font-weight: bold; color: #333; text-transform: uppercase; ">Recent Activity:</span>

    <ul style="list-style-type: none; margin: 0; padding: 0; display: inline;">
                                                    </ul>
    
  <div style="clear: both; padding-top: 2px; color: #1e66ae;">
    <a href="http://groups.yahoo.com/group/hackers-il;_ylc=X3oDMTJldnM3YWplBF9TAzk3MzU5NzE0BGdycElkAzE4NTczMzIEZ3Jwc3BJZAMxNzA1MDA2NzY0BHNlYwN2dGwEc2xrA3ZnaHAEc3RpbWUDMTI1ODA1MTQ5Ng--" style="border-right: 1px solid #000; padding-right: 5px; margin-right: 2px; text-decoration: none;">Visit Your Group</a>
    <a href="http://groups.yahoo.com/group/hackers-il/post;_ylc=X3oDMTJlbjNyZWVuBF9TAzk3MzU5NzE0BGdycElkAzE4NTczMzIEZ3Jwc3BJZAMxNzA1MDA2NzY0BHNlYwNmdHIEc2xrA250cGMEc3RpbWUDMTI1ODA1MTQ5Ng--" style="font-weight: 700; text-decoration: none;">Start a New Topic</a>
  </div>
</div>

              <div id="ygrp-mkp" style="border: 1px solid #d8d8d8; clear: both; float: left; font-family: Arial; margin: 5px 0 10px 0; padding: 0 10px;">
      <div id="hd" style="color: #628c2a; font-size: 85%; font-weight: 700; line-height: 122%; margin: 10px 0;">MARKETPLACE</div>
      <div id="ads" style="margin-bottom: 10px;">
                  <div class="ad" style="color: #628C2A; font-family: Arial; font-weight: 700; padding: 0 0;">
            <a href="http://us.ard.yahoo.com/SIG=14kutitph/M=493064.12016295.13793596.10835568/D=groups/S=1705006764:MKP1/Y=YAHOO/EXP=1258058696/L=/B=mA1yO0PDhEQ-/J=1258051496766196/K=ilzyvdnwjd8ihjqYhOR_FQ/A=5697381/R=0/SIG=11eaa5dke/*http://groups.yahoo.com/group/mompowergroup/">Mom Power: Discover the community of moms doing more for their families, for the world and for each other</a>          </div>
                              </div>
    </div>
  
<div id="ft" style="font-family: Arial; font-size: 11px; margin-top: 5px; padding: 0 2px 0 0; clear: both;">
  <a href="http://groups.yahoo.com/;_ylc=X3oDMTJkczh1azFhBF9TAzk3MzU5NzE0BGdycElkAzE4NTczMzIEZ3Jwc3BJZAMxNzA1MDA2NzY0BHNlYwNmdHIEc2xrA2dmcARzdGltZQMxMjU4MDUxNDk2" style="float: left;"><img src="http://l.yimg.com/a/i/us/yg/logo/us.gif" height="15" width="137" alt="Yahoo! Groups" style="border: 0;"/></a>
  <div style="color: #747575; float: right;">Switch to: <a href="mailto:[email protected]?subject=Change Delivery Format: Traditional" style="text-decoration: none;">Text-Only</a>, <a href="mailto:[email protected]?subject=Email Delivery: Digest" class="margin-rt" style="text-decoration: none;">Daily Digest</a> &bull; <a href="mailto:[email protected]?subject=Unsubscribe" style="text-decoration: none;">Unsubscribe</a> &bull; <a href="http://docs.yahoo.com/info/terms/" style="text-decoration: none;">Terms of Use</a></div>
</div>

<!-- |**|end egp html banner|**| -->

  </div> <!-- ygrp-msg -->

  <!-- Sponsor -->
  <!-- |**|begin egp html banner|**| -->
  <div id="ygrp-sponsor" style="width:160px; float:right; clear:none; margin:0 0 25px 0; background: #fff;">

<!-- Start Recommendations -->
<div id="ygrp-reco">
     </div>
<!-- End Recommendations -->



  </div>   <!-- |**|end egp html banner|**| -->

  <div style="clear:both; color: #FFF; font-size:1px;">.</div>
</div>

  <img src="http://geo.yahoo.com/serv?s=97359714/grpId=1857332/grpspId=1705006764/msgId=5095/stime=1258051496/nc1=4507179/nc2=3848641/nc3=5807838" width="1" height="1"> <br>

<div style="color: #fff; height: 0;">__,_._,___</div>
<!--~-|**|PrettyHtmlEnd|**|-~-->

</body>

<!--~-|**|PrettyHtmlStart|**|-~-->
<head>
  <style type="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 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;
  }
  
  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.file-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;
  } 

  #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; 
  } 
  -->
  </style>
</head>

<!--~-|**|PrettyHtmlEnd|**|-~-->
</html>
<!-- end group email -->


--1545KZ9aD6RlyiseFMTGnZOP7r29oYYmrZBXF3j--