2012-02-13 2 views
5

Учитывая некоторую библиотеку, которая реализует какой-то широко распространенный протокол или что-то подобное (например, FTP), как я могу сохранить свой стандартный совместимый код отдельно от кода, который необходим только для того, чтобы быть в состоянии сотрудничать с нестандартными системами?Как отделить хороший код от кода устаревшего/quirks-режима

Хороший пример, где это будет иметь смысл. IMHO - это библиотеки, такие как jQuery, которые должны учитывать все эти особенности браузера. Проекты, которые должны поддерживать совместимость с предыдущими версиями, вероятно, также станут хорошей целевой аудиторией для таких методов.

Меня особенно интересуют рубиновые решения, но также приветствуются языковые независимые образцы или хорошие примеры из других языков.

Я уже нашел related question здесь, в stackoverflow, но есть ли другие подходы?

ответ

3
  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" 
+0

Опять же, очень сложный и исчерпывающий ответ. Большое спасибо. – raphinesse

 Смежные вопросы

  • Нет связанных вопросов^_^