Я работаю над приложением Python, которое работает на 2 различных платформах, а именно, обычном настольном Linux и Maemo 4. Мы используем PyGTK на обеих платформах, но на Maemo существует набор небольших тонких настроек, чтобы заставить его выглядеть хорошим, которые реализованы следующим образом:
if util.platform.MAEMO:
# do something fancy for maemo
else:
# regular pygtk
Существует примерно 15 из них, если операторы должны были получить взгляд UI и работу, хорошую на Maemo 4.
Это было очень управляемо для все это время. Проблема состоит в том, что только что была новая версия выпущенной Maemo (5, иначе Фримантл), и это имеет некоторые большие различия по сравнению с Maemo 4. Я не хочу добавлять набор проверок всюду по коду GUI для получения всех 3 платформ, работающих приятно с той же кодовой базой, потому что это стало бы грязным. Я также не хочу создавать копию исходного кода GUI для каждой платформы и просто изменять его для определенной платформы (я хотел бы снова использовать как можно больше кода).
Так, что пути состоят в том, чтобы иметь немного отличающийся UIs для различных платформ, которые основаны на том же базовом коде UI? Я не думаю, что это - Python или конкретный вопрос Maemo, я был бы точно так же, как, чтобы знать, как это сделано.
Большую часть этого можно завернуть на заводе:
def createSpec():
if util.platform.MAEMO: return Maemo4Spec()
elif util.platform.MAEMO5: return Maemo5Spec()
return StandardPyGTKSpec()
Затем, где-то на ранней стадии кода, Вы просто вызываете этот завод:
spec = createSpec()
Теперь, везде, где у Вас есть условия, Вы просто вызываете необходимую функцию:
spec.drawComboBox()
Пока drawComboBox()
, обрабатывает что-либо специфическое для платформы, Вы должны быть в хорошей форме.
Вы можете выделить специфические для платформы вещи, которые Вам нужно сделать, в небольшие последовательно названные функции внутри модуля платформы
, создать правильное имя функции, используя платформу, на которой Вы работаете, а затем getattr
и вызвать ее. После этого исчезнет котельная if/else.
Я сделал отдельный модуль для обработки всех моих специализаций между обычным Linux, Maemo 4.1 и Maemo 5. Он определяет, какие функции доступны, и позволяет программе изящно деградировать.
Например
def _fremantle_hildonize_window(app, window):
oldWindow = window
newWindow = hildon.StackableWindow()
oldWindow.get_child().reparent(newWindow)
app.add_window(newWindow)
return newWindow
def _hildon_hildonize_window(app, window):
oldWindow = window
newWindow = hildon.Window()
oldWindow.get_child().reparent(newWindow)
app.add_window(newWindow)
return newWindow
def _null_hildonize_window(app, window):
return window
try:
hildon.StackableWindow
hildonize_window = _fremantle_hildonize_window
except AttributeError:
try:
hildon.Window
hildonize_window = _hildon_hildonize_window
except AttributeError:
hildonize_window = _null_hildonize_window
Подробнее см. Dialcentral, Gonert, ejpi, или исходный код Quicknote для файла под названием hildonize.py https://garage.maemo.org/plugins/ggit/browse.php/?p=gc-dialer;a=blob;f=src/hildonize.py;
Еще один пример из GObject Utils (go_utils.py) из The One Ring
def _old_timeout_add_seconds(timeout, callback):
return gobject.timeout_add(timeout * 1000, callback)
def _timeout_add_seconds(timeout, callback):
return gobject.timeout_add_seconds(timeout, callback)
try:
gobject.timeout_add_seconds
timeout_add_seconds = _timeout_add_seconds
except AttributeError:
timeout_add_seconds = _old_timeout_add_seconds