Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Непейвода Н.Н. -> "Основания программирования " -> 151

Основания программирования - Непейвода Н.Н.

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 145 146 147 148 149 150 < 151 > 152 153 154 155 156 157 .. 316 >> Следующая

8.5. ПАРАМЕТРИЗАЦИЯ
427
несколько снизит эффективность программ , но стоит ли ертвовать наде -ностью ради сокращения программы на одну-две команды?
Другая связь процедуры MyOwnlnpMatr с глобальным контекстом — употребление (глобальной) переменной Matr. Как и с переменной N, явное упоминание среди параметров имени массива, получение значения которого есть основная цель процедуры, могло б увеличить наденость программ . д-нако если обсуждаемая процедура предназначена для ввода только одной матрицы, то имя ее массива становится элементом системы понятий, с кото-рми оперирует используая программа. Тогда предполо ение о том, что можно "забыть" имя обрабатываемой матрицы в подпрограмме ввода ее значений становится умозрительнм. Вывод: вкл чение имени массива, представляющего матрицу в программе, в список параметров процедуры нецелесообразно. Вместе с тем, если процедура используется для ввода нескольких матриц, то употребление имени представляющего массива как out-параметра разумно для реализации данной возможности. Для языка С/С++ вопрос о том, каким механизмом параметризации воспользоваться, не стоит: массив здесь это просто область памяти, адрес которой есть значение переменной, описанной как массив (т. е. такой, описание которой содержит квадратные скобки). ными словами, язк предписвает считать имена массивов указателями на них, а потому передача такого имени функции в качестве аргумента по значени дает доступ к указываемой памяти: получается так, что массив (как область памяти) передается по ссылке (с соответствующим моделированием эффекта выходного параметра). Перенося эти рассуждения на паскалеподобный язык, становится понятной причина, по которой Matr надо передавать как переменну (т. е. по ссылке).
У процедуры MyOwnlnpMatr есть еще одна, неявная связь с глобальным контекстом. Это условие корректной ее работы: размерность матрицы не должна превосходить значения константы NN. С точки зрения надежности программирования неявные связи подпрограмм с контекстом их погру ения нежелательны. В примере процедура MyOwnlnpMatr не совсем надежна, т. к. ее мо но вызвать с наруением условия корректности, а оибка, к которой приведет такой вызов, не будет своевременно диагностирована.
В языке Pascal есть средство для смягчения последствий такой ненадежности: возмо ность контроля значения переменной N за счет придания ей типа 0..NN (в глобальном контексте). Тем самм при наличии связи процедур с глобальным контекстом через эту переменну будет контролироваться именно та величина, которая взывает оибку размерности. случае процедуры с параметром-размерностью этот параметр должен получить тип 0..NN
428
8.
(разумеется, путем вкл чения в глобальнй контекст описания типа, например,
type Index = 0..NN;
и спецификации параметра как Index).
Такое реение практически исчерпывает проблему, но далеко не всегда условия корректности работ подпрограммы вразим с помоь указания требуемых статических типов переменных и параметров. К сожалению, задание типовой информации — единственное средство языка Pascal, которое мо но использовать для спецификации значений объектов. В некоторых языках возмо ности такого рода расиря тся. ногда, к примеру, допускается определение предиката над параметрами, формулируего условия корректной работы подпрограммы. Но ни один формальный способ спецификации условий на параметры даже теоретически полон быть не может, а неформальный чреват и оибками неправильного истолкования, и многими другими опасностями.
Ситуация с С/С++ сложнее, т. к. для него не предусмотрены средства определения того, какие значения допустимы для описываемой переменной. Более того, в этом языке не считается ошибкой выход индекса за пределы массива. Как следствие, такая некорректность приведет лиь к иска ениям памяти, располо енной после размеения массива. ричина тому — ориентация на примитивно понимаемое максимально полное прибли ение языковых средств к уровню машинного представления. Таким образом, здесь обязательно нужен дополнительный контроль со стороны программиста. Чтобы такой контроль был 'съемным' (включаемым и выключаемым при необходимости), мо но реализовать его с помоь средств препроцессора. о, к со алени , его возмо ности по теоретически и практически непреодолимым причинам принципиально ограничены.
Для полноты обсуждения процедуры MyOwnInpMatr уместно упомянуть
0 ее локальном контексте, т. е. о переменнх i и j, которые с формальной точки зрения допустимо внести в глобальнй контекст. Со всей определенность мо но сказать, что такое реение ничем не оправдано: переменные
1 и j име т содерательный смысл только внутри тела процедур , а потому использование их как глобальных объектов только повысило бы зависимость процедуры MyOwnInpMatr от глобального контекста. В результате программа оказалась б менее наденой. (С этой е точки зрения неразумно задание i и j в качестве формальнх параметров процедур — оно потребовало бы указания соответствуих фактических параметров из глобального контекста,
8.5. ПАРАМЕТРИЗАЦИЯ
429
для которых и вовсе не удается дать содерательну трактовку).
Предыдущая << 1 .. 145 146 147 148 149 150 < 151 > 152 153 154 155 156 157 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100