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

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

Контрольный список: нестандартные

управляющие структуры httpy/CC2e.com/1713

Возвраты

□ Используют ли методы операции возврата только при необходимости?

□ Улучшают ли операторы возврата читабельность?

Рекурсия

□ Содержит ли рекурсивный метод код для прекращения рекурсии?

□ Использует ли метод счетчик безопасности для гарантии того, что выполнение будет завершено?

□ Ограничена ли рекурсия одним методом?

□ Соответствует ли глубина рекурсии ограничениям, налагаемым размерами стека программы?

□ Является ли рекурсия лучшим способом реализации метода? Не лучше ли использовать простые итерации?

goto

□ Используются ли операторы goto только как последнее средство и лишь для того, чтобы сделать код удобнее для чтения и сопровождения?

□ Если goto используется ради эффективности, был ли прирост эффективности измерен и задокументирован?

□ Ограничено ли использование goto одной меткой на метод?

□ Выполняются ли переходы goto только вперед, а не назад?

□ Все ли метки goto используются?

Ключевые моменты

Множественные возвраты могут улучшить читабельность и сопровождаемость метода и помогают избежать глубокой вложенности. Тем не менее использовать их нужно осторожно.

Рекурсия предлагает изящное решение для небольшого набора задач. Ее тоже нужно использовать аккуратно.

Иногда операторы goto - лучший способ облегчить чтение и сопровождение кода. Таких случаев очень немного. Используйте goto только как последнее средство.

Clark, R. Lawrence, «А Linguistic Contribution of GOTO-less Programming». Datamation, December 1973. Эта классическая http: cc2e.cam/1706

статья с юмором предлагает заменить термин «go to» (перейти к) на «соте from» (перешел от). Она также бьша перепечатана в номере САСМ в апреле 1974 года.



ГЛАВА 18

Табличные методы

Содержание

18.1. Основные вопросы использования табличных методов

18.2. Таблицы с прямым доступом

18.3. Таблицы с индексированным доступом

18.4. Таблицы со ступенчатым доступом

18.5. Другие примеры табличного поиска

Связанные темы

Сокрытие информации: подраздел «Скрывайте секреты (к вопросу о сокрытии информации)» раздела 5.3

Проектирование классов: глава 6

Использование таблиц решений для замены сложной логики: раздел 19.1

Замена сложных выражений табличным поиском: раздел 26.1

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

Если вы уже знакомы с табличными методами, считайте эту главу обзором. В этом случае вы можете изучить «Пример гибкого формата сообщения» (раздел 18.2) в качестве иллюстрации того факта, что объектно-ориентированный дизайн не обязательно лучше других вариантов только потому, что он объектно-ориентированный. После этого можете переходить к обсуждению общих вопросов управления в главе 19.



18.1. Основные вопросы применения табличных методов

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

Пример использования сложной логики для классификации символов (Java)

if ( ( ( а <= inputChar ) && ( inputChar <= z ) ) ( ( A <= inputChar ) && ( inputChar <= Z ) ) ) { charType = CharacterType.Letter;

else if ( ( inputChar == ) ( inputChar == , )

( inputChar == . ) ( inputChar ! ) ( inputChar == ( ) II ( inputChar == ) ) ( inputChar == : ) ( inputChar == ; ) ( inputChar ? ) ( inputChar - ) ) { CharType = CharacterType.Punctuation;

else if ( ( 0 <= inputChar ) && ( inputChar <= 9 ) ) { charType = CharacterType.Digit;

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

Пример использования таблицы подстановки для классификации символов (Java)

CharType = charTypeTable[ inputChar ];

Этот фрагмент предполагает, что массив сЬагТуреТаЫе был заранее заполнен. Вы поместили знания, доступные программе, в данные, а не в логику: в таблицу, а не в условия

Два вопроса применения табличных методов

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

Другие данные затруднительно использовать для прямого поиска табличной записи. Так, для классификации информации по номеру социального страхования (SSN) вы не можете использовать этот номер в качестве ключа непосредственно, если, конечно, вы не собираетесь хранить в таблице 999-99-9999 записей. Вам понадобится более сложный подход. Вот какие способы, применяются для поиска записи в таблице:



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.01