`
fireflyman
  • 浏览: 113359 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

元編程

    博客分类:
  • ROR
阅读更多
原文參考:http://rails-bestpractices.com/posts/16-dry-metaprogramming

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

先來看看經典的"挫男代碼"(從車車進化而來的東東)
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


嘖嘖
分享到:
评论
3 楼 keating 2010-07-29  
你在做翻译吗?这需不需要版权...

Java不知道能不能这么做...但,写java,公司是不会允许这么写的~~~
2 楼 笨笨狗 2010-07-29  
把instance换成class,可以少敲3个字母,囧
1 楼 笨笨狗 2010-07-29  
STATUSES.each do |status_name|
  instance_eval <<-CODE
    def all_#{status_name}
      find(:all, :conditions => { :status => #{status_name} })      
    end
    define_method :#{status_name}? do
        status = #{status_name}
    end
  CODE
end

相关推荐

    Ruby元编程第二版中文

    Ruby元编程第二版,中文影印版,便于英文不好的同学们学习

    c++模板元编程详解

    所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能力,模板使 C++ 编程变得异常灵活,能实现很多高级动态语言才有的特性(语法上可能比较丑陋,一些历史原因见下文)。普通用户对 ...

    《MacTalk 人生元编程》

    MacTalk·人生元编程》是一本随笔文集,主要内容来自作者的微信公众平台【MacTalkBy池建强】。 【MacTalkBy池建强】纯属无心之作,开通在2012末日前夕。最初只是想每天发送一条Mac技巧,但写起来却并非如此,最终...

    C++模板元编程

    C++模板元编程,ISBN:9787111267423,作者:(美)大卫 等著,荣耀 译 原作名: C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond 出版年: 2010-1 页数: 277

    C++元编程和Boost编程库

    C++元编程和Boost编程库

    C++模板元编程.pdf

    C++模板元编程.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!

    ruby元编程.pdf

    ruby元编程.pdf ruby 元编程 这本书对ruby的调用原理做了非常精辟的分析。 ruby 元编程 这本书对ruby的元编程方式做了比较好的阐释。 ruby 元编程 这本书对结对编程有一个很好的提现。

    Ruby元编程pdf

    Ruby元编程pdf

    《C++模板元编程实战 一个深度学习框架的初步实现》_李伟.pdf

    《C++模板元编程实战:一个深度学习框架的初步实现》以一个深度学习框架的初步实现为例,讨论如何在一个相对较大的项目中深入应用元编程,为系统性能优化提供更多的可能。

    有限元编程语言fenics手册

    开源有限元编程语言fenics手册,fenics是linux系统上用于有限元编程的的工具,适用于不同的数学物理问题

    c++模板元编程代码

    c++模板元编程代码

    模板元编程技术pdf

    模板元编程,很好的资料,适合学习与开发 ,大家放心下载

    现代C ++ 中的模板元编程 (TMP) 艺术_C++_代码_下载

    Monster 是一个元编程库,它只有头文件,可扩展且面向现代 C++。 它展示了一种编译时算法、序列和高阶元函数的纯类型编程形式。 Monster 提供了一个概念基础和一套广泛而强大且连贯的工具,这使得在现代 C++ 中进行...

    c++模板元编程 光盘

    c++模板元编程 光盘 去掉boost库和一些东东 7z自解压

    .NET元编程英文版

    .NET元编程英文版

    c++模板元编程

    c++开源项目 将c++模板编程推向了一个新的高峰,同时这也是模板元编程的非常好的一份源代码

    模板元编程概述

    详细描述C/C++的模板元编程的相关内容

    Ruby元编程-中文

    ruby 元编程 中文 《Ruby元编程》以案例形式循序渐进地介绍Ruby特有的实用编程技巧。通过分析案例、讲解例题、回顾Ruby代码库的实现细节,作者不仅向读者展示了Ruby编程的优势和Ruby特有的解决问题的方式,更详细开...

    模板元编程技术

    模板元编程技术

Global site tag (gtag.js) - Google Analytics