Я создаю проект [Iron] Ruby, который должен поддерживать несколько сред (в частности, WPF, Silverlight и WinForms - но это не так важно). Ниже приведен конкретный пример того, где я застрял:
Мне нужно реализовать класс Bitmap
как часть библиотеки, и этот класс нужно будет реализовывать по-разному в зависимости от среды, в которой он запущен (например, если я запускаю его в браузере как приложение silverlight, У меня не будет доступа к методам, которые будут доступны на рабочем столе). И вот в чем подвох - я не контролирую создание экземпляров Bitmap
и других классов внутри библиотеки. Зачем? Потому что это порт другого приложения; и, хотя у меня есть код для приложения, я не хочу нарушать совместимость, изменяя этот код. Однако я делаю , контролирую точку входа в приложение, поэтому могу require
делать все, что мне нужно, выполнять настройку, настраивать глобальные переменные и т. Д.
Редактировать: Если вам интересно, это проект, над которым я работаю:
http://github.com/cstrahan/open-rpg-maker
Вот что я хочу знать:
- Как настроить конфигурацию при запуске, чтобы растровое изображение работало надлежащим образом?
- Как мне структурировать это в моем дереве git repo / source?
Вот некоторые из моих мыслей, но я уверен, что у вас будут лучшие идеи:
- Как настроить конфигурацию при запуске?
- При распространении приложения поместите
require
вверху в зависимости от целевой среды, например: require silverlight/bitmap
. В этом случае lib/bitmap.rb
будет пустым, а lib/silverlight/bitmap.rb
будет содержать реализацию. Или ...
- Вставить все реализации в
lib/bitmap.rb
и выполнить условно на основе переменной или константы экземпляра класса: Bitmap.impl = "silverlight"
. Или ...
- Поддерживайте отдельную ветвь для каждого дистрибутива - несмотря на то, что библиотека почти одинакова.
- Как мне структурировать это в моем дереве git repo / source?
- Отдельные ветви для распределения. Или ...
- Отдельные зависящие от реализации подпапки (например,
lib/silverlight/bitmap.rb
).
Будучи новичком в Ruby, я не очень знаком с такими лучшими практиками (я из C #). Любой совет будет принята с благодарностью!
-Charles