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

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

ilipexiieeiitaii штл О ртт- именования функции используйте описание воз-

шштщтщттифШ вращаемого значения Функция возвращает значение, и щшт т. щт 7.6. это следует должным образом отразить в ее имени. Так,

имена cosO, customerld.NextO.pnnter.IsReadyO иpen.Current-ColorQ ясно указывают, что возвращают функции, и потому являются удачными.

Для именования процедуры используйте выразительный глагол, дополняя его объектом Процедура с функциональной связностью обычно выполняет операцию над объектом. Имя должно отражать выполняемое процедурой действие и объект, над которым оно выполняется, что приводит нас к формату «глагол + объект». Примеры удачных имен процедур - PrintDocumentOyCalcMonthfyRevenuesO, CheckOrderlnfoQ и RepaginateDocument(),

В случае объектно-ориентированных языков имя объекта в имя процедуры включать не нужно, потому что объекты и так входят в состав вызовов, принимающих вид document.PrintO, orderlnfo.CbeckO и monthlyRevenues.CalcO- Имена вида document.PrintDocumentO страдают от избыточности и могут стать в производных классах неверными. Если Check - класс, производный от класса Document, суть вызова check.PtintO кажется очевидной: печать чека. В то же время вызов check.Print-DocumentO похож на печать записи чековой книжки или ежемесячной выписки со счета, но никак не чека.

Дисциплинированно используйте антонимы Приме-Явшметш шш Похожий

rJZViuruuut. iMnntttu нение конвенции именования, подразумевающих использо-mm в ймвнах переменных, ом. вание антонимов, поддерживает согласованность имен, что в йодраздеяе «Антонимы, час- облегчает чтение кода. Антонимы вроде first/last понятны то встречающиеся в именах всем. Пары вроде FileOpenQ и lclose() несимметричны и переменных* раздела 11,t вызывают замешательство. Вот некоторые антонимы, популярные в программировании:

add/remove increment/decrement open/close

begin/end insert/delete show/hide

create/destroy lock/unlock source/target

first/last min/max start/stop

get/put next/previous up/down

get/set old/new

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

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

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

employee.id.Get() dependent. GetldO supervisor() candidate.id()

Класс Employee предоставлял доступ к объекту id, который в свою очередь включал метод GetO- Класс Dependent предоставлял для этой цели метод GetldO- Разра-



ботчик класса Supervisor сделал id значением, возвращаемым по умолчанию. Класс Candidate предоставлял доступ к объекту id, который по умолчанию возвращал значение идентификатора. К середине проекта никто из нас уже не мог вспомнить, какой из методов предполагалось использовать для того или иного объекта, но мы уже написали слишком много кода, чтобы возвращаться назад и все согласовывать. Поэтому каждому члену группы пришлось тратить лишние усилия на запоминание несогласованных подробностей синтаксиса получения id из каждого класса. Конвенция именования, определяющая получение id, сделала бы такую неприятность невозможной.

7.4. Насколько объемным может быть метод?

На пути в Америку пилигримы спорили о лучшей максимальной длине метода. И вот они прибыли к Плимутскому камню и начали составлять Мейфлауэрское соглашение. О максимальной длине методов пилигримы так и не договорились, а так как до подписания соглашения они не могли высадиться на берег, то сдались и не включили этот пункт в соглашение. Результатом стали нескончаемые дебаты о допустимой длине методов.

В теоретических работах длину метода часто советуют ограничивать числом строк, помещающихся на экране монитора, или же одной-двумя страницами, что соответствует примерно 50-150 строкам. Следуя этому правилу, в IBM однажды ограничили методы 50 строками, а в TRW - двумя страницами (МсСаЬе, 1976). Современные программы обычно включают массу очень коротких методов, вызываемых из нескольких более крупных методов. Однако длинные методы далеки от вымирания. Незадолго до завершения работы над этой книгой я в течение месяца посетил двух клиентов. В одном случае программисты боролись с методом, включавшим примерно 4000 строк, а во втором пытались укротить метод, содержавший более 12 ООО строк!

Длина методов уже давно стала предметом исследований. Некоторые из них устарели, а другие актуальны и по сей день.

Базили и Перриконе обнаружили обратную корреляцию между размером метода и уровнем ошибок: при росте размера методов (вплоть до 200 строк) число ошибок в расчете на одну строку снижалось (Basili and Perricone, 1984).

Другое исследование показало, что с числом ошибок коррелировали структурная сложность и объем используемых данных, но не размер метода (Shen et al., 1985). В исследовании 1986 г было обнаружено, что небольшой размер методов (32 строки или менее) не коррелировал с меньшими затратами на их разработку или меньшим числом дефектов (Card, Church, and Agresti, 1986; Card and Glass,

Пилигримы (pilgrims) - пассажиры английского судна «Мейфлауэр» («Mayflower»), основатели Плимутской колонии в Северной Америке, заключившие Мейфлауэрское соглашение (Mayflower Compact) о создании «гражданской политической организации» для поддержания порядка и безопасности, «принятия справедливых и обеспечивающих равноправие законов». Плимутский камень (Plymouth Rock) - по преданию гранитная глыба, на которую ступил первый сошедший с корабля пилигрим в декабре 1б20 г Почитается в США как национальная святыня. - Прим. перев.



1990). Разработка крупных методов (65 строк или более) в расчете на одну строку кода была дешевле.

Опытное изучение 450 методов показало, что небольшие методы (включавшие менее 143 команд исходного кода с учетом комментариев) содержали на 23% больше ошибок в расчете на строку кода, чем более крупные методы, но исправление меньших методов было в 2,4 раза менее дорогим (Selby and Basili, 1991).

Исследования позволили обнаружить, что код требовал минимальных изменений, если методы состояли в среднем из 100-150 строк (Lind and Vairavan, 1989).

Исследование, проведенное в IBM, показало, что максимальный уровень ошибок был характерен для методов, размер которых превышал 500 строк кода. При дальнейшем увеличении методов уровень ошибок возрастал пропорционально числу строк (Jones, 198ба).

Так какую же длину методов считать приемлемой в объектно-ориентированных программах? Многие методы в объектно-ориентированных программах будут методами доступа, обычно очень короткими. Время от времени реализация сложного алгоритма будет требовать создания более длинного метода, и тогда методу можно будет позволить вырасти до 100-200 строк (строкой считается непустая строка исходного кода, не являющаяся комментарием). Десятилетия исследований говорят о том, что методы такой длины не более подвержены ошибкам, чем методы меньших размеров. Пусть длину метода определяют не искусственные ограничения, а такие факторы, как связность метода, глубина вложенности, число переменных, число точек принятия решений, число комментариев, необходимых для объяснения метода, и другие соображения, связанные со сложностью кода.

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

7.5. Советы по использованию параметров методов

Интерфейсы между методами - один из основных источников ошибок. J[] В одном часто цитируемом исследовании, проведенном Базили и Пер-

риконе (Basili and Perricone, 1984), было обнаружено, что 59% всех ошибок были ошибками внутренних интерфейсов - ошибками коммуникации между методами. Вот несколько советов по предотвращению подобных проблем.

- Передавайте параметры в порядке входные значения

Перекрестная есынка о доку-

ментировании параметров мето- ~ изменяемые значения - выходные значения Вме-дов см. подраздел «Комменти- сто упорядочения параметров случайным образом или по рование методов» раздела 32.5, алфавиту указывайте в списке сначала исключительно вход-а о форматирований парамет- параметры, затем входные-и-выходные параметры и паров - раздел S1.7. конец - исключительно выходные параметры. Такой по-



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