Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.14;
Скачать: CL | DM;

Вниз

Традиции программирования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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.017 c
3-1181237949
AlexDav
2007-06-07 21:39
2007.10.14
Из Access в InterBase


2-1189972791
Alexey_K
2007-09-16 23:59
2007.10.14
Окно, подобие понели задач


2-1189951103
Ezorcist
2007-09-16 17:58
2007.10.14
Синхронная прокрутка двух TMemo


2-1190027016
DevilDevil
2007-09-17 15:03
2007.10.14
Открыто ли модальное окно?


3-1181295469
DelphiLexx
2007-06-08 13:37
2007.10.14
XML - сохранение данных из БД