[前][次][番号順一覧][スレッド一覧]

learn-ruby-in-kansai:2331

From: ujihisa <ujihisa@g...>
Date: Mon, 20 Sep 2010 18:00:27 -0700
Subject: [learn-ruby-in-kansai:2331] Re: [learn-ruby-in-kansai] メーリングリスト停止のご案内

リファクタリングしてみました。


--- before.rb	2010-09-20 17:53:42.000000000 -0700
+++ after.rb	2010-09-20 17:58:48.000000000 -0700
@@ -1,26 +1,15 @@
-def getGeoPoints(q)
-  ret = Hash.new
-  $URL = "http://maps.google.com/maps/geo?"
+def getpoints(q)
   # q = '北海道岩見沢市八条東10丁目2-55'
-  url = $URL + {'q' => q, 'output' => 'xml'}.map { |key, value|
+  url = "http://maps.google.com/maps/geo?" + {'q' => q, 'output' =>
'xml'}.map {|key, value|
     "#{CGI.escape(key)}=#{CGI.escape(value)}"
   }.join('&')

-  # 読み取る
-  open(url) do |f|
-    xml = f.read
-    doc = REXML::Document.new(xml)
+  doc = open(url) {|f| REXML::Document.new f.read }

-    # coordinates タグの中身を読み取る
-    status = REXML::XPath.first(doc.root, '//code').text
-    if (status=='200')
-      latlng = REXML::XPath.first(doc.root, '//coordinates').text
-      ret['longitude'], ret['latitude'] = latlng.split(/,/)
-      ret['longitude'] = ret['longitude'].to_f
-      ret['latitude'] = ret['latitude'].to_f
-    else
-      ret = nil
-    end
-  end
-  return ret
+  return unless REXML::XPath.first(doc.root, '//code').text == '200'
+  lo, la = REXML::XPath.first(doc.root, '//coordinates').text.split(/,/)
+  {
+    'longitude' => lo.to_f,
+    'latitude' => la.to_f
+  }
 end


適用するとこんな感じになります。

def getpoints(q)
  # q = '北海道岩見沢市八条東10丁目2-55'
  url = "http://maps.google.com/maps/geo?" + {'q' => q, 'output' =>
'xml'}.map {|key, value|
    "#{CGI.escape(key)}=#{CGI.escape(value)}"
  }.join('&')

  doc = open(url) {|f| REXML::Document.new f.read }

  return unless REXML::XPath.first(doc.root, '//code').text == '200'
  lo, la = REXML::XPath.first(doc.root, '//coordinates').text.split(/,/)
  {
    'longitude' => lo.to_f,
    'latitude' => la.to_f
  }
end

# メソッド名がかわっているので正しいリファクタリングではないですね・・・。

2010/9/20 Daisuke Furukawa <mogya@m...>:
> なんですって。それは大変だ!
> じゃあ、最近書いたコードの中から、GoogleMapsAPIを使って住所を緯度経度に変換する関数を貼り付けてみます。
>
> def getGeoPoints(q)
>  ret = Hash.new
>  $URL = "http://maps.google.com/maps/geo?"
> # q = '北海道岩見沢市八条東10丁目2-55'
>  url = $URL + {'q' => q, 'output' => 'xml'}.map { |key, value|
>    "#{CGI.escape(key)}=#{CGI.escape(value)}"
>  }.join('&')
>
>  # 読み取る
>  open(url) do |f|
>    xml = f.read
>    doc = REXML::Document.new(xml)
>
>    # coordinates タグの中身を読み取る
>    status = REXML::XPath.first(doc.root, '//code').text
>    if (status=='200')
>      latlng = REXML::XPath.first(doc.root, '//coordinates').text
>      ret['longitude'], ret['latitude'] = latlng.split(/,/)
>      ret['longitude'] = ret['longitude'].to_f
>      ret['latitude'] = ret['latitude'].to_f
>    else
>      ret = nil
>    end
>  end
>  return ret
> end
>
> 2010年9月21日8:55 ujihisa <ujihisa@g...>:
>> 聞いた話によりますと、最近書いた美しいコード辺をここに貼付けないとメーリングリストが停止されるとのことです。
>>
>> --
>> ML: learn-ruby-in-kansai@r...
>> 使い方: http://QuickML.com/
>>
>
> --
> ML: learn-ruby-in-kansai@r...
> 使い方: http://QuickML.com/
>

--
ML: learn-ruby-in-kansai@r...
使い方: http://QuickML.com/

[前][次][番号順一覧][スレッド一覧]

      2328 2010-09-21 01:13 [y.arakawa@m...      ] Re: [learn-ruby-in-kansai] メーリングリスト停止のご案内
      2329 2010-09-21 01:55 ┗[ujihisa@g...        ]                                       
      2330 2010-09-21 02:10  ┗[mogya@m...          ]                                     
->    2331 2010-09-21 03:00   ┗[ujihisa@g...        ]                                   
      2332 2010-09-21 03:24    ┗[mogya@m...          ]