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

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

Однако лучшее решение - создать массив ставок не только для каждого возраста, но вообще для всех факторов. Вот как объявить такой массив на Visual Basic:

Пример объявления данных для заполнения таблицы ставок страхования (Visual Basic)

Public Enum SmokingStatus

SmokingStatus First = 0

SmokingStatus Smoking = 0

SmokingStatus NonSmoking = 1

SmokingStatus Last = 1 End Enum

Public Enum Gender

Gender First = 0

Gender Male = 0

Gender Female = 1

Gender Last = 1 End Enum

Public Enum MaritalStatus

MaritalStatus.First = 0

MaritalStatus Single = 0

MaritalStatus Married = 1

MaritalStatus Last = 1 End Enum

Const MAX AGE As Integer = 125

Dim rateTable ( SmokingStatus Last, Gender Last, MaritalStatus Last, MAX AGE ) As Double

Определив массив, необходимо придумать способ его за- Перекрестная оешка Одно из

полнения. Вы можете использовать операторы присваива- птттшъ табличного подхо-

ния, читать данные из дискового файла, вычислять данные да а том, что тжт тттть

или делать что-то еще. После подготовки данные могут при- данные из таблицы в файл и

меняться при расчете ставок. Сложная логическая струк- выполне-

ния. Это позволит вам изменять

тура, показанная ранее, заменяется простым выражением, тршвгры ш стааки например: страхования, не изменяя саму

программу (см, раадеп 10.6).

Пример элегантного способа определения ставки страхования (Visual Basic)

rate = rateTable( smokingStatus, gender, maritalStatus, age )

Основное преимущество этого подхода - в замене сложной логики табличным поиском. Такой код удобней читать и проще изменять.



Пример гибкого формата сообщения

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

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

Допустим, вы разрабатываете метод для печати сообщений, хранящихся в файле. Обычно файл содержит около 500 сообщений, которые бывают примерно 20 видов. Изначально сообщения поступают от бакенов и включают в себя информацию о температуре воды, расположении бакена и т. д.

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


Текст сообщения

Рис. 18-2. Сообщения хранятся в произвольном порядке, каждое определяется идентификатором

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




Средняя температура (число с плавающей запятой)

Диапазон температур (число с плавающей запятой)

Количество проб (целое число)

Расположение (символьная строка)

Время измерения (время суток)

Сообщение о течении

Изменение широты (число с плавающей запятой)

Изменение долготы (число с плавающей запятой)

Время измерения (время суток)

Широта (число

с плавающей запятой)

Долгота (число

с плавающей запятой)

Глубина (целое число)

Время измерения (время суток)

Рис. 18-3- За исключением идентификатора каждое сообщение имеет свой формат

Логический ПОДХОД

Используя логический подход, вы, вероятно, прочитали бы каждое сообщение, проверили его идентификатор, а затем вызвали метод, разработанный для чтения, преобразования и печати каждого сообщения. Имей вы 20 типов сообщений, вы создали бы 20 методов. Для поддержки пришлось бы написать неизвестное количество методов более низкого уровня. Так, вы могли бы создать метод PrintBuoy-TemperatureMessageQ для печати сообщения о температуре. Объектно-ориентированный подход не дал бы никаких преимуществ: скорее всего вы задействовали бы абстрактный объект, представляющий сообщение, и породили от него подклассы для каждого типа сообщения.

При каждом изменении формата какого-нибудь сообщения вам пришлось бы менять логику в соответствующем классе или методе. Если в приведенном выше содержимом сообщения поле со средней температурой поменяло бы тип с плавающей запятой на иной, вам пришлось бы изменить логику метода PrintBuoyTempe-ratureMessageQ- (А если бы изменился тип самого бакена, вам бы пришлось разрабатывать класс для нового!)

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

Пока есть сообщения для чтения Прочитать заголовок сообщения Декодировать идентификатор сообщения из заголовка Если заголовок сообщения соответствует типу 1,

то напечатать сообщение 1-го типа. Иначе, если заголовок сообщения соответствует типу 2,

то напечатать сообщение 2-го типа.

Иерекреоткая ссылка Этот осев-докод «лзкого уровня исполь-зубтсй 0 ты% цтш, ттт пеевдокод, предназначенный дяя проектирований штода. 0 разработке с помощью псевдокода т. главу 9.



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