Форум: "Прочее";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];
ВнизТрадиции программирования2: или ... Найти похожие ветки
← →
Галинка © (2007-09-10 14:19) [0]привычно ли в традиции функционального программирования работать с глобальными переменными, которые изменяются в той или иной процедуре/функции? Или все же функция/процедура должна принимать и возвращать свои знаыения, которыми уже оперируют далее?
← →
Dib@zol © (2007-09-10 14:20) [1]Для мелких программ - да. Для крупных - увольте, ни за что. Трассировка масштабного проекта на такой архитектуре это ужжоссс.
← →
Eraser © (2007-09-10 14:20) [2]
> Галинка © (10.09.07 14:19)
в идеале, глобальных переменных вообще быть не должно.
← →
Галинка © (2007-09-10 14:23) [3]Значит я примерно правильно думаю. Просто разбираю книжный пример с построением однозвязных списков. А там все на глобальных переменных. Зачем тогда неправильно учат? Если уж бить на ф-ции, то сразу с нормальной структурой ((
← →
Ega23 © (2007-09-10 14:26) [4]
> в идеале, глобальных переменных вообще быть не должно
TApplication? :)
← →
Ega23 © (2007-09-10 14:27) [5]Хотя я согласен - глобальными переменными практически не пользуюсь (исключение - TApplication и один DataModule на проект).
Вот константы - да.
← →
Игорь Шевченко © (2007-09-10 14:27) [6]
> привычно ли в традиции функционального программирования
> работать с глобальными переменными
Нет. Откуда у функций глобальные переменные ?
← →
Torry © (2007-09-10 14:29) [7]
> в идеале, глобальных переменных вообще быть не должно.
>
"Кто это спел?" (c) :-)
Видел разные решения, но очень часто делается отдельный модуль, в котором описываются глобальные переменные для всего проекта. Обычно туда помещаются общие для интерфейса данные (цветовые гаммы, шрифты и т.д.), но и всякие другие вещи бывают (адрес сервера БД, тип его и т.д.). Ничего плохого в данной технологии не вижу.
← →
Anatoly Podgoretsky © (2007-09-10 14:29) [8]> Галинка (10.09.2007 14:19:00) [0]
Если функция, что-то меняет за своими пределами, то это не функция, а функционал.
← →
vasIZmax © (2007-09-10 14:30) [9]> Eraser © (10.09.07 14:20) [2]
Можно вопрос попутно(буквально вчера столкнулся).
Вот код:var
Form1: TForm1;
i:integer;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
form1.Timer1.Enabled:=true;
i:=0;
end;
...
procedure TForm1.Timer1Timer(Sender: TObject);
begin
i:=i+timer1.Interval;
if i>=10000 then
begin
.....
end;end;
как здесь?
З.ы. за ламерство сразу - "сорри":)
← →
Anatoly Podgoretsky © (2007-09-10 14:30) [10]> Галинка (10.09.2007 14:23:03) [3]
А надо бы было сделать класс-обертку, с контролируемыми свойствами.
← →
Eraser © (2007-09-10 14:31) [11]
> Ega23 © (10.09.07 14:26) [4]
... Screen, переменные с версиями системы и т.д. Отголоски процедурного программирования, imho.
в .net от этого ушли.
← →
clickmaker © (2007-09-10 14:31) [12]классический пример - настройки приложения. Глобальный экземпляр структуры в отдельном модуле
← →
Германн © (2007-09-10 14:32) [13]
> Игорь Шевченко © (10.09.07 14:27) [6]
>
>
> > привычно ли в традиции функционального программирования
> > работать с глобальными переменными
>
>
> Нет. Откуда у функций глобальные переменные ?
>
У некоторых бывают :(
http://delphimaster.net/view/15-1188078391/
← →
Eraser © (2007-09-10 14:32) [14]
> vasIZmax © (10.09.07 14:30) [9]
i нужно сделать акрытым полем класса и всех делов :)
← →
clickmaker © (2007-09-10 14:34) [15]
> в .net от этого ушли.
завуалировали кучей shared-свойств, точнее
← →
Игорь Шевченко © (2007-09-10 14:41) [16]Германн © (10.09.07 14:32) [13]
Речь вроде идет о функциональном программировании, то есть, о языках типа Erlang и т.п. Или автор, как всегда, выплескивает поток неформатированного сознания.
← →
Галинка © (2007-09-10 14:52) [17]Игорь, сразу прошу прощение за корявость определений. Я имела в виду когда "основной составляющей" программы является функция/процедура. Может это как-то подругому называется. ))
Анатолий, я пока буз объектов вообще программирую. Точнее учусь. А в книге:struct list_element{
char name[20];
struct list element *naechst;
} *kopf, *ende;
void ListeInit(void){
kopf = (struct list_element *)malloc(sizeof(struct list_element));
ende = (struct list_element *)malloc(sizeof(struct list_element));
if (kopf == NULL || ende == NULL){
printf("Speicherplatzmangel!\n");
exit(1);
}
kopf->naechst = ende->naechst = ende;
}
void AddElement(void){
char prom_str[20];
struct list_element *neu_elem, *list_ptr;
printf("\nGeben Sie bitte den Namen ein: \n");fflush(stdout);
fgets(prom_str, 20, stdin);
prom_str[strlen(prom_str)-1] = "\0";
neu_elem = (struct list_element *)malloc(sizeof(struct list_element));
if (neu_elem == NULL){
printf("\nSpeicherplatzmangel!\n");
exit(1);
}
strcpy(neu_elem->name, prom_str);
list_ptr = kopf;
while (list_ptr->naechst != list_ptr->naechst->naechst){
if (strcmp(prom_str, list_ptr->naechst->name) <= 0) break;
list_ptr = list_ptr->naechst;
}
neu_elem->naechst = list_ptr->naechst;
list_ptr->naechst = neu_elem;
}
void RemoveElement(void){
char prom_str[20];
struct list_element *list_ptr, *rem_ptr;
printf("\nGeben Sie bitte den zu loeschenden Namen ein: \n");fflush(stdout);
fgets(prom_str, 20, stdin);
prom_str[strlen(prom_str)-1] = "\0";
list_ptr = kopf;
while(list_ptr != list_ptr->naechst){
if(!strcmp(prom_str, list_ptr->naechst->name)) break;
list_ptr = list_ptr->naechst;
}
if (list_ptr == list_ptr->naechst){
printf("Name "%s" ist nicht in der Liste vorhanden!\n", prom_str);
}
else{
rem_ptr = list_ptr->naechst;
list_ptr->naechst = list_ptr->naechst->naechst;
free(rem_ptr);
}
}
т.е. все через глобальные. Но как-то коряво смотрится, по-моему.
← →
Германн © (2007-09-10 14:54) [18]
> Игорь Шевченко © (10.09.07 14:41) [16]
Не знаю. Не помню ни одного поста автора про программирование :)
← →
Игорь Шевченко © (2007-09-10 14:56) [19]
> Я имела в виду когда "основной составляющей" программы является
> функция/процедура. Может это как-то подругому называется.
> ))
Это называется процедурное программирование и глобальные переменные там вполне допустимы. Более того, в приведенном примере без глобальных переменных обойтись попросту нельзя.
← →
isasa © (2007-09-10 14:58) [20]Eraser © (10.09.07 14:20) [2]
в идеале, глобальных переменных вообще быть не должно.
Да! И примером тому служат проекты на Delphi, C#, J2EE ... :)
← →
isasa © (2007-09-10 15:00) [21]Игорь Шевченко © (10.09.07 14:27) [6]
Нет. Откуда у функций глобальные переменные ?
Тут эта, естественно надо уточнять, мы о "чистом" C++, или ООП участвует, причем, глобально.
← →
Игорь Шевченко © (2007-09-10 15:04) [22]isasa © (10.09.07 15:00) [21]
Эта...С++ как бы не язык функционального программирования...
← →
Галинка © (2007-09-10 15:06) [23]Игорь, т.е. передача через параметры в корне не верна, или просто громоздка и запутана?
← →
Игорь Шевченко © (2007-09-10 15:11) [24]
> Игорь, т.е. передача через параметры в корне не верна, или
> просто громоздка и запутана?
Верна. Но в данном примере с глобальными переменными проще
← →
Anatoly Podgoretsky © (2007-09-10 15:12) [25]> Torry (10.09.2007 14:29:07) [7]
Только это должно быть контролируемым, писать только из малого числа мест, в основном для чтения.
Проблемы то обычно возникают из-за бесконтрольго использования, особенно могут повредить вызов функций по цепочке и потоки.
← →
Anatoly Podgoretsky © (2007-09-10 15:14) [26]> vasIZmax (10.09.2007 14:30:09) [9]
Вот сделаешь так и погибнешь, возможно долго будешь искать ошибкуvar
form1: TForm1
begin
form1.Timer1.Enabled:=true;
← →
Anatoly Podgoretsky © (2007-09-10 15:15) [27]> Eraser (10.09.2007 14:32:14) [14]
I здесь вообще не нужно, ни в виде переменной, ни в виде поля.
← →
Desdechado © (2007-09-10 15:17) [28]Галинка © (10.09.07 14:19)
Почитай про "сцепление" и "связность" модулей, например, в книжке Зиглер К. "Методы проектирования программных систем".
Это уж точно классика.
← →
Черный Шаман (2007-09-10 15:19) [29]
> Галинка © (10.09.07 14:19)
>
> привычно ли в традиции функционального программирования
> работать с глобальными переменными, которые изменяются в
> той или иной процедуре/функции? Или все же функция/процедура
> должна принимать и возвращать свои знаыения, которыми уже
> оперируют далее?
Глобальные фабрики использовать удобно. Или же глобальный пул настроек.
← →
vasIZmax © (2007-09-10 15:27) [30]> Anatoly Podgoretsky © (10.09.07 15:14) [26]
что-то несовсем понял замечания.
перед begin еще procedure TForm1.FormCreate(Sender: TObject);
← →
Eraser © (2007-09-10 15:29) [31]
> vasIZmax © (10.09.07 15:27) [30]
целочисленные глобальные перменные инициализируются нулями.
← →
clickmaker © (2007-09-10 15:29) [32]
> [9] vasIZmax © (10.09.07 14:30)
низачот.
1. имена переменных не осмысленные
2. i в данном случае нет смысла выносить, бо оно юзается в методах класса
← →
Jeer © (2007-09-10 15:29) [33]
> Anatoly Podgoretsky © (10.09.07 15:12) [25]
Программирование - вообще процесс, требующий тщательного контролирования, а потому в запретах на использование глобальных переменных вижу перебз..
← →
Галинка © (2007-09-10 15:40) [34]Игорь Шевченко © (10.09.07 15:11) [24]
в данном понятно, что проще. А если писать свою библиотеку например для работы со списками. Тогда как?
← →
Игорь Шевченко © (2007-09-10 15:59) [35]Галинка © (10.09.07 15:40) [34]
Тогда не изобретать велосипед - библиотек для работы со списками написано, как звезд на небе.
← →
Anatoly Podgoretsky © (2007-09-10 15:59) [36]> Jeer (10.09.2007 15:29:33) [33]
Запрет на использования там, где достаточно использования локальных переменных, либо вообще без переменных.
Если действительно есть нужда в них, то надо посмотреть использовать переменные или сделать класс.
← →
Jeer © (2007-09-10 16:09) [37]
> где достаточно использования локальных переменных,
А с этим никто не спорит, более того, скажем в форме, целесообразнее переменные делать членами класса в соответствующей секции, и, при необходимости, с возможностью доступа к ним через property.
Torry © (10.09.07 14:29) [7]
Удобно и нареканий со стороны своего мозга к тому, что я этим пользуюсь пока не замечал.
← →
Anatoly Podgoretsky © (2007-09-10 16:54) [38]
и, при необходимости, с возможностью доступа к ним через property.
Естественно если требуется контролируемый доступ, а если пересилить себя то всегда. Запись
property x: Integer read FX write FX
ни на один такт не снижает производительности, зато скрывает прямой доступ до переменной, только через свойство.
← →
MsGuns © (2007-09-10 19:54) [39]>vasIZmax © (10.09.07 14:30) [9]
>как здесь?
Контрвопрос:
а что будет, если одновременно существует несколько экземпляров класса TForm1 ?
← →
Petr V. Abramov © (2007-09-10 23:27) [40]глобальные переменные - удобно, пока приложение однопотоковое.
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.037 c