ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
20 апреля
560093 Топик полностью
Николай Коровин (16.11.2014 20:56, просмотров: 93) ответил Скрипач на А давай! 8)
Пост второй из стапиццот. Решения, которые работают: Mandatory and Optional. Один из старых, проверенных тягловых супербизонов совместимости -- деление всех сущностей на мандатную и опциональную часть. Как ни странно, самый живой и правильный пример мы можем видеть в мастдае: структура начинается с её размера, дальше идёт всё, что определено в структуре данного размера. При переходе на новую структуру новые данные дописываются "в хвост", изменения уже задефайненных частей не допускаются. Решение не для нашего опенсорса, но где-то в более совершенной Вселенной, возможно, опенсорсовиков можно было бы достаточно дисциплинировать, чтобы они советовались перед тем, как совать свои выдумки в общую структуру. По крайней мере, в мега-проектах уровня ядра линуха дисциплины на такое хватает и в нашем убогом мире. Этот пример также интересен своей рекурсивностью: для каждой версии структуры всё, что определено на тот момент -- мандатное, а всё, что идёт дальше -- опциональное. Правда, это не самый чистый пример, так как с опциональной частью можно делать намного более интересные вещи, чем просто игнорировать. Врезка: в нужный момент я забыл правильно поставить задачу. Итак, постановка задачи: критерий идеальной системы -- это когда ПО, попавшее в потенциально незнакомое железное окружение, продолжает работать до тех пор, пока возможностей окружения физически хватает для решения прикладных задач прикладного ПО. Как если бы оно под эту систему и писалось. Принцип "мандатности и опциональности", очевидно, работает не только в структурах. Вернёмся к нашему "мёртвому примеру" и дополним его: допустим, что программа создаёт окно с указанием, какой минимальный размер окна ей нужен и с каким максимальным размером она умеет работать, какой создать по дефолту, а также минимальную/желаемую глубину цвета. Предположим, что у нас внезапно появились тетрахроматические дисплеи. Тогда программа, умеющая работать с тетрахроматикой, использует для инициализации окна структуру 1.1, в которой упомянута тетрахроматика, и по итогам сразу же и узнает -- знает ли про неё ОС, активировать ли эти функции? Тут возможны три варианта. 1) Программа умеет и строго требует. Запросила с записью в хвосте "обязательно", получила вместо хэндлера окна NULL (версия ОС знает про тетрахром, но дисплей на девайсе обычный, окно, отвечающее мандатным требованиям, невозможно создать). АвОст. 2) Программа умеет и строго требует. Запросила с записью в хвосте "обязательно", получила хэндлер окна, в параметрах которого триколор: ОС не знает про тетрахром и игнорировала хвост структуры. АвОст. 3) Программа умеет и нестрого требует. Запросила с записью в хвосте "желательно", получила, проверила, есть ли тетрахром. Если нет -- переключается в режим триколора, и пофиг ей, знала ОС и не смогла или просто не знала и откинула неизвестный хвост. Программа, которая не идёт дальше джаббер-чата, будет предъявлять более спокойные требования. Минимальное окно -- 4х20 с разрешением "монохромная псевдографика", но по дефолту 640х480 RGB. Получив от ОС, что именно удалось создать на имеющемся дисплее, программа без лишних ветвлений делит Height - 1 на три, в верхних двух третях даёт команду "создать текстовое окно вывода", потом проводит полосу в один пиксел и в нижней трети даёт команду "создать текстовое окно ввода". Даже если там было всего 4 строчки -- в верхних двух система создаст окно вывода, третья закрасится отделяющей псевдографической линией и четвёртая останется под ввод мессаги. В результате чат-клиент заработает на откровенно смехотворном железе, причём не вникая даже, какое железо ему реально досталось, и будет посылать на вывод текст с указанием шрифта и цвета, которые будут успешно игнорироваться системой. Совместимость, достигаемая принципом "Mandatory-Optional", намного глубже той, которую может дать любая виртуальная прослойка. В мобильных ОС, где что ни день, то новости, а зоопарк железа простирается от динозавра до павиана -- это очень важное обстоятельство. Что-то ещё сказать хотел, на языке вертелось, но мысль потерял. К следующему посту добавлю, если вспомню.