反 for-if 编程模式

jopen 12年前
     <p>本文是从 <a href="/misc/goto?guid=4958327498097675496" target="_blank">Introducing the for-if anti-pattern</a> 这篇文章翻译而来。</p>    <hr />    <p>这些年来,我看到过大量的反编程模式。我感觉应该向大家分享一些。</p>    <p>今天,我要介绍的是被我称作反<em>for-if</em>编程模式的反模式,也就是人们所说的”<a href="/misc/goto?guid=4958326289789582124" target="_blank">我们卖给你整个座位,但你需要的只是一个边</a>。”<br /> 这是一个特殊的反<em>for-case</em>模式,其中所有的情况中只有一次会是null。</p>    <pre>for (int i = 0; i < 100; i++) {    if (i == 42) { do_something(i); }  }</pre>    <p>这种情况可以简单的写成</p>    <pre>do_something(42);</pre>    <p>这个反<em>for-if</em>模式可以表现成各种各样的形式。比如:</p>    <pre>foreach (string filename in Directory.GetFiles("."))  {      if (filename.Equals("desktop.ini", <a href="/misc/goto?guid=4958327499632026053" target="_blank">StringComparison.OrdinalIgnoreCase</a>))      {          return new StreamReader(filename);      }  }</pre>    <p>它是在一个目录里遍历查找一个指定文件,如果找到了,就返回文件的数据流。这段代码的一种不是那么折腾的写法是</p>    <pre>if (File.Exists("desktop.ini"))  {      return new StreamReader("desktop.ini");  }</pre>    <p>请注意,两个版本的代码片段具有相同的竞争条件:如果这个<code>desktop.ini</code>本来是存在的,但在你创建<code>Stream­Reader</code>之前被删掉了,你就会得到一个<code>File­Not­Found­Exception</code>错误。</p>    <p>再举一个例子:</p>    <pre>foreach (object o in hashtable.Keys)  {      if (o == "target") return hashtable["target"];  }</pre>    <p>等同于</p>    <pre>return hashtable["target"];</pre>    <p>我猜测这些家伙不喜欢在图书馆里通过书名找一本书,因为他们的做法是如此的繁琐:<br /> 他们来到图书馆里员面前说,“把你所有的书都给我,”然后他们拿着装满了上千本书的篮子,坐到墙角里自言自语:<br /> “不是,这本书的书名不对”,</p>    <p>“不是,这本也不是”,</p>    <p>“标题还是不对。”</p>    <p>“这本书呢?”</p>    <p>”不是,也不是这本。“</p>    <p>”老天,我要这样一本一本翻到什么时候…“<br /> <br /> 本文转载自: 外刊IT评论 <a href="/misc/goto?guid=4958183272158702965" rel="nofollow" target="_blank">http://www.aqee.net/</a> </p>