元編程

原文參考:[url]http://rails-bestpractices.com/posts/16-dry-metaprogramming[/url]

如果你發現一些方法,其定义是类似的,只是方法名称不同,那么我們可以使用元编程来優化我們的代碼...

先來看看經典的"挫男代碼"(從車車進化而來的東東)
class Post < ActiveRecord::Base
validate_inclusion_of :status, :in => ['draft', 'published', 'spam']

def self.all_draft
find(:all, :conditions => { :status => 'draft' }
end

def self.all_published
find(:all, :conditions => { :status => 'published' }
end

def self.all_spam
find(:all, :conditions => { :status => 'spam' }
end

def draft?
self.status == 'draft'
end

def published?
self.status == 'published'
end

def spam?
self.status == 'spam'
end
end


上面那段代碼一看就知道符合定義類似,方法不同的規則了,那么開始重構吧:

class Post < ActiveRecord::Base

STATUSES = ['draft', 'published', 'spam']
validate_inclusion_of :status, :in => STATUSES

class <<self
STATUSES.each do |status_name|
define_method "all_#{status_name}" do
find(:all, :conditions => { :status => status_name }
end
end
end

STATUSES.each do |status_name|
define_method "#{status_name}?" do
self.status == status_name
end
end

end


嘖嘖
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值