Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1189518582
istok
2007-09-11 17:49
2007.10.14
Блокать вебсайты..


2-1190242394
Critter
2007-09-20 02:53
2007.10.14
Форма на web-странице в Интернет


1-1185946868
Alexey_k
2007-08-01 09:41
2007.10.14
www-addres to file name


2-1189699967
ММК
2007-09-13 20:12
2007.10.14
Файлы


6-1171694995
Snakecatcher
2007-02-17 09:49
2007.10.14
idUDP





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский