如何将好的代码与遗留/怪异模式代码分开

2024-01-02

给定一些实现某些广泛协议或类似协议(例如 FTP)的库,我如何将符合标准的代码与仅需要能够与不那么符合标准的系统配合的代码分开?

一个很好的例子,恕我直言,像 jQuery 这样的库必须考虑所有这些浏览器的特性。必须保持遗留兼容性的项目也可能是此类技术的良好目标受众。

我对 ruby​​ 解决方案特别感兴趣,但也欢迎独立于语言的模式或来自其他语言的好示例。

我已经找到了一个相关问题 https://stackoverflow.com/questions/2245871/how-do-you-cleanly-separate-code-for-backwards-compatibility-from-the-main-code在 stackoverflow 上,但是还有其他方法吗?


  1. 为不同的模式定义不同的实现(这可以防止您必须将“好的”代码与只是为了保持向后兼容性的代码混合在一起)。理想情况下,遗留层只是符合标准的代码的包装。
  2. 检测底层系统(浏览器、远程服务器等)符合标准的程度。具体如何完成显然很大程度上取决于具体情况。
  3. 为特定系统选择正确的实现并透明地将其插入。
  4. 让用户有机会检查我们所处的模式并强制使用特定模式。

小红宝石示例:

class GoodServer
  def calculate(expr)
    return eval(expr).to_s
  end
end

class QuirkyServer
  def calculate(expr)
    # quirky server prefixes the result with "result: "
    return "result: %s" % eval(expr)
  end
end

module GoodClient
  def calculate(expr)
    @server.calculate(expr)
  end
end

# compatibility layer
module QuirkyClient
  include GoodClient
  def calculate(expr)
    super(expr).gsub(/^result: /, '')
  end
end

class Client
  def initialize(server)
    @server = server
    # figure out if the server is quirky and mix in the matching module
    if @server.calculate("1").include?("result")
      extend QuirkyClient
    else
      extend GoodClient
    end
  end
end

good_server = GoodServer.new
bad_server = QuirkyServer.new

# we can access both servers using the same interface
client1 = Client.new(good_server)
client2 = Client.new(bad_server)

p client1.is_a? QuirkyClient # => false
p client1.calculate("1 + 2") # => "3"

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

如何将好的代码与遗留/怪异模式代码分开 的相关文章

  • 加速“最接近”字符串匹配算法

    我目前正在处理一个非常大的位置数据库 并尝试将它们与现实世界的坐标相匹配 为了实现这一点 我下载了地名数据集 https www geonames org export 其中包含很多条目 它给出了可能的名称和纬度 经度坐标 为了尝试加快该过
  • 封装和抽象之间的区别

    我今天去面试了 我有一个问题来自OOP 关于之间的区别封装 抽象 我据我所知回答说封装基本上将数据成员和成员函数绑定到一个称为Class 然而抽象基本上是为了隐藏实现的复杂性并为用户提供方便的访问 我以为她会同意我的回答 但她质疑 如果两者
  • 多元二分法

    我需要一种算法来执行二维二分法来解决 2x2 非线性问题 示例 两个方程f x y 0 and g x y 0我想同时解决这个问题 我非常熟悉一维二分 以及其他数值方法 假设我已经知道解决方案位于界限之间x1 lt x lt x2 and
  • 空指针与悬挂指针

    空指针和悬空指针之间有有意义的区别吗 看起来这两个术语都用于表示不指向任何内容的指针 是一个悬空指针的想法used引用某些东西 但现在没有 其中空指针只是一个不引用任何东西的指针 无论它过去指向什么 指针术语 悬空 或野 指针 指向某处的指
  • 为什么矢量化通常比循环更快?

    为什么在执行操作的硬件的最低级别和所涉及的一般底层操作 即 运行代码时所有编程语言的实际实现通用的事情 矢量化通常比循环快得多 计算机在循环时会做什么而在使用矢量化时不会做什么 我指的是计算机执行的实际计算 而不是程序员编写的计算 或者它有
  • 优化康威的“生命游戏”

    为了进行实验 我 很久以前 实施了康威的生命游戏 http en wikipedia org wiki Conway s Game of Life 而且我知道this https stackoverflow com questions 18
  • 您能解释一下流的概念吗?

    我知道流是字节序列的表示 每个流都提供了向其给定的后备存储读取和写入字节的方法 但流的意义何在 为什么我们与之交互的不是后备存储本身 不管出于什么原因 这个概念并不适合我 我读过很多文章 但我想我需要一个类比或其他东西 选择 流 这个词是因
  • (以编程方式)比较 PDF 的可靠方法? [复制]

    这个问题在这里已经有答案了 可能的重复 比较大量 PDF 文件的工具 https stackoverflow com questions 145657 tool to compare large numbers of pdf files 我
  • 在 OAuth2.0 中使用 Facebook 访问令牌作为资源所有者凭据

    OAuth 2 0 规范定义了资源所有者密码凭证授予类型 https datatracker ietf org doc html draft ietf oauth v2 26 section 4 3 它允许直接使用资源所有者密码凭据 即用户
  • 您能解释一下流的概念吗?

    我知道流是字节序列的表示 每个流都提供了向其给定的后备存储读取和写入字节的方法 但流的意义何在 为什么我们与之交互的不是后备存储本身 不管出于什么原因 这个概念并不适合我 我读过很多文章 但我想我需要一个类比或其他东西 选择 流 这个词是因
  • 多个资源的 REST 接口使用

    我目前正在通过 http 添加 REST API 到在线服务 我遇到了一个非常简单的问题 我找不到令我满意的答案 我主要有 2 个资源 用户 和 报告 正如您所猜测的那样 报告与用户相关联 与一个且仅一个 我的数据库中的外键 不管怎样 我有
  • 基于正方形瓷砖直角三角形象限的坐标系中的边界框

    我正在为游戏创建一个基于图块的 2D 地形系统 然而 我还使用游戏中的坐标 需要能够将边界框映射到 图块坐标 中 并点击边界框接触的每个图块 不用担心 有一个 kd 树和所有工作 美好的 使用定点 真实世界 坐标 我可以将每个图块计为 2
  • 将数字缩放为 <= 255?

    我的单元格的数值可以是 0 到 0 之间的任何值Integer MAX VALUE 我想对这些单元格进行相应的颜色编码 如果该值 0 则 r 0 如果该值是Integer MAX VALUE 则 r 255 但是中间的值呢 我想我需要一个函
  • 链表、数组和硬件内存缓存

    虽然之前有人问过关于链表与数组的问题 但答案大多归结为我们大多数人在某些时候可能已经学到的东西 列表擅长插入和删除 数组擅长随机访问 现在 像 Bjarne Stroustrup 这样受人尊敬的人已经argued https www you
  • 3 维装箱算法

    我面临着 3 维装箱问题 目前正在进行一些初步研究 了解哪些算法 启发式方法目前能产生最佳结果 由于问题是 NP 难问题 我不希望在每种情况下都能找到最佳解决方案 但我想知道 1 最好的精确求解器是什么 分支定界 我期望使用合理的计算资源可
  • 数据库、表和列命名约定? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 每当我设计数据库时 我总是想知道是否有命名数据库中项目的最佳方法 我经常问自己以下问题 表名应该是复数吗 列名应该是单数吗 我应该为表或列添加前
  • 哪种数据聚类算法适合检测时间序列事件中未知数量的聚类?

    这是我的场景 考虑在不同地点和时间发生的一组事件 例如 考虑有人在高空记录暴风雨期间城市中的雷击 就我的目的而言 闪电是瞬时的 只能击中某些位置 例如高层建筑 还可以想象每次雷击都有一个唯一的 ID 以便以后可以参考该雷击 这个城市大约有1
  • 如何为抽象工厂创建的类设置特定属性?

    是否可以让具体工厂使用抽象工厂模式为其创建具有特定类型参数的具体类 或者由各自的具体工厂创建的不同具体类是否需要具有相同的字段 例如 在下图中 您将如何使用客户端 应用程序 给出的不同参数集来实例化 WinButton 和 OSXButto
  • “此应用程序已请求运行时以异常方式终止它”的原因是什么?

    Visual C 运行时抛出一个常见错误 此应用程序已请求运行时以异常方式终止它 请联系应用程序的支持团队以获取更多信息 该错误消息实际上是什么意思mean 让我用一个比喻来准确地解释我的问题 如果我看到一条消息 异常 访问冲突 0xc00
  • 什么是拉姆达?

    有人可以很好地描述什么是 Lambda 吗 我们为它们设置了一个标签 它们涉及 C 问题的秘密 但我还没有找到一个很好的定义和解释来解释它们是什么 闭包 lambda 和匿名函数不一定是同一件事 匿名函数是任何没有 或者至少不需要 自己名称

随机推荐