Главная страница
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]

глобальные переменные - удобно, пока приложение однопотоковое.


 
Anatoly Podgoretsky ©   (2007-09-11 00:06) [41]

> Petr V. Abramov  (10.09.2007 23:27:40)  [40]

Не только однопотоковое, а линейное.


 
Petr V. Abramov ©   (2007-09-11 00:09) [42]

> Anatoly Podgoretsky ©   (11.09.07 00:06) [41]
формализатор фигов :)


 
Anatoly Podgoretsky ©   (2007-09-11 00:10) [43]

> Petr V. Abramov  (11.09.2007 00:09:42)  [42]

Мы все умрем.


 
Petr V. Abramov ©   (2007-09-11 00:17) [44]

> Anatoly Podgoretsky ©   (11.09.07 00:10) [43]
они не дождутся


 
Юрий Зотов ©   (2007-09-11 01:05) [45]

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

Я просто Ешу программы так, чтобы они надежно работали. Чтобы был понятен их код. И не только мне одному. И пофиг, как оно называется.

Ежели потребуется ввести глобальную переменную - то введу, запросто. Но так, чтобы это было безопасно и удобно (в том числе, и через 5 лет).

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

В общем, так: "ежели... то... но..."

Вот и вся схема. И пофиг.

Ну не стоит ради 2х2 изобретать теории. Иногда надо быть проще, ей-богу.


 
Плохиш ©   (2007-09-11 01:10) [46]


> Я просто Ешу программы

Хм, какие у вас продвинутые ежи, программы требуют 8-O


 
vasIZmax ©   (2007-09-11 22:26) [47]


> MsGuns ©   (10.09.07 19:54) [39]

Честно не знаю, работать с этим не приходилось - поэтому не знаю.
Решил выяснить ответ.
Создаем новое приложение. Дописываем код
var
Form1, ttt:Tform1;

Т.е. создаем экземляр. (Правильно?)
На форму кидаем кнопку. И пишу
Application.CreateForm(TForm1, ttt);
ttt.Show;

По нажатию на кнопку создается точно такая же форма.
Заинтересовало, а как это можно использовать? Такое вот создание, ведь все свойства form1 копируются в ttt, т.е. по просту говоря ttt копия form(Правильно?)


 
Суслик ©   (2007-09-12 00:13) [48]

2автор
а при чем здесь функциональное программирование и примеры на дельфи?

вот на common lisp"е - это да, или на форте (все, других функциональных языков не знаю).

http://ru.wikipedia.org/wiki/%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F


 
Суслик ©   (2007-09-12 00:27) [49]

Вот еще ссылочка полезная

http://ru.wikibooks.org/wiki/%D0%A1%D0%B8%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D1%8B_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Haskell

hint
Delphi, java, c и пр. традиционно считаются императивными (так вроде пишется) языками.


 
Галинка ©   (2007-09-12 10:56) [50]

Суслик, так вот Игорь меня уже поправил, что надо говорить "процедурное программирование", а не функциональное. А примеры на дельфи вооьще не мои. Я вообще на Си пишу )) Сейчас во всяком случае. ))) Причем даже не на объект-ориентированном ))


 
Суслик ©   (2007-09-12 11:02) [51]


>  [50] Галинка ©   (12.09.07 10:56)

Да, виноват. Не прочел.


 
clickmaker ©   (2007-09-12 11:04) [52]


> А примеры на дельфи вооьще не мои

ты просто разместила объяву? :)


 
Anatoly Podgoretsky ©   (2007-09-12 11:38) [53]


> ты просто разместила объяву? :)

А мотороллер у нее есть?


 
_ShaggyDoc   (2007-09-12 13:13) [54]

Вот я в оcновном на Visual LISP пишу. Уж куда функциональней - вообще нет "процедур" и даже "операторов". Только списки, функции (как частный вид списков) и "атомы". Но переменные есть.

Переменные могут быть локальными (если указать в объявлении функции) и глобальными. Без переменных (даже локальных), в отличие от "императивных" языков можно вообще обойтись. Можно, но с текстом программы разбираться будет очень неудобно. Но среди значительной части "лисперов" считается особым шиком избавиться вообще от имен локальных переменных.

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

Согласен с Юрий Зотов ©   (11.09.07 01:05) [45] . Делать надо все с умом.

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

Исходный вопрос был про функциональное программирование. Функция всегда должна возвращать какое-то значение, даже если оно не используется. Может ли функция в виде побочного эффекта изменять какое-то глобальное значение - дело вкуса. Я лично стараюсь, чтобы даже глобальные переменные изменялись явно. Например, функция читает какие-то настройки из файла или из реестра и возвращает список значений. Вот этот спиок я могу присвоить значению глобальной переменной - чтобы в следующий раз в реестр не лазить.

Но присваивание значения в функциональном языке - это тоже функция :)



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

Текущий архив: 2007.10.14;
Скачать: CL | DM;

Наверх




Память: 0.62 MB
Время: 0.032 c
15-1190031053
boa_kaa
2007-09-17 16:10
2007.10.14
И это задача для детсткого сада!


2-1190181588
foma_nk
2007-09-19 09:59
2007.10.14
Format


2-1189849336
Sonic90
2007-09-15 13:42
2007.10.14
TrackBar


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


2-1189655958
SQL +
2007-09-13 07:59
2007.10.14
Коннект к БД Interbase 7