美文网首页
Refactor 重构 I

Refactor 重构 I

作者: RealAnalysis | 来源:发表于2020-07-24 14:36 被阅读0次

看到老朋友 before_action的手法 突然很感慨啊

老朋友了都 自然而然的看懂了为啥要放 private下面了

继承

情景:本来大家都“继承”一个controller大类A的特征,然后各自都出现一样的代码重复.

解法:开一个新的controller(属于“次大类”吧)B,让controller B继承 controller A aka. “B 拥有 A的特征”, 然后再把重复的代码放controller B中定义

最后让之前出现重复代码的那些“子controller”们 都来继承controller B. 这样就可以删掉他们中同样出现的那些重复代码了

真是机智啊,感觉就是“大类”底下再细分一个“次大类”,然后“次大类”中有更进一步的共享细节,就是在“不动最初的大类的前提下”更加细分的站队的手法

因为controller A这个大类很可能被更多其他的“子controller”们继承,不能轻易的改动 牵一发动全身啊

BTW 认真一想,这controller B的命名也有讲究的,名字最好是概括了重复代码起到的作用. 代码的可读性也是很重要的啊啊啊

Mixin 找不到英文解释 估计是“mix-in”吧?

居然是module来的?附上module它的IT英文解释

a part of a computer or software system or program that has a function and works together with other related parts

还是concern来的?!所以这几个全互相关联?!到底啥关系啊这三?!

难道是...concern是model文档旗下专门放“module”们的“专属储藏间”吗?放在这个“专属储藏间”的module们能用include被“跨境”式调用于各种model间?

ActiveSupport::Concern则是在不光只需要用到“module”而且需要跟其他操作方法一起运作时,比如跟before_action(它不是module)一起运作的时候,就需要靠ActiveSupport::Concern把“不相干”的两者绑定使用?



而且感觉"mixin"跟"继承"的作用很类似啊,这俩又什么区别跟关联啊?我观察的代码区别如下

继承,开一个新“model” 直接把重复代码贴过去,然后把“需要去重复代码的model们”里改个“<”进行继承,最后能删光重复代码

Mixin,不是开新“model”而是开一个“model/concern”文档,不是直接贴上重复代码 而是重新定义一个“module”后再在其下贴上重复代码,“需要去掉重复代码的model们”里不是删光重复代码即可 而是需要添加一句“ include ‘新concern文档定义action的名词’ ” 才能调用

认真品味两种代码的区别

两者不同是 多出了一个区块

  extend ActiveSupport::Concern
  
  included do 
    before_create :generate_token 
  end

还值得注意的是,不管是用哪种手法对付“重复代码”,把重复代码抽取出来放进重新定义的文档里时,新文档的命名都一个套路,就是把重复的代码起到的效用给“言明”. 都是为了代码的可读性啊啊啊

穿越回来告诉你一下,接下来的教程会有解答~“而Inheritance则是继承class时会用到的”

Instance method 跟 Class method 的区别

One line summary 一言概之
Class methods are methods that are called on a class and instance methods are methods that are called on an instance of a class.

举个例子 一目了然

class Foo
  def self.bar
    puts 'class method'
  end
  
  def baz
    puts 'instance method'
  end
end

Foo.bar # => "class method"
Foo.baz # => NoMethodError: undefined method ‘baz’ for Foo:Class

Foo.new.baz # => instance method
Foo.new.bar # => NoMethodError: undefined method ‘bar’ for #<Foo:0x1e820>

认真品味这代码,Foo是个 class来的, 而在它之下定义的 def baz就说明这个bazinstance method来的, Foo.new is an instance of Foo

所以 def self.bar就是为了跟baz这个instance method区别开,带上了self说明是个class method就是命名为Foo的class用的method

原来self是这样来的啊

这个例子还顺便直观的展示了“class”跟“instance”的区别 赞!!

带感的三个豆知识

  1. So when would you use a class method?
    Class methods are for anything that does not deal with an individual instance of a class.

  2. The key difference is instance methods only work with an instance and thus you have to create a new instance to use them (Foo.new)

  3. destroy is an instance method.

class FoosController < ActionController
  def destroy
    foo = Foo.find(params[:id])
    foo.destroy
    redirect_to foos_url
  end
end

另外 find是一个class method

更多细节看这 十多分钟能看下来的文章 文字语气亲切

http://www.railstips.org/blog/archives/2009/05/11/class-and-instance-methods-in-ruby/

相关文章

  • Refactor 重构 I

    看到老朋友 before_action的手法 突然很感慨啊 老朋友了都 自然而然的看懂了为啥要放 private下...

  • 十五章 重构工具

    idea 重构refactor初试 idea其他重构工具

  • 查单词

    zip_code - 邮政编码calculate - 计算refactor - 重构

  • Refactor 重构 II

    首先 我昨天的学习感悟 今儿就找到知音了 贴上来 In the past whenever something w...

  • IDEA 常用技巧

    1. 重构代码 Refactor - > Change Signature... (Ctrl + F6) 2. 实...

  • Eclipse重构功能(Refactor)

    Eclipse 重构 何为重构 重构,在《重构,改善既有代码的设计》这本经典的书中给出了定义,大概就是:在不改变代...

  • Commit 6 - 12:初步实现each

    Commit 6: refactor 主要改动:重构 备注:逻辑的改动并不大,主要是结构上面重构了一下 Commi...

  • Git commit message type

    type: commit 的类型feat: 新特性fix: 修改问题refactor: 代码重构docs: 文档修...

  • git提交规范

    init: 初始化feat: 新特性fix: 修改问题refactor: 代码重构docs: 文档修改style:...

  • Mac OS X IDEA 抽取代码块

    IDEA 在Mac 上抽取方法1-点击菜单的的形式Refactor(重构) - Extract(抽取)- Met...

网友评论

      本文标题:Refactor 重构 I

      本文链接:https://www.haomeiwen.com/subject/hzxjlktx.html