作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定一些实现一些广泛协议(protocol)或类似协议(protocol)的库(例如 FTP),我如何将我的标准兼容代码与只需要能够与不那么标准兼容的系统合作的代码分开?
一个很好的例子,恕我直言,像 jQuery 这样的库必须考虑所有这些浏览器的特性。必须保持遗留兼容性的项目也可能是此类技术的良好目标受众。
我对 ruby 解决方案特别感兴趣,但也欢迎与语言无关的模式或其他语言的好例子。
我已经找到了 related question在stackoverflow上,但是还有其他方法吗?
最佳答案
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/
我是一名优秀的程序员,十分优秀!