Tips dan Trik : Mari Belajar Iteration dengan Ruby

Posted: July 29, 2009 in RUBY
Tags: , , , ,

Anda pernah terkesima dengan if bersarang yang super jupiter dalam (bisa 3, bisa sampai 10, bergantung dengan keindahan varian uniknya kompleksitas sistem yang ada) ?

Contoh:

Dir.foreach(self::COUNTER_VIEW) do |tmp_publisher|
  if tmp_publisher != "." && tmp_publisher != ".."
    # dan sarang-sarang selanjutnya.

Tentu kurang bijak bila berparadigma siapa yang salah (seperti menyalah-nyalahkan programmer), tapi kali ini tidak ada yang senang curcol musibah. Harta warisan codes tadi bisa jadi dipelihara dengan cara yang “agak” beradab. Sebagaimana contoh berikut:

Dir.foreach(self::COUNTER_VIEW) do |publisher_path|
  unless ['.', '..'].include? publisher_path
    # dan sarang-sarang selanjutnya.

Tetapi masih belum juga. Karena peradaban masih perlu dibina (jadi seperti game Age of Empire ya? atau Empire Earth?). Maka ada cara sederhana, yakni membuatkan iteration saja agar codes menjadi bisa dibaca dengan bahagia.

# Describes Directory Operations in Adpoint App.
#
module AdpointDir

  # Process any directories or files except :
  # - . and .. dir.
  # - others but the exact pattern if pattern is not nil.
  #
  # ==== Parameters
  # path::                     A directory path.
  # pattern::                  ex. /\.yml$/
  #
  # ==== Returns
  # Block of filtered Dir foreach
  #
  def ls(path, pattern=nil)
    Dir.foreach(path) do |e|
      yield e if (pattern ? e =~ pattern : true) && !['.', '..'].include?(e) 
    end
  end
end

Jadi cara panggilnya sekarang jadi tinggal:

AdpointDir.ls(counter_view) do |publisher_path|
  # langsung perintah-perintahnya.
  # .... dan seterusnya

Mengenai pattern Regexp itu adalah jika misalkan saja khusus file file yaml saja yang diproses, tinggal ditambahkan saja parameternya setelah path berupa instan obyek dari class Regexp. Begitu.

tinggalkan feedback konstruktif atau lebih baik diam

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s