Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

Про глобальные переменные   Найти похожие ветки 

 
TButton ©   (2004-04-08 18:45) [0]

а что, это действительно моветон? у меня, например, в одной проге была глобальная переменная users: array... да, и был отдельный юнит с функциями для работы с этим массивом (преимущественно - поиск и выдирание сведений о конкретном юзере) соответсвенно модуль с утилитами юзал Unit1.
или, например, есть у меня глобальная переменная mode и один таймер, котрый в заисимости от значения этого mode - выполняет те или иные операции.
вот сижу и не понимаю, а что в этом плохого-то?


 
Тимохов ©   (2004-04-08 18:48) [1]

Это разговор в продолжение какого-то другого?


 
TButton ©   (2004-04-08 18:50) [2]

нет. это я просто давно не могу понять, почему некоторые люди плюются в сторону глобальных переменных... типа антиглобалисты...


 
Гаврила   (2004-04-08 18:51) [3]

ну вообще-то даже главная форма приложения сразу автоматически создается как глобальная переменнаая, то есть однозначно сказать ,что это моветон, нельзя.
Для каждого случая надо принимать отдельное решение
Если она используется как способ передачи параметра между процедурами, это, имхо, плохо (например)


 
TButton ©   (2004-04-08 18:56) [4]

>Если она используется как способ передачи параметра между >процедурами, это, имхо, плохо (например)

обоснуйте, если не затруднит, бо я так делал, но ничего плохого не заметил.


 
Тимохов ©   (2004-04-08 18:58) [5]

Я вот тоже плююсь - у меня их вообще нет. Наверное ни одной. Естесно кроме тех, которые идут из vcl модулей. Своих нет.
Вернее так - есть но только под implementaion, в interface нет, как и свободный функций...

Почему так?
Сложно объяснить. Такова моя жизненная позиция. Если нужно делать гл. перем, то через классовые методы некого класса, который хранит значения под implementation.


 
Гаврила   (2004-04-08 19:00) [6]

>>TButton ©   (08.04.04 18:56) [4]

Процедура A вызывает процедуру B, которая в свою очередь вызывает либо C либо Д в зависимости от условий, которые в свою очередь... и так далее.
И каждая из них может менять значение глобальной переменной.
ПРоцедура С изменила ее значение ,а процедура А об этом "забыла"...
ТО есть достаточно просто запутаться и насажать багов


 
Тимохов ©   (2004-04-08 19:01) [7]


> TButton ©   (08.04.04 18:56) [4]

это сложно объяснить, также как сложно объяснять высокопоставленному непрограммисту, что делать единственным средством вывода отчетов в программе excel нельзя - "Работает же ведь!".


 
TButton ©   (2004-04-08 19:02) [8]

>interface нет
а если нужен обмен данными между модулями? каждый раз передавать ссылку на данные?


 
Тимохов ©   (2004-04-08 19:03) [9]


> >interface нет
> а если нужен обмен данными между модулями? каждый раз передавать
> ссылку на данные?

так точно...


 
TButton ©   (2004-04-08 19:04) [10]

>достаточно просто запутаться и насажать багов

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


 
TButton ©   (2004-04-08 19:06) [11]

>так точно...

вариант конечно, опять же повышается модульность и взаимная независимость...


 
Тимохов ©   (2004-04-08 19:08) [12]


> TButton ©   (08.04.04 19:04) [10]
> >достаточно просто запутаться и насажать багов
>
> ну знаете ли... я достаточно хорошо представляю себе структуру
> своей программы, а если что плохо представляю - можно на
> бумаге набросать, поэтому у меня весь стол бумагами завален,
> зато в уме полная ясность что где и как меняется.

Программа программе рознь.
Пусть ты пишешь прогу в 2000 строк. Представь, что она разрослась до 2тыс строк и вас программеров уже 3. Вот тут-то все и начнется...


 
TButton ©   (2004-04-08 19:11) [13]

>Представь, что она разрослась до 2тыс строк и вас программеров
>уже 3. Вот тут-то все и начнется...

поэтому я предпочитаю работать один =) а 2 тысячи не предел.


 
Думкин ©   (2004-04-08 19:20) [14]

> [13] TButton ©   (08.04.04 19:11)

2 тысячи - да, но 200000 один человек поддерживать будет на грани помешательства или гениальности, если будет только заваленными бумагами ориентироваться и не только ими.
Глобальные использовать можно, но зачем плодить сущности - если они лишние?
А если не лишние- то ради бога.


 
Тимохов ©   (2004-04-08 19:21) [15]

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

Если ты работаешь на себя - дело твое.
Но учти, что в коллективе придется переучиваться.


 
Тимохов ©   (2004-04-08 19:20) [16]

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

Если ты работаешь на себя - дело твое.
Но учти, что в коллективе придется переучиваться.


 
TButton ©   (2004-04-08 19:24) [17]

200000
ниразу не видел. модули они же ведь и нужны чтоб упростить написание программы. я например использую VCL, т.е. не явно, но моя программа состоит из.... дофига строк, однако, это пока не отразилось на моем психическом здоровии.... разве что чуть-чуть...


 
Style ©   (2004-04-08 19:32) [18]


> обоснуйте, если не затруднит, бо я так делал, но ничего
> плохого не заметил.


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


 
Думкин ©   (2004-04-08 19:33) [19]

> [17] TButton ©   (08.04.04 19:24)

Знаете, ведь и строки строкам рознь. Книжечку тут читал недавно - если по строкам, то самые непродуктивные - американцы. В среднем они пишут меньше строк чем коллеги из других стран. Но чей код эффективней?
200000 - этоо много. Ведь вопрос - каких. Вот цитата:
"Разработка программного обеспечения для системы управления огнем истребителя F-16 обошлась в 85 млн. долларов. Объем программного обеспечения составил 236000 строк кода." (с)
Там и про объемы есть. И про бумажки на столе.


 
TButton ©   (2004-04-08 19:40) [20]

>Но чей код эффективней?
чей?


 
Игорь Шевченко ©   (2004-04-08 20:23) [21]

Можно использовать глобальные переменные, коран не запрещает.
Можно писать несколько операторов в одной строке, молнией никто с небес не поразит.

Просто с помощью объектно-ориентированного подхода программировать удобнее. На всех, практически, этапах жизненного цикла программы(проекта).

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

С точки зрения теории - нехорошо, с точки зрения практики, неудобно, так зачем же их использовать сверх необходимости ?


 
Гаврила   (2004-04-08 20:32) [22]

>>Тимохов ©   (08.04.04 18:58) [5]
насчет того, что процедур нет как свободных функций, это имхо, перебор. По сути вызов классовой функции отличается только более длинным синтаксисом (+ ClassName).
Обратимся к модулям от борланда - там есть свободные функции.
И читаемость кода типа TFileUtils.ExtractFileName будет ниже


 
Юрий Зотов ©   (2004-04-08 20:48) [23]

IMHO, одна из главных сторон искусства практического программирования как раз и состоит в таком сочетании процедурного подхода и ООП, глобальных переменных и "прозрачности" всех мест их использования
(и пр., и пр.), при котором код оптимален, безопасен, понятен, легко читаем и легко отлаживаем.

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


 
Игорь Шевченко ©   (2004-04-08 20:51) [24]

Гаврила   (08.04.04 20:32)


> И читаемость кода типа TFileUtils.ExtractFileName будет
> ниже


А TFile.ExtractName ? :)


 
panov ©   (2004-04-08 21:28) [25]

Использую глобальные переменные для определения глобальных настроек, параметров в программе, которые используются во многих модулях.
Пока не заметил, чтобы это влияло как-то на количество ошибок и легкость чтения кода...
Ничего предосудительного не вижу в использовании глобальных переменных.
Следование догмам - не лучшая позиция...


 
Nous Mellon ©   (2004-04-08 21:31) [26]

В первых моих прогах была куча глобальных переменных - после изучения ООП никогда и ни одной..


 
Игорь Шевченко ©   (2004-04-08 21:44) [27]

panov ©   (08.04.04 21:28)

А я использую класс TSettings "для определения глобальных настроек, параметров в программе, которые используются во многих модулях", особенно после того, как заметил, что ряд переменных используется один и тот же в разных программах, при этом способ хранения их в реестре один и тот же :)


 
panov ©   (2004-04-08 22:01) [28]

>Игорь Шевченко ©   (08.04.04 21:44) [27]
Хорошая мысль, однако-)
Беру на вооружение-)


 
nikkie ©   (2004-04-08 22:05) [29]

экземпляр TSettings - глобальная переменная?


 
vuk ©   (2004-04-08 22:09) [30]

to nikkie ©   (08.04.04 22:05) [29]:
>экземпляр TSettings - глобальная переменная?
Тут рядом ветка была. Синглетоны обсуждались. :o)


 
panov ©   (2004-04-08 22:11) [31]

>nikkie ©   (08.04.04 22:05) [29]

экземпляр TSettings - глобальная переменная?

Конечно-)

Но зато можно скрыть реализацию чтения и сохранения параметров, например, в ini-файле.

Мне кажется, очень удобно будет обращаться так:

PathData := MySettings.Value("MainSection","PathData");
MySettings.Value("MainSection","PathData") := PathData;


-)


 
Anatoly Podgoretsky ©   (2004-04-08 22:23) [32]

Игорь Шевченко ©   (08.04.04 21:44) [27]
Класс удобен когда надо сделать контролируемое поведение, например не просто прочитать или присвоить значение, а при этих действия выполнчить какие то скрытые действия, а обращение должно выглядеть как к переменной, достоаточно будет оформить как свойство и иметь полный контроль с возможностью легкой модификации. Если же этого нет то переменные для настроек не лучше и не хуже.


 
nikkie ©   (2004-04-08 22:25) [33]

>vuk
>Тут рядом ветка была. Синглетоны обсуждались. :o)
неужто? пишем синглтон и каждый раз пишем TSettings.Create только ради того, чтобы глобальных переменных не было? :))

>panov
>Мне кажется, очень удобно будет обращаться так:
ты немного подумаешь, поймешь, что для разных параметров типа Integer, String, Boolean придется написать свою версию Value, начнешь писать и задумаешься, не лучше бы сделать было по-другому.


 
panov ©   (2004-04-08 22:34) [34]

>nikkie ©   (08.04.04 22:25) [33]

ты немного подумаешь, поймешь, что для разных параметров типа Integer, String, Boolean придется написать свою версию Value, начнешь писать и задумаешься, не лучше бы сделать было по-другому.

Не обязательно.

1. Можно сделать параметры типа Variant
2. Можно перегрузку сделать(overload)


 
Игорь Шевченко ©   (2004-04-08 22:35) [35]

Anatoly Podgoretsky ©   (08.04.04 22:23)

Или иметь возможность наследования :)


 
vuk ©   (2004-04-08 22:36) [36]

to nikkie ©   (08.04.04 22:25) [33]:
>пишем синглтон и каждый раз пишем TSettings.Create
Можно и написать. Но если лень, можно и дополнить класс функцией типа такой:
class function GetInstance: TSettings;
:o)

До кучи еще добавлю, что у меня в последнее время глобальные данные собираются в классы с названиями типа TEnvironment, и делаются классовые методы доступа.


 
Gero ©   (2004-04-08 23:09) [37]


> у меня в последнее время глобальные
> данные собираются в классы с названиями типа TEnvironment

Имхо, идеально.
То есть глобальная переменная будет всегда только одна(не считая переменных VCL).


 
nikkie ©   (2004-04-08 23:11) [38]

>собираются в классы
в синглтоны, надеюсь? :)
а то где же хранить данные, к которым обращаются классовые методы - не в глобальных же переменных :))


 
Gero ©   (2004-04-08 23:16) [39]


[38] nikkie ©   (08.04.04 23:11)
> не в глобальных же переменных

Именно в глобальной переменной!
Представь, как это удобно.
Создал один TEnvironment на приложение, а там уже храни что угодно.


 
Style ©   (2004-04-08 23:26) [40]


> а там уже храни что угодно.


Главное это что угодно использовать когда нужно. Иначе такая путанитца может получиться.



Страницы: 1 2 3 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.04 c
3-1080761597
wizzo
2004-03-31 23:33
2004.05.02
Как сделать сортировку в Table или DataSorce?


4-1078389788
evvcom
2004-03-04 11:43
2004.05.02
Побочный эффект от перехвата API-вызова


1-1081878319
Cfp12
2004-04-13 21:45
2004.05.02
Timage


3-1080281412
31512
2004-03-26 09:10
2004.05.02
Полтергейсты SQL Server или всё "намана"?


14-1081106133
juiceman
2004-04-04 23:15
2004.05.02
перехват вызовов win-api функций





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский