<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>myRuby.net: &#47700;&#49436;&#46300; &#54840;&#52636; &#44208;&#44284;&#47484; &#51200;&#51109;&#54620;&#45796;</title>
    <link>http://myruby.net/articles/2007/07/12/%EB%A9%94%EC%84%9C%EB%93%9C-%ED%98%B8%EC%B6%9C-%EA%B2%B0%EA%B3%BC%EB%A5%BC-%EC%A0%80%EC%9E%A5%ED%95%9C%EB%8B%A4</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Blog.authored_by :deepblue</description>
    <item>
      <title>&#47700;&#49436;&#46300; &#54840;&#52636; &#44208;&#44284;&#47484; &#51200;&#51109;&#54620;&#45796;</title>
      <description>&lt;p&gt;&#49828;&#54532;&#47553;&#45432;&#53944; &#49548;&#49828;&amp;nbsp;&#53076;&#46300;&#50640;&#49436; &#51088;&#51452; &#48372;&#51060;&#45716; &#47336;&#48708; &#44288;&#50857; &#54364;&#54788; &#51473; &#54616;&#45208;&#45716; &#51060;&#47088; &#44163;&#51060;&#45796;.&lt;/p&gt;

&lt;p&gt;&lt;br class="khtml-block-placeholder" /&gt;&lt;/p&gt;

&lt;ol class="code"&gt;
&lt;li&gt;def hard_stuff&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;@cached_result_of_this_method ||= do_some_calculations&lt;/li&gt;
&lt;li&gt;end&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;br class="khtml-block-placeholder" /&gt;&lt;/p&gt;

&lt;p&gt;&#44057;&#51008; &#44228;&#49328;&#51012; &#50668;&#47084;&amp;nbsp;&#48264;&amp;nbsp;&#54616;&#45716; &#45229;&#48708;&#47484; &#47561;&#44592;&amp;nbsp;&#50948;&#54620; &#48169;&#48277;&#51060;&#45796;. &#48624;&#50640;&#49436; &#54840;&#52636;&#54616;&#45716; &#54764;&#54140; &#47700;&#49436;&#46300;&#46308;&#51008; &#45824;&#48512;&#48516; &#51200;&#47088;&#49885;&#51004;&#47196; &#44396;&#54788;&#54644;&#49436; &#44228;&#49328; &#49884;&#44036;&#51012; &#45800;&#52629;&#54616;&#46020;&#47197; &#47564;&#46308;&#50632;&#45796;. &#44536;&#47084;&#45912; &#50612;&#45712;&amp;nbsp;&#45216;, &#51064;&#49828;&#53556;&#49828; &#48320;&#49688; &#51060;&#47492; &#51667;&#44592;&#44032; &#44480;&#52270;&#50500;&#51648;&#44256;,&amp;nbsp;&#51200;&#47088; &#48152;&#48373;&#51201;&#51064; &#54665;&#53468;&#44032; &#49900;&#54620; &#51473;&#48373;&#51004;&#47196; &#48372;&#50688;&#45796;.&amp;nbsp;&#50669;&#49884; DRY&#47484; &#49888;&#48393;&#54616;&#45716; &#47336;&#48708; &#52964;&#48036;&#45768;&#54000; &#45813;&#45796;. :)&lt;/p&gt;

&lt;p&gt;&lt;br class="khtml-block-placeholder" /&gt;&lt;/p&gt;

&lt;p&gt;&#44536;&#47000;&#49436; &#44057;&#51008; &#51068;&#51012; &#54616;&#45716;&#45936;, &#51328; &#45908; &#49440;&#50616;&#51201;&#51004;&#47196; &#54624; &#49688; &#51080;&#46020;&#47197; &#44396;&#54788;&#54664;&#45796;.&lt;/p&gt;

&lt;p&gt;&lt;br class="khtml-block-placeholder" /&gt;&lt;/p&gt;

&lt;ol class="code"&gt;
&lt;li&gt;def hard_stuff&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;do_some_calculations&lt;/li&gt;
&lt;li&gt;end&lt;/li&gt;
&lt;li&gt;once :hard_stuff&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;br class="khtml-block-placeholder" /&gt;&lt;/p&gt;

&lt;p&gt;Object#once &#47700;&#49436;&#46300;&#47484; &#44396;&#54788;&#54644; &#47784;&#46304; &#44061;&#52404;&#50640;&#49436; &#49440;&#50616;&#51201;&#51004;&#47196; &amp;#8216;&#54620;&#48264;&#47564; &#54840;&#52636;&#46104;&#45716; &#47700;&#49436;&#46300;&amp;#8217;&#47484; &#47564;&#46308;&#49688; &#51080;&#46020;&#47197; &#54616;&#50688;&#45796;. &#50500;&#47000;&#45716; &#49828;&#54532;&#47553;&#45432;&#53944;&#51032; lib/method_once.rb &#54028;&#51068;&#51032; &#49548;&#49828;&amp;nbsp;&#53076;&#46300;&#51060;&#45796;.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;ol class="code"&gt;
&lt;li&gt;# &#47700;&#49436;&#46300; &#44208;&#44284;&#47484; &#54620;&#48264;&#47564; &#49892;&#54665;&#54616;&#46020;&#47197; cache &#54616;&#45716; &#53076;&#46300;&lt;/li&gt;
&lt;li&gt;class Object&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;class &amp;lt;&amp;lt;self&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def once(*methods)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;methods.each{|m| once_method(m)}&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;end&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def once_method(method)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;origin = &amp;#8216;_original_&amp;#8217; + method.to_s&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;alias_method origin, method&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;define_method method do&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@_once_cache ||= {}&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return @_once_cache[method] if @_once_cache.has_key? method&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@_once_cache[method] = send(origin)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;end&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;end&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;end&lt;/li&gt;
&lt;li&gt;end&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;once_method&#45716; &#50896;&#47000; &#44396;&#54788;&#46108; &#47700;&#49436;&#46300;(ex. hard_stuff)&#47484; _orign_hard_stuff&#47196; &#51060;&#47492;&#51012; &#48148;&#44984;&#44256; hard_stuff&#47484; &#49352;&#47196; &#44396;&#54788;&#54616;&#45716; &#49885;&#51060;&#45796;. &#44536;&#47532;&#44256; once &#47700;&#49436;&#46300;&#45716; &#50668;&#47084;&amp;nbsp;&#44060;&#51032; &#47700;&#49436;&#46300; &#51060;&#47492;&#51012; &#54620;&#44732;&#48264;&#50640; &#48155;&#50500;&#49436; &#52376;&#47532;&#54624; &#49688; &#51080;&#46020;&#47197; &#54664;&#45796;.&lt;/p&gt;

&lt;p&gt;&lt;br class="khtml-block-placeholder" /&gt;&lt;/p&gt;

&lt;p&gt;&#47932;&#47200; &#51060; &#53076;&#46300;&#47484; &#44160;&#51613;&#54616;&#44592; &#50948;&#54620; &#49828;&#54169;&#46020; &#51080;&#45796;.&lt;/p&gt;

&lt;p&gt;&lt;br class="khtml-block-placeholder" /&gt;&lt;/p&gt;

&lt;ol class="code"&gt;
&lt;li&gt;class TestClass&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;def initialize(a); @a=a end&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;def normal; @a+=1 end&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;def abnormal; @a+=1 end&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;def abnormal2; @a+=2 end&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;once :abnormal, :abnormal2&lt;/li&gt;
&lt;li&gt;end&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;describe &amp;#8220;method once&amp;#8221; do&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;before(:each) do&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@obj = TestClass.new(100)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;end&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;it &amp;#8220;once&#47196; &#49440;&#50616;&#46108; &#47700;&#49436;&#46300;&#45716;&amp;nbsp;&#54620;&#48264;&#47564; &#49892;&#54665;&#46108;&#45796;&amp;#8221; do&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@obj.normal.should eql(101)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@obj.normal.should eql(102)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@obj.abnormal.should eql(103)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@obj.abnormal.should eql(103)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@obj.abnormal2.should eql(105)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@obj.abnormal2.should eql(105)&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&amp;nbsp;end&lt;/li&gt;
&lt;li&gt;end&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;br class="khtml-block-placeholder" /&gt;&lt;/p&gt;

&lt;p&gt;&#50948; &#47700;&#49436;&#46300;&#51032; &#47928;&#51228;&#51216;&#51008; &#47588;&#44060;&#48320;&#49688;&#50640; &#46384;&#46972; &#44050;&#51060; &#45804;&#46972;&#51648;&#45716; &#47700;&#49436;&#46300;&#51032; &#52880;&#49905;&#51060; &#48520;&#44032;&#45733;&#54616;&#45796;&#45716; &#51216;&#51060;&#45796;. &#51060;&#47484; &#50508;&#44256; &#51080;&#51648;&#47564; &#44396;&#54788;&#54616;&#51648; &#50506;&#51008; &#51060;&#50976;&#45716; &#50529;&#54000;&#48652;&#49436;&#54252;&#53944;&#50640; &#54988;&#47469;&#54620; &#45824;&#50504;&#51060; &#51080;&#44592; &#46412;&#47928;&#51060;&#45796;. &#44536; &#45236;&#50857;&#51060; &#44417;&#44552;&#54620; &#49324;&#46988;&#51008; ActiveSupport::CachingTool::HashCaching#hash_cache &#47700;&#49436;&#46300;&#47484; &#52280;&#51312;&#54616;&#44592; &#48148;&#46976;&#45796;.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p align="right"&gt;&#51060; &#44544;&#51008; &lt;a href="http://deepblue.springnote.com/pages/364037"&gt;&#49828;&#54532;&#47553;&#45432;&#53944;&lt;/a&gt;&#50640;&#49436; &#51089;&#49457;&#46104;&#50632;&#49845;&#45768;&#45796;.&lt;/p&gt;</description>
      <pubDate>Thu, 12 Jul 2007 18:17:06 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:4976793f-61e1-4a74-9553-fb73817e32a9</guid>
      <author>deepblue</author>
      <link>http://myruby.net/articles/2007/07/12/%EB%A9%94%EC%84%9C%EB%93%9C-%ED%98%B8%EC%B6%9C-%EA%B2%B0%EA%B3%BC%EB%A5%BC-%EC%A0%80%EC%9E%A5%ED%95%9C%EB%8B%A4</link>
      <category>development</category>
    </item>
  </channel>
</rss>
