Анимация
JavaScript
|
Главная Библионтека Изучение конкретных примеров Копаться в чужом коде, наверное, некрасиво. И о зато очень интересно. •Этот завершающий раздел посвящен новой теме. Мы рассмотрим фрагменты реального опубликованного кода, обсудим сго дизайн и стиль кодирования, его слабые и сильные стороны, и подумаем над тем, как разработать более совершенную версию. Можно только удивляться, как много можно сделать с кодом, который был написан, проверен и откорректирован экспертами. Наслаждаясь чужими исходными текстами, не забывайте: то, что мы будем делать с чужим текстом, вполне применимо и к вашим программам. Задача 34. Индексные таблицы Сложность: 5 Индексные таблицы представляют собой полезную идиому, так что стоит поближе познакомиться с этой технологией. Ио насколько эффективно мы сумеем ее реализовать? Вопрос для новичка 1. Кто выигрывает от ясного, понятного исходного текста? Вопрос для профессионала 2. Приведенный далее исходный текст представляет интересную и, несомненно, полезную идиому создания индексных таблиц над существующими контейнерами. Более детальную информацию вы можете почерпнуть из статьи [HicksOO]. Оцените приведенный далее исходный текст и найдите: а) механические ошибки, такие как неверный синтаксис или непереносимые соглашения; б) стилистические улучшения, которые могут повысить ясность, степень повторного использования и сопровождаемости исходного текста. Программа sort iclxtbl (...) выполняет перестановку индексов в таблице #1nclude <vector> #include <algorith> template <class RAlteo struct sort idxtbl„pair RAlter it; int i; bool operator<( const sort..idxtbl pai r& s ) { return (*it) < (*(s.it)); } void set( const RAIter& it, int i ) { it= it; i= i; } sort .idxtbl pai r() {} template <class RAlter> void sort idxtbl( RAlter first, RAlter 1ast, int* pidxtbl ) int iDst = last-fi rst; typedef std::vector< sort idxtbl pair<RAlter> > v; V v( iDst ); int i=0; RAlter it = first; v: : i terator vi t = v.begin(); for( i=0; it<last; it++, vit++, i++ ) (*vit).set(it,i); std: :sort(v.beginO , v.endO); int *pi = pidxtbl; vit = V.beginO ; for( ; vit<v.end(); pi++, vit++ ) *pi = (*vit).i; main о { int ai[10] = { 15,12,13,14,18,11,10,17,16,19 }; cout « "#################" « endl; std: :vector<i nt> vecai(ai, ai +10); int aidxtbl[10]; sort idxtbl(vecai.beginO, vecai.endC), aidxtbl); for (int i=0; i <10; i++) cout « "i=" « i « ", aidxtbl[i]=" « aidxtbl[i] « ", ai[aidxtbl[i]]=" « ai[aidxtbl[i]] « endl; cout « "#################" « endl; Решение Небольшая проповедь о ясности 1. Кто выигрывает от ясного, понятного исходного текста? Если говорить коротко - практически все. Для начала, с ясным исходным текстом проще выполнять отладку, и по этой причине менее вероятно появление в нем большого количества ошибок. Таким образом, написание ясного исходного текста в первую очередь сразу же облегчает вашу жизнь. Далее, когда вы возвращаетесь к коду через месяц или год, то становится гораздо проще вспомнить, что в нем к чему, и понять, как он работает. Большинство программистов знают, что удержать в голове вес детали той или иной програ.ммы трудно даже несколько недель, в особенности если за это время переключиться на другую работу; после нескольких месяцев или даже лет легко решить, что этот код написан кем-то посторонним, который удивительным образом следовал вашему стилю. Но хватит заботиться о себе. Будем альтруистами. Те, кому придется сопровождать ваш код, тоже выифывают, если он будет ясным и удобочитаемым. В конце концов, для сопровождения кода надо очень хорошо в нем разобраться, понять, как он работает и как связаны между собой и с внешним окружением его части, какие побочные эффекты при сго выполнении могут возникнуть. Не понимая полностью исходный текст, в него очень легко внести новые ошибки вместо исправления старых. В ясном и понятном коде легче разобраться, и внесение в него изменений становится менее рискованны.м делом, с меньшей вероятностью внесения ошибок или нежелательных побочных эффектов. Однако самое важное - выигрыш по всем перечисленным причинам конечных пользователей, которые будут пользоваться программами с малым количеством ошибок и высоким уровнем сопровождения, при котором не привносятся новые ошибки взамен старых. > Рекомендация По умолчанию в первую очередь должна быть обеспечена корректность и ясность исходного текста программ. Разбор индексных таблиц 2. Приведенный далее исходный текст представляет интересную и, несомненно, полезную идиому создания индексных таблиц над существующими контейнерами. Более детальную информацию вы можете почерпнуть из статьи [HicksOO]. 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 |