gpt4 book ai didi

language-agnostic - 如何将好的代码与遗留/怪癖模式代码分开

转载 作者:行者123 更新时间:2023-12-04 20:52:14 27 4
gpt4 key购买 nike

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

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

我对 ruby​​ 解决方案特别感兴趣,但也欢迎与语言无关的模式或其他语言的好例子。

我已经找到了 related question在stackoverflow上,但是还有其他方法吗?

最佳答案

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

  • 小 ruby 示例:

    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"

    关于language-agnostic - 如何将好的代码与遗留/怪癖模式代码分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9265920/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com