当前位置:  开发笔记 > 后端 > 正文

在演示者中重用方法的常规方法是什么?

如何解决《在演示者中重用方法的常规方法是什么?》经验,为你挑选了1个好方法。

在演示者之间重用方法的惯例是什么?

例如,假设某个应用有以下演示者

class UserPresenter < BasePresenter
end
class AdminPresenter < BasePresenter
end
class EventPresenter < BasePresenter
end

用户和管理员都有头像.avatar在User和Admin演示者之间共享方法的正确方法是什么?

一种解决方案可能是从AvatarPresenter继承

class UserPresenter < AvatarPresenter
end
class AdminPresenter < AvatarPresenter
end
class EventPresenter < BasePresenter
end
class AvatarPresenter < BasePresenter
end

在这个简单的例子中哪个有效.但是如果事情在未来变得更加复杂(例如,Admin和Event之间共享的其他方法)会怎样.

我想我想分享主持人之间的担忧.这是一种传统方法,如果是这样,模板实现会是什么样子?我所有的尝试都在引发method not found错误.



1> max..:

你在寻找什么是特质.在Ruby中,它采用模块mixins的形式.

module Avatar
  def self.included(base)
    base.extend ClassMethods
    base.class_eval do
      # in this block you are operating on the singleton class
      # where the module is included
    end
  end

  def an_instance_method_from_avatar
  end

  module ClassMethods
    def a_class_method_from_avatar
    end
  end
end

class UserPresenter
  include Avatar
end

class AdminPresenter
  include Avatar
end

这使我们可以创建可以以多种不同方式组合的可重用组件.ActiveSupport :: Concern采用上述模式并简化它:

module Avatar
  # modules can be extended by other modules
  extend ActiveSupport::Concern

  included do
    # in this block you are operating on the singleton class
    # where the module is included
  end

  class_methods do
    def a_class_method_from_avatar
    end
  end

  def an_instance_method_from_avatar
  end
end

另一方面,如果对象是其父对象的真实子类型,则应该真正使用继承(基于类).虽然你可以说AdminPresenter是一个带有头像的演示者,如果你需要添加其他功能,这将导致一个非常复杂的类图.

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有