Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kernigan_paik.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.91 Mб
Скачать

8.7. Переносимость и внесение усовершенствований

Одним из наиболее огорчительных источников проблем переносимо­сти является изменение системного программного обеспечения за время жизненного цикла. Изменения могут затронуть любой интерфейс систе­мы, приводя к неоправданной несовместимости версий.

При изменении спецификации изменяйте и имя. Наш любимый (если можно так выразиться) пример — изменение свойств команды Unix echo, которая в изначальном виде предназначалась для простого вывода аргументов:

% echo hello, world

hello, world

%

Однако со временем эта команда стала ключевой частью многих скрип­тов оболочки, и перед ней встала необходимость генерировать формати­рованный вывод. Теперь echo стала некоторым образом интерпретиро­вать аргументы, то есть стала неким аналогом printf:

% echo 'hello\nworId'

hello

world

%

Новые возможности, конечно, полезны, но из-за них у всех скриптов, ис­пользующих echo в изначальном варианте, возникли проблемы с совмес­тимостью. Поведение

% echo $PATH

стало зависеть от того, какая из версий echo используется. Если перемен­ная случайно содержит обратную косую черту (что вполне может про­изойти в DOS или Windows), то echo попытается интерпретировать ее. Это похоже на разницу в выводе через printf (str) и printf("%s", str) в случае, если переменная str содержит знак процента.

Мы привели только часть истории про echo, но уже то, что сказано, иллюстрирует основную проблему: изменения в системе приводят к по­явлению версий программ с преднамеренно различным поведением, что создает непреднамеренные проблемы с переносимостью. И исправить эти ошибки зачастую оказывается непросто. Проблем было бы гораздо меньше, если бы новая версия echo получила и новое имя.

Приведем еще один пример. В Unix существует команда sum, которая выводит размер файла и его контрольную сумму. Предназначена эта ко­манда для проверки правильности передачи данных:

% sum file

52313 2 file

%

% копируем file на другую машину

%

% telnet othermachine

$

$ sum file

52313 2 file

$

После передачи контрольная сумма не изменилась, так что с хорошей вероятностью можно считать, что передача прошла успешно.

Система разрасталась, появлялись новые версии, и в какой-то момент кто-то решил, что алгоритм вычисления контрольной суммы не идеален, и sum была изменена с использованием лучшего алгоритма. Кто-то еще пришел к тому же выводу и тоже изменил sum, реализовав другой, столь же хороший алгоритм, и т. д. В результате сейчас имеется несколько версий sum, каждая из которых выдает свой вариант ответа. Мы поставили эксперимент, скопировав некий файл на другие машины, чтобы выяснить, какие же результаты покажет sum в каждом конкретном случае:

% sum file

52313 2 file

%

% копируем file на машину 2

% копируем file на машину 3

% telnet machine2

$

$ sum file

eaaOd468 713 file

$ telnet machines

>

> sum file

62992 1 file

>

Непонятно, произошел сбой в передаче или просто мы столкнулись с разными версиями sum. Может быть и то, и другое.

Таким образом, sum являет собой яркий пример препятствия на пути к переносимости: программа, призванная помогать в копировании фай­лов с одной машины на другую, имеет несколько несовместимых версий, что делает ее абсолютно непригодной для использования.

Для выполнения изначально поставленной задачи первая версия sum вполне подходила: алгоритм, заложенный в ней, был не самым эффектив­ным, но приемлемым. Ее "улучшение", может, и сделало собственно ко­манду лучше, но зато использовать ее по назначению стало нельзя. И дело тут, надо сказать, не в том, что получилось несколько разных по существу команд, а в том, что все эти команды имеют одно и то же имя. Как видите, проблема несовместимости версий может оказаться весьма серьезной.

Поддерживайте совместимость с существующими программами и данными. Когда выпускается новая версия программы, например тек­стового редактора, то она, как правило, умеет читать файлы, созданные предыдущей версией. При этом мы ожидаем, что из-за добавления новых возможностей формат должен измениться. Но зачастую новые версии оказываются не в состоянии обеспечить способ записи в пре­дыдущем формате. Пользователи новых версий, даже если они не обра­щаются к добавленным возможностям, не могут применять свои файлы совместно с пользователями более старой версии, таким образом, обновлять программы приходится сразу всем. Независимо от того, чем опре­деляются такие решения — технической необходимостью или марке­тинговой политикой, — о таких случаях можно только сожалеть.

Совместимостью сверху вниз называется возможность программы со­ответствовать спецификациям своих более ранних версий. Если вы со­бираетесь изменить свою программу, убедитесь, что при этом вы не созда­дите противоречий со старыми версиями и связанными с ними данными. Тщательно документируйте изменения и продумайте способ восстано­вить первоначальные возможности. И главное, задумайтесь над тем, пе­ревесят ли достоинства предлагаемых вами усовершенствований потери от непереносимости, которые при этом возникнут.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]