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

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

Иначе, если заголовок сообщения соответствует типу 19,

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

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

Текст этого псевдокода приводится не полностью - понять его смысл можно и без просмотра всех 20 вариантов.

Объектно-ориентированный подход

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

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

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

то создать объект сообщения 2-го типа.

Иначе, если заголовок сообщения соответствует типу 19,

то создать объект сообщения 19-го типа. Иначе, если заголовок сообщения соответствует типу 20,

то создать объект сообщения 20-го типа. Конец Если Конец цикла Пока

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

Напечатать «Сообщение о температуре бакена».

Прочитать значение с плавающей запятой. Напечатать «Средняя температура». Напечатать значение с плавающей запятой.

Прочитать значение с плавающей запятой. Напечатать «Диапазон температур». Напечатать значение с плавающей запятой.

Прочитать целое значение. Напечатать «Количество проб». Напечатать целое значение.

Прочитать символьную строку. Напечатать «Местонахождение». Напечатать символьную строку.



Прочитать время суток. Напечатать «Время измерения». Напечатать время суток.

Это код только для одного типа сообщений. Для каждого из оставшихся 19 типов нужно реализовать похожий код. И если будет добавлен 21 -й тип сообщения, потребуется добавить 21-й метод или подкласс - в любом случае новый тип сообщения потребует изменения существующего кода.

Табличный подход

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

Применение этого подхода начинается с перечисления типов сообщений и типов полей. В С++ вы можете определить типы всех возможных полей таким образом:

Пример определения типов данных сообщения (С++)

enum FieldType {

FielclType FloatingPoint,

FielclType Integer,

FieldType String,

FieldType TimeOfDay,

FieldType Boolean,

FieldType BitField,

FieldType Last = FieldType BitField

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

Пример определения элемента таблицы, описывающего сообщение

Message Begin NumFields 5

MessageName "Buoy Temperature Message" Field 1, Floatingpoint, "Average Temperature" Field 2, Floatingpoint, "Temperature Range" Field 3, Integer, "Number of Samples" Field 4, String, "Location" Field 5, TimeOfDay, "Time of Measurement" Message End



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

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

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

Пока есть сообщения для чтения, прочитать заголовок сообщения, декодировать идентификатор сообщения из заголовка, найти описание сообщения в таблице описаний сообщений,

прочитать поля сообщения и напечатать их, основываясь на описании сообщения. Конец цикла Пока

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

Пока не все поля напечатаны,

получить тип поля из описания сообщения. Выбор ( типа поля )

вариант: ( число с плавающей запятой ) прочитать значение с плавающей запятой, напечатать метку поля, напечатать значение с плавающей запятой.

вариант: ( целое число ) прочитать целое значение, напечатать метку поля, напечатать целое значение.

вариант: ( символьная строка ) прочитать символьную строку, напечатать метку поля, напечатать символьную строку.

вариант: ( время суток ) прочитать время суток, напечатать метку поля, напечатать время суток.

вариант: ( логическое значение ) прочитать значение флажка.



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