Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Совершенный код. Мастер-класс - Макконнелл С.

Макконнелл С. Совершенный код. Мастер-класс — М.: Русская редакция, 2005. — 896 c.
ISBN: 5-469-00822-3
Скачать (прямая ссылка): soversheniykodmasterklass2005.djvu
Предыдущая << 1 .. 162 163 164 165 166 167 < 168 > 169 170 171 172 173 174 .. 426 >> Следующая

parameter, не будет передано в вызывающий метод, потому что
операция присваивания не содержит звездочки:
Пример передачи параметра, который не будет работать (С)
void TryToPassBackAValue( int *parameter ) { parameter =
SOME_VALUE;
}
А здесь значение, присвоенное параметру parameter, будет
возвращено, потому что перед parameter указана звездочка:
Пример передачи параметра, который сработает (С)
void TryToPassBackAValue( int *parameter ) {
*parameter = SOME_VALUE;
}
Используйте sizeofO для определения объема памяти, необходимой
для размещения переменной Легче использовать sizeofO, чем
выяснять размер типа в справочнике. Кроме того, sizeofO
работает с вашими собственными структурами, которые в
справочнике не описаны. Так как значение вычисляется в момент
компиляции, то sizeofO не влияет на производительность. Кроме
того, он переносим: перекомпиляция в другой среде
автоматически изменяет размеры, вычисленные sizeofO• И еще он
прост в сопровождении, поскольку при изменении используемого
типа изменится и рассчитываемый размер.
13.3. Глобальные данные
Перекрестная семика 0 различиях между глобальными данными и
данными класса, см, подраздел "Ошибочное представление о
данных класса как о глобальных данных" раздела 5*3.
Глобальные переменные доступны из любого места программы.
Иногда этот термин небрежно используют для обозначения
переменных с более широкой областью видимости, чем локальные
переменные, таких как классовые переменные, доступные во всех
методах класса. Но сама по себе доступность внутри
единственного класса не означает, что переменная является
глобальной.
Наиболее опытные программисты пришли к выводу, что применять
глобальные переменные рискованней, чем локальные. Эти
программисты также считают, что полезней осуществлять доступ к
данным с помощью методов.
Даже если применение глобальных переменных не всегда ведет к
ошибкам, оно все-таки вряд ли представляет собой хороший
способ программирования.
ГЛАВА 13 Нестандартные типы данных
327
Распространенные проблемы с глобальными данными
Если вы без разбора используете глобальные переменные или
считаете невозможность их применения ненужным ограничением,
то, вероятно, вы еще не прониклись значимостью принципов
модульности и сокрытия информации. Модульность, сокрытие
информации и связанное с ними использование хорошо спроектиро-
ванных классов, может, и не панацея, но они помогают сделать
большие программы понятнее и легче в сопровождении. Когда вы
это поймете, вам захочется писать методы и классы как можно
меньше взаимодействующие с глобальными переменными и внешним
миром.
Можно привести массу проблем, связанных с глобальными данными,
но в основном они сводятся к следующим вариантам.
Непреднамеренные изменения глобальных данных Вы можете
изменить значение глобальной переменной в одном месте и
ошибочно думать, что оно осталось прежним где-то в другом.
Такая проблема известна как "побочный эффект". Например, в
этом фрагменте theAnswer является глобальной переменной:
Пример побочного эффекта (Visual Basic)
I- theAnswer - глобальная переменная.
l->theAnswer = GetTheAnswer() i- GetOtherAnswer() изменяет
theAnswer.
L-> otherAnswer = GetOtherAnswer()
Значение averageAnswer неправильно.
averageAnswer = (theAnswer + otherAnswer) / 2
Вы предполагаете, что вызов GetOtherAnswerQ не изменяет
значение theAnswer, потому что иначе среднее значение в
третьей строке будет вычислено неверно. На самом деле
GetOtherAnswerQ все-таки изменяет theAnswer, и в программе
возникает ошибка.
Причудливые и захватывающие проблемы при использовании
псевдонимов для глобальных данных Использование псевдонима
означает обращение к переменной по двум и более именам. Это
происходит, когда глобальная переменная передается в метод, а
там используется и в качестве глобальной переменной, и в
качестве параметра. Вот пример метода, работающего с
глобальной переменной:
Ш Пример метода, подверженного
проблеме с псевдонимами (Visual Basic)
Sub WriteGlobal( ByRef inputVar As Integer ) inputVar = 0
globalVar = inputVar + 5
MsgBox( "Input Variable: " & Str( inputVar ) )
MsgBox( "Global Variable: " & Str( globalVar ) )

End Sub
328 ЧАСТЬ III Переменные
А вот код вызывающего метода с глобальной переменной в
качестве аргумента:
Пример вызова метода с аргументом, демонстрирующим проблему
псевдонимов (Visual Basic)
WriteGlobal( globalVar )
Поскольку inputVar инициализируется 0, и WriteGlobalO
добавляет 5 к inputVar, чтобы получить новое значение
globalVar, вы ожидаете, что globalVar будет на 5 больше, чем
inputVar. Но вот неожиданный результат*.
Результат проблемы с псевдонимами
Input Variable: 5
Global Variable: 5
Хитрость в том, что globalVar и inputVar - на самом деле одна
и та же переменная! Поскольку globalVar передается в
WriteGlobalQ вызывающим методом, к ней обращаются с помощью
двух разных имен. Поэтому результат вызовов MsgBoxQ отличается
от ожидаемого: они показывают одну и ту же переменную дважды,
Предыдущая << 1 .. 162 163 164 165 166 167 < 168 > 169 170 171 172 173 174 .. 426 >> Следующая