div.main {margin-left: 20pt; margin-right: 20pt}Ява - идеал, она не нуждается
в улучшениях
Ява была создана в 1994-1995 году. К этому моменту информационные
технологии получили интенсивное развитие как за счет "персонализации"
компьютеров, так и отчасти за счет распространения Интернет. Авторы Явы
постарались воплотить в ней все достижения информационной индустрии, но идеал,
как известно, недостижим. Кое-что, все-таки осталось "за бортом". Среди подобных
возможностей можно назвать условия проверки правильности выполнения программы,
"программирование по контракту", шаблоны и др. В основном, в качестве примера
для сравнения мы будем использовать C++, как наиболее "продвинутый" язык
программирования.
В C++ существует средство проверки условий, называемое assert. Эта
функция очень проста - она проверяет некоторое условие, задаваемое
программистом, на "истину". Если условие "ложно", assert останавливает программу
и указывает, что допустимые условия работы нарушены. Assert позволяет отлаживать
программу, одновременно проверяя правильность параметров и результатов работы
функций. При этом, в целевом (конечном) образе программы все вызовы assert будут
отсутствовать. Компилятор отбрасывает все вызовы assert при конечной генерации
модулей. В Яве не существует подобной возможности. Разумеется можно использовать
проверку условий и генерацию исключений на их основе, но, в результате, все эти
проверки попадут в образ конечной программы. Поскольку условная компиляция в Яве
также отсутствует, "спрятать" проверки условий нельзя. Остается одно - в
конечной программе "вычистить" их руками из исходного текста. Опять-таки, при
последующей модификации программы придется все повторить - проверку условий
опять необходимо включать.
Существует более мощная технология, чем assert. Это Design By
Contract, "программирование по контракту". Данная концепция вводит типы проверки
условий для каждой контролируемой контрактом функции - предусловие (правильность
переданных функции параметров), условие-инвариант (истинное в течение всего
времени работы функции), пост-условие (правильность результата). Эти условия
позволяют быстро находить источник ошибок в программе. К примеру, если неверно
пред-условие, значит "виноват" вызывающий, который передал неправильные
параметры. "Программирование по контракту" позволяет упростить создание больших
приложений, которые используют ранее созданный код. Считается, что без подобной
технологии повторное использование кода недопустимо в принципе. Ява не
поддерживает "программирование по контракту".
Шаблоны классов в C++ - это возможность генерации кода "под"
указанный пользователем класс. Коллекция объектов, реализованная с помощью
шаблона, будет компилироваться каждый раз для каждого типа объектов, хранимого в
этой коллекции. Разумеется это увеличивает размер программы, но надежность и
удобство использования классов-шаблонов все же перевешивают. Типичная коллекция
объектов в Яве хранит экземпляры класса Object, предка всех Ява-классов.
Программист, извлекая объекты из коллекции, вынужден использовать приведение
типа, чтобы работать со своим "рабочим" классом. Такое приложение работает
прекрасно до тех пор, пока другой программист случайно не добавляет в коллекцию
экземпляр совершенно другого класса. При добавлении ошибки не происходит -
коллекция "не знает", какие именно классы она хранит. Ошибка произойдет позднее
при извлечении экземпляра и попытки приведения его к неверному типу. Такая
ситуация невозможна при использовании шаблонов, в принципе, поскольку здесь
работа идет с конкретным классом.
Существуют и другие возможные пути развития Ява. К примеру,
необычайно полезным является понятие "константные" данные и "константные"
функции в C++. В C++ можно указать, что функция не изменяет данные класса. Можно
указать, что нельзя изменить данные, на которые указывает переменная. Можно,
наконец, указать, что менять адресуемые данные можно, а сам указатель - нет.
"Правильно" нагруженная константными описателями программа лучше оптимизируется,
понимается и модифицируется. В Яве подобные возможности есть, но в упрощенном
виде. Можно объявлять константные переменные и только.
Владислав Кравченко,
href="mailto:grigorenko@mail.ru">Григорий Григоренко
|