Ruby 中实现的所有设计模式的备忘单?

2024-05-27

我想知道是否有针对 Ruby 中实现的所有设计模式的备忘单,这样您就不必重新发明轮子。


设计模式对于组织大量代码非常有用。因为您不需要像在 #{verbose_algol_derivitive_language} 中那样编写那么多代码来在 ruby​​ 中执行操作,因此它们的重要性不一样。

您将看到使用什么all时间是用块实现的策略和构建器(构建器的一个例子是 Rails 视图中的 form_for 块,策略的一个例子是 File.open)我真的记不起上次看到任何其他模式是什么时候了(无论如何,gof 模式)

编辑:回应

你的意思是用红宝石我们不需要 考虑大多数的设计模式 案例?另一个问题,如果我使用 Rails,我真的需要考虑吗 关于设计模式?因为我不 知道在哪里使用它们。他们不 似乎适合任何组件 MVC。设计模式仅用于 正在大规模建设的人们 库/框架例如。导轨, DataMapper、MongoID 等,不适用于 其他人只使用这些 框架/库?

在大多数情况下,rails 会为您做出很多决定,直到您的应用程序达到相当高的复杂程度为止。即使您使用的是 sinatra 之类的东西(它不会为您决定任何事情),您仍然不需要像在(例如)java这样的语言中那样接触这些 GoF 模式。

这是因为设计模式的全部要点是保持事物灵活性和可维护性的封装方法。如果这是内置于语言中的,通常甚至不需要它们。

例如,用 java 实现的策略模式看起来有点像这样

//StrategyExample test application

class StrategyExample {

    public static void main(String[] args) {

        Context context;

        // Three contexts following different strategies
        context = new Context(new ConcreteStrategyAdd());
        int resultA = context.executeStrategy(3,4);

        context = new Context(new ConcreteStrategySubtract());
        int resultB = context.executeStrategy(3,4);

        context = new Context(new ConcreteStrategyMultiply());
        int resultC = context.executeStrategy(3,4);

    }

}

// The classes that implement a concrete strategy should implement this

// The context class uses this to call the concrete strategy
interface Strategy {

    int execute(int a, int b);

}

// Implements the algorithm using the strategy interface
class ConcreteStrategyAdd implements Strategy {

    public int execute(int a, int b) {
        System.out.println("Called ConcreteStrategyAdd's execute()");
        return a + b;  // Do an addition with a and b
    }

}

class ConcreteStrategySubtract implements Strategy {

    public int execute(int a, int b) {
        System.out.println("Called ConcreteStrategySubtract's execute()");
        return a - b;  // Do a subtraction with a and b
    }

}

class ConcreteStrategyMultiply implements Strategy {

    public int execute(int a, int b) {
        System.out.println("Called ConcreteStrategyMultiply's execute()");
        return a * b;   // Do a multiplication with a and b
    }

}

// Configured with a ConcreteStrategy object and maintains a reference to a Strategy object
class Context {

    private Strategy strategy;

    // Constructor
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public int executeStrategy(int a, int b) {
        return strategy.execute(a, b);
    }

}

这是一项繁重的工作,但你最终得到的东西在很多时候都是值得的,并且可能是一个大泥球和有机会得到维护的东西之间的区别。现在让我们用 ruby​​ 来做

class Context
  def initialize(&strategy)
    @strategy = strategy
  end

  def execute
    @strategy.call
  end
end



a = Context.new { puts 'Doing the task the normal way' }
a.execute #=> Doing the task the normal way

b = Context.new { puts 'Doing the task alternatively' }
b.execute #=> Doing the task alternatively

c = Context.new { puts 'Doing the task even more alternatively' }
c.execute #=> Doing the task even more alternatively

甚至很难称其为模式,您只是在使用块!当语言涵盖了模式所解决的需求时,有效地使用该语言将意味着在大多数情况下您并不真正需要该模式。这也意味着您可以优雅地解决此类问题,而采用 Java 风格的策略可能会造成可怕的矫枉过正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby 中实现的所有设计模式的备忘单? 的相关文章

随机推荐

  • Android Studio“等待调试器”

    我创建了简单的 你好 世界 使用 android studio 的项目 当我在设备或模拟器上运行它时 一切都很好 然后我尝试在调试模式下运行它 几分钟后屏幕上的 等待调试器 对话框失败并且 Error running test test U
  • 为什么我们要关闭 Mysqli 中的结果

    为什么我们要关闭 result mysqli new mysqli localhost root root test if mysqli gt connect errno echo Failed to connect to MySQL my
  • Freebase RDF 转储的 C# 解析仅产生 1150 万个 N-三元组,而不是 19 亿个

    我正在构建一个 C 程序来读取 RDF 数据Google Freebase 数据转储 https developers google com freebase data 首先 我编写了一个简单的循环来简单地读取文件并获取三元组的计数 然而
  • 控制 HTML 中的图像加载顺序

    有没有办法控制网页上图像的加载顺序 我正在考虑尝试通过首先加载轻量级 加载 图形来模拟预加载器 有任何想法吗 Thanks 使用 Javascript 并填充图像src属性稍后 这 告诉浏览器链接到页面上的 URL 因此不会向服务器发送请求
  • 最小工作聚合物示例

    我一直在尝试使用 Polymer 获得一个极其简单的网页 以便在浏览器中简单地呈现 我在服务器端使用 Node ExpressJS Jade 设置 我的代码与 Polymer 文档附带的示例非常接近 我认为我缺少一些非常简单的东西 我正在使
  • 为什么我不能声明推断类型?

    我有以下内容 runcount Eq a Num b gt a gt b runcount runcountacc 0 runcountacc Eq a Num b gt b gt a gt b runcountacc n runcount
  • 除了在断点处停止之外,如何测量一大块代码的时间?

    我正在 Windows 上开发 C 游戏 模拟 图形应用程序 编辑开始 如果重要的话 我正在使用 Visual Studio 2013 编辑完 Setup 我正在使用 QueryPerformanceCounter 测量从一帧到下一帧的时间
  • Numpy 中矩阵乘以另一个矩阵的每一行

    我有一个大小为 4x4 的齐次变换矩阵和一个大小为 nx3 的轨迹 该轨迹的每一行都是一个向量 我想将齐次变换矩阵乘以轨迹的每一行 下面是代码 append zero column at last trajectory np hstack
  • 无法在 phppgadmin 中编辑或删除数据或行

    当我尝试在 phppgadmin 中编辑数据时 无论哪个表或行 我总是收到以下通知 No unique identifier for this row 并且没有任何更改 保存 我登录的用户对数据库具有完全权限 并且数据库中的所有表都有主键
  • Facebook API 注销我的应用程序,但不注销 Facebook

    如何使用 Facebook 的 api 进行注销 让我退出我的应用程序 网站 但保持登录 facebook com 的状态 这让我登录正常 window fbAsyncInit function FB init appId status t
  • Matplotlib 颤抖比例

    我正在尝试使用 matplotlib 和 quiver 函数绘制一些箭头 但我想使用数组单独选择每个箭头的长度 http matplotlib sourceforge net api pyplot api html matplotlib p
  • Cookie 过期时间格式

    我从谷歌浏览器的 Cookies 文件和其中的一列创建了数据库cookies表是expires utc 该列的格式类似于 13169399213145330 这更像是unix时间 但是当我尝试使用 unix 时间转换器时 它给出了错误的值
  • 接口对象无法扩展 Record

    为什么接口无法扩展Record interface Data a string Data extends Record
  • dplyr 标准评估:summarise_ 以及求和变量的变量名称

    我遇到了很多与我的问题类似的问题 但只解决了我问题的一部分 我使用带有标准评估的 dplyr 来容纳变量名称 这对于管道中的 filter 和 group by 效果很好 但是 为了总结 我无法为我正在求和的指标提供变量名称 一个例子就可以
  • 如何保护 ASP.NET Web API [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想建立一个RESTful使用 ASP NET Web API 的 Web 服务 第三方开发人员将使用该服务来访问我的应用程序的数据
  • 在 UIPickerView 中选择某些内容时发生某些事情

    我正在致力于创建一个使用 UIPickerView 的应用程序 我制作了视图 但我试图让某个按钮改变它的功能 请帮忙 UIPickerView 和许多其他控件使用委托模式来通知您发生的事件 要使用它添加
  • 使用“class-validator”在 TypeScript 中确认密码

    今天 我试图弄清楚如何在应用程序的后端 NestJS 验证注册表单 我只是想知道是否存在一种验证方法password and passwordConfirm匹配 使用class validator包来构建自定义验证器或利用提供的验证器 我正
  • 会话变量由于某种原因丢失

    我尝试建立一个电子商店 每件物品旁边都有一个asp imagebutton单击此图像按钮时 我正在检查会话变量是否session basket 是否存在 如果不存在 则我将值添加到列表 实体类 中 然后在会话中添加此列表 如果会话不为空 那
  • 在类中设置默认值

    我正在用 Python 创建一个类 但我不确定如何正确设置默认值 我的目标是为所有类实例设置默认值 也可以通过类方法对其进行修改 但是 我希望在调用方法后恢复初始默认值 我已经能够使用下面所示的代码使其工作 它不是很 漂亮 所以我怀疑这是解
  • Ruby 中实现的所有设计模式的备忘单?

    我想知道是否有针对 Ruby 中实现的所有设计模式的备忘单 这样您就不必重新发明轮子 设计模式对于组织大量代码非常有用 因为您不需要像在 verbose algol derivitive language 中那样编写那么多代码来在 ruby