Главная - Литература

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 [70] 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294

Этот псевдокод лучше предыдущего, так как полностью написан на естественном языке и не использует специфических конструкций целевого языка программирования. В первом примере псевдокод подлежал реализации только на С. Во втором же псевдокод не накладывает ограничений на используемый язык. Второй блок также написан на уровне описания намерений. О чем речь во втором блоке? Наверное, это легче понять, чем в первом блоке.

Хотя второй блок написан на понятном естественном языке, он достаточно точен и подробен, чтобы быть основой программы. Когда предложения этого псевдокода будут преобразованы в комментарии, они станут хорошим пояснением назначения кода.

Вот выгоды, которые вы получите, применяя такой стиль псевдокода.

Псевдокод упрощает пересмотр конструкции - вам не потребуется вникать в исходный код.

Псевдокод поддерживает идею итеративного усовершенствования. Вы начинаете с высокоуровневой конструкции, уточняете ее до псевдокода, который в свою очередь преобразуете в исходный код. Такое последовательное усовершенствование, осуществляемое шаг за шагом, позволяет проверять свои проектные решения по мере перехода на более низкие уровни. В результате вы обнаруживаете высокоуровневые ошибки на самом верхнем уровне, среднеуровне-вые - на среднем, а низкоуровневые - на самом нижнем, прежде чем они создадут проблемы.

Псевдокод упрощает внесение изменений. Что проще: щщщщ исправить линию на чертеже или снести стену и сдви- щш2внтт путь ее на метр в сторону? В программировании эффект «а наименее значимых стадиях не столь драматичен в плане физических усилий, но идея см. шигу Эеди Гроува «High Oat-та же: несколько строк псевдокода легче исправить, чем Pt Шпартеп!» (Grove, 1983). страницу кода. Одна из основ успеха проекта - отловить

ошибку на «наименее значимой стадии», когда для ее исправления требуется минимум усилий. Поиск ошибки на стадии псевдокода требует гораздо меньше затрат, чем после полного кодирования, тестирования и отладки, так что есть экономический стимул обнаружить ошибку как можно раньше.

Псевдокод упрощает комментирование программ. В типичной ситуации вы сначала пишете код, а затем добавляете комментарии. В ППП предложения псевдокода становятся комментариями, так что на самом деле их проще оставить, чем удалить.

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

Псевдокод как инструмент проектирования трудно переоценить. Исследования показали, что программисты предпочитают псевдокод за его возможности упрощать создание программных конструкций, помощь в определении некорректных проектных решений, простоту документирования и внесения изменений (Ramsey, Atwood, and Van Doren, 1983). Псевдокод - не един-



ственный инструмент детального проектирования, но наряду с ППП - полезная вещь в инструментарии программиста. Попробуйте его в деле. В следующем разделе я расскажу как.

9.3. Конструирование методов с использованием ППП

В этом разделе описаны этапы конструирования методов, а именно:

проектирование метода;

кодирование метода;

проверка кода;

наведение глянца;

повторение предыдущих шагов при необходимости.

Проектирование метода

Определив состав методов класса, приступайте к их проек-Перекреотная ссылка О других

аспектах проектирования см. жированию. Допустим, вы хотите написать метод вывода главы с 5 по 8. сообщения об ошибке, основанного на коде ошибки, и на-

звали этот метод ReportErrorMessageQ. Вот неформальная спецификация ReportErrorMessageQ:

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

Этот метод используется в качестве примера во всей главе, а в оставшейся части этого раздела описывается его проектирование.

Проверка предварительных условий Прежде чем что-Перекрестиая ссылка О провер- .

ке предварительных условий см. Дь с самой процедурой, убедитесь, что функции главы 3 и 4. метода четко определены и соответствуют общим проект-

ным решениям.

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

информацию, скрываемую методом;

входные данные;

выходные данные;

предусловия, которые гарантированно должны соблюдать-йерекрестная сшяка О пред-и г- г г-

постусловиях т. раздел 6.2. (входные значения находятся в задан-

ном диапазоне, потоки инициализированы, файлы открыты или закрыты, буферы заполнены или очищены и т. д.);



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

Вот как это выглядит для метода ReportErrorMessageQ-.

метод скрывает текст сообщения и текущий метод обработки (интерактивный или командной строки);

выполнение каких-либо предусловий не требуется;

входными данными является код ошибки;

выходные данные двух видов: сообщение об ошибке и статус, возвращаемый ReportErrorMessageQ вызывающей программе;

возвращаемый статус должен принимать одно из двух значений: Success или Failure.

Название метода Вопрос именования метода кажется

Перекрестная шт» 06 тш-

тривиальным, но хорошее название - признак высокого 7 3

стиля программирования и дело это непростое. Вообще метод должен иметь понятное, недвусмысленное имя. Затруднения в выборе имени метода могут свидетельствовать о том, что его назначение не совсем понятно. Неясное, невыразительное имя метода сродни предвыборным обещаниям политиков. Вроде бы о чем-то оно говорит, но если задуматься - непонятно о чем. Если можно дать методу более ясное имя, сделайте это. Если невыразительное имя - результат неясных проектных решений, вернитесь к ним и измените их.

В нашем примере ReportErrorMessageQ - вполне недвусмысленное имя. Хорошее имя.

Решите, как тестировать метод В процессе написа-

Дополиитедмые штш О

ния метода думайте о том, как вы будете его тестировать. Это , тру-

принесет пользу вам при блочном тестировании и тести- йро&аиию, ориентированных на ровщикам, проводящим независимое тестирование. предварительное написание те-

В нашем примере входные данные просты, так что можно кийгу <<Test-Driven Ре-

velopment: By Exanipfe» (Beck,

планировать тестирование ReportErrorMessageQ со всеми 2003)

допустимыми кодами ошибок и различными неверными

кодами.

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

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



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 [70] 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294



0.0022