Форум программистов, компьютерный форум, киберфорум
Наши страницы
CoderHuligan
Войти
Регистрация
Восстановить пароль
Рейтинг: 1.00. Голосов: 1.

Глобальные переменные: зло или добро? (Начало)

Запись от CoderHuligan размещена 07.11.2018 в 12:08
Обновил(-а) CoderHuligan 07.11.2018 в 12:29

Повсюду я постоянно слышу одно: глобальные переменные зло, и их нужно всячески избегать!
Я не буду здесь развенчивать этот миф, очередной миф, ибо практика показала совершенную необходимость общеразделяемых переменных. Например глобальные массивы PHP. Все пользуются и никто не жалуется. Видимо речь идёт о бездумном их применении даже там, где нужны обычные параметры.
Хотелось бы пофилософствовать на тему развития языков программирования применительно к концепции сокрытия информации.
Один из самых древних языков BASIC, который создавали неглупые люди, а профессора математики был идеально приспособлен для расчётов, и был проще фортрана, поэтому быстро обрёл свою популярность во всём мире. Появилися десятки его диалектов.
Отличительной особенностью бэйсика являлось то, что он был вообще-то интерпретатором, однако не это главное. Главное, что первоначально он не имел функций. Вообще не имел. Однако чаяния масс потребовало большего, и ввели оператор gosub, при помощи которого происходил переход на строку с номером функции. Функции не имели имён, и только по номеру строки можно было до неё "достучаться". Оператор return позволял интерпретатору перейти на строку следующую за вызовом этой функции. Функции не имели параметров, поэтому все переменные были глобальны для программы. Это важный момент. Запомним это.
Тогда считалось, что процедура или подпрограмма, предназначена всего лишь для сокращения листинга где используются часто повторяемые блоки кода. Вот чтобы и часто не прописывать и не засорять листинг и придумали прыгать(именно прыгать!) на подпрограмму и выпрыгивать обратно когда она закончится.
Примитив, скажете вы, и будете правы, хотя и отчасти.
Да там много было архаичного, та же нумерация строк. Однако, заметим!, что программа создавалась "плоско" практически в одном листинге. Это тоже архаизм, однако в таком подходе были и свои плюсы.
Люди писали очень сложные программы, которые, несмотря на сложность сопровождения, неплохо работали.
С появлением процедурных структурных языков (си, паскаль) программа начала делиться на мелкие функции, которые по отдельности было легко отлаживать, а значит способствовало созданию более сложных программных систем..
Маленькие функции-компоненты выполняли только свою работу, были легко обозримы, легко понятны и легче поддерживаемы сторонними разработчиками.
Вроде курс определился, и в итоге мы пришли к тотальному ООП..
Вопрос: правилен ли был тот путь от плоской программы к разделённой на функции сейчас никто не подвергает сомнению..
Теория гласит, что программу любой сложности можно сделать именно так. Возможно, возможно, но когда на практике сталкиваешься с определёнными проблемами, то начинаешь вспоминать незаслуженно забытый бэйсик..
А правильно ли было вообще делить программу на компоненты? Создавать стек возвратов и пр.? Глупый вопрос? Детский? Да нет.. Дело в том, что программа ДОЛЖНА делится на СОСТОЯНИЯ, а функции это не замена СОСТОЯНИЯМ этой программы. Состояния программы это отдельные обособленные блоки кода, но не функции! И это принципиально!..
Невозможно сделать программу в терминах состояний пользуясь только функциями и подпрограммами! На то они и ПОД программы, что представляют из себя всего лишь много-повторяемые блоки. Однако об этом факте успешно забыли, и сейчас полагают, что подпрограммы нужны только для разделения программы на модули и компоненты, и даже на обьекты, которые состоят из методов-функций.
Функция - не состояние! Запомним это.

Нужно было вводить подгрузку блоков кода состояний, а не только функции..
Итак от бэйсика ушли, так и не поняв его преимуществ, однако пришли к совсем иным категориям и парадигмам.
Бэйсику нужно было развиваться в терминах состояний, тем более что все задатки к этому у него были.
Безстековая архитектура позволила бы дать зелёный свет рекурсии, которая сейчас ограничена глубиной стека.. Однако проморгали, господа, проморгали.. Упустили свой шанс. Может быть когда-нибудь в будущем мы его используем и начав с основ вернёмся к хорошо забытому старому, чтобы на новом витке эволюции найдя правильный путь придти к правильному пониманию самого процесса создания ПО..
Размещено в Без категории
Просмотров 796 Комментарии 59
Всего комментариев 59
Комментарии
  1. Старый комментарий
    Аватар для Usaga
    И где развенчивание мифа о том, что глобальные переменные - плохая практика?
    Запись от Usaga размещена 07.11.2018 в 12:47 Usaga вне форума
  2. Старый комментарий
    Аватар для Fedor92
    Цитата:
    Повсюду я постоянно слышу одно: глобальные переменные зло, и их нужно всячески избегать!
    Как минимум знаю пяток сайтов, которые были взломаны благодаря тому, что в .htaccess были настежь открыты глобальные переменные...
    Запись от Fedor92 размещена 07.11.2018 в 13:01 Fedor92 на форуме
  3. Старый комментарий
    Аватар для diadiavova
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    И где развенчивание мифа о том, что глобальные переменные - плохая практика?
    Не то чтобы я защищал изложенные здесь идеи, но справедливости ради замечу, что автор с самого начала написал (во второй строке текста), что развенчивать его не будет ))
    Запись от diadiavova размещена 07.11.2018 в 19:07 diadiavova вне форума
  4. Старый комментарий
    Аватар для Avazart
    Цитата:
    Я не буду здесь развенчивать этот миф, очередной миф, ибо практика показала совершенную необходимость общеразделяемых переменных. Например глобальные массивы PHP.
    И видимо из-за вот такой практики криворуких - PHP не считают нормальным ЯП, а пишущих на нем считают гавнокодерами.


    Сама постановка вопроса говорит о низкому уровне понимания автора блога, не говоря о умении излагать материал.
    Запись от Avazart размещена 07.11.2018 в 22:39 Avazart вне форума
    Обновил(-а) Avazart 07.11.2018 в 22:44
  5. Старый комментарий
    Аватар для Curry
    Цитата:
    Один из самых древних языков BASIC ... Появилися десятки его диалектов.
    GW-BASIC о котором вы далее рассказывали (или о его предшественнике) и VBA это настолько разные языки что говорить про диалекты одного языка не стоит. Разве что у всех BASIC-ов ориентация на непрофессионального программиста. Т.е. на простоту для решения несложных задач, но с потерей массштабируемости.
    Цитата:
    программа ДОЛЖНА делится на СОСТОЯНИЯ
    Что такое СОСТОЯНИЕ в данном контексте? Программа, конечно, может иметь состояния во время выполнения. Но как она на состояния должна делится? Разные обработчики разных состояний что ли? Так это решается, в том числе и через ООП, и через ФП.
    Запись от Curry размещена 08.11.2018 в 02:38 Curry вне форума
  6. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    И где развенчивание мифа о том, что глобальные переменные - плохая практика?
    Дойдём и до этого..
    Запись от CoderHuligan размещена 08.11.2018 в 06:32 CoderHuligan на форуме
  7. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от Fedor92 Просмотреть комментарий
    Как минимум знаю пяток сайтов, которые были взломаны благодаря тому, что в .htaccess были настежь открыты глобальные переменные...
    Не надо абсолютизировать криворукость.
    Запись от CoderHuligan размещена 08.11.2018 в 06:33 CoderHuligan на форуме
  8. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    И видимо из-за вот такой практики криворуких - PHP не считают нормальным ЯП, а пишущих на нем считают гавнокодерами.
    Дело здесь не в конкретном языке.
    Запись от CoderHuligan размещена 08.11.2018 в 06:38 CoderHuligan на форуме
  9. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Сама постановка вопроса говорит о низкому уровне понимания автора блога, не говоря о умении излагать материал.
    Простите меня за сумбурность мыслей - писал с чистого листа без долгого обдумывания то, что просилось сейчас на "бумагу".. В следующий раз я подробней и более связно выскажу свою точку зрения. Во всяком случае постараюсь. И поверьте я здесь пишу не просто так. Создавая реальный проект, переделывая всё в 10-й раз с нуля приходишь к определённым выводам, которые далеки от чистого теоритезирования.. Практика великая вещь!..
    Запись от CoderHuligan размещена 08.11.2018 в 06:43 CoderHuligan на форуме
  10. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от Curry Просмотреть комментарий
    GW-BASIC о котором вы далее рассказывали (или о его предшественнике) и VBA это настолько разные языки что говорить про диалекты одного языка не стоит.
    Да, вы правы. Современные бэйсики сильно "подправили", как я считаю, в худшую сторону. Во free basic даже ввели поддержку ООП, что на мой взгляд вообще не из той оперы..
    Я говоил именно о первых версиях, о древних бэсиках, когда они ещё были бэйсиками..
    .
    Запись от CoderHuligan размещена 08.11.2018 в 06:47 CoderHuligan на форуме
  11. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от Curry Просмотреть комментарий
    Что такое СОСТОЯНИЕ в данном контексте? Программа, конечно, может иметь состояния во время выполнения. Но как она на состояния должна делится? Разные обработчики разных состояний что ли? Так это решается, в том числе и через ООП, и через ФП.
    Это серьёзный вопрос. Так с коленки в двух словах на него не ответишь. Может быть сегодня или завтра напишу новую запись в блоге. Надо собраться с мыслями.
    Сейчас я переделал в очередной раз программу от компонентной модели к модели состояний и всё пошло как по маслу. Были серьёзные ограничения. Последний вариант был - вообще отказаться от глобальных переменных. НО в той функциональности которая мне была нужна без этого трудно обойтись. Тогда каждый компонент программы, который вызывает подчинённый должен передавать ему часть его параметров, а как с сокрытием инфо? Да никак.. Выходит что главный компонент ответственен за те параметры, которые есть у каждого вниз по цепочке вызовов? Бред. Я отказался от этого. У меня одна точка входа в скрипте. Модули подгружаются в эту точку входа. При отсутствии глобальных переменных ничего не выходило. Какая-то бяка получается. Я раньше писал только небольшие программки и не сталкивался с большими проектами, а сейчас пришлось взяться за большой и сложный проект..
    В этой модели состояний я пошёл на тяжёлый риск, ведь мало кто это вообще делал. Программа получается состоит из не из функций, а из инклюдов отдельных блоков кода. О преимуществах позже, для меня они очевидны иначе бы не взялся..
    Функции конечно есть, но они выполняют служебные функции(запись в лог, работа с базой данных и пр.)
    Однако не хватает ограничения видимости переменных в PHP хотя бы в циклах, как в Си хотя бы. Это упущение самого языка, который вообще не приспособлен к данному подходу. Приходится немного извращаться.
    Запись от CoderHuligan размещена 08.11.2018 в 07:00 CoderHuligan на форуме
    Обновил(-а) CoderHuligan 08.11.2018 в 07:04
  12. Старый комментарий
    Аватар для Usaga
    Цитата:
    Создавая реальный проект, переделывая всё в 10-й раз с нуля приходишь к определённым выводам, которые далеки от чистого теоритезирования..
    И ваши выводы - плох язык\парадигма\фреймворк? Может, всё же, всему виной недостаток опыта и знаний?

    Цитата:
    Тогда каждый компонент программы, который вызывает подчинённый должен передавать ему часть его параметров, а как с сокрытием инфо? Да никак..
    Про Dependency Injection вы не слышали?
    Запись от Usaga размещена 08.11.2018 в 07:12 Usaga вне форума
  13. Старый комментарий
    Аватар для Fedor92
    Цитата:
    Не надо абсолютизировать криворукость.
    Да ну? А мне кажется Avazart подчеркнул всю суть практики использования глобальных переменных в первом своём посте... Разве нет? Вам любой программист, имеющий достаточный опыт в сфере разработок на любом высокоуровневом языке скажет тоже самое...
    Запись от Fedor92 размещена 08.11.2018 в 10:00 Fedor92 на форуме
  14. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    И ваши выводы - плох язык\парадигма\фреймворк? Может, всё же, всему виной недостаток опыта и знаний?
    Наоборот, как раз: слишком много знаний, хотя реального опыта создания крупных систем у меня нет. Знаний которые заставляют искать неведомое, иные пути.. Найти тот единственный истинный путь. Это Дзен..
    Запись от CoderHuligan размещена 08.11.2018 в 10:20 CoderHuligan на форуме
  15. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    Про Dependency Injection вы не слышали?
    Ознакомился. Это чисто обьектный подход, а я не занимаюсь обьектами, я ищу альтернативные пути. И за проект взялся в основном чтобы на практике протестировать некоторые идеи, как общепринятые, так и не очень.
    Запись от CoderHuligan размещена 08.11.2018 в 10:27 CoderHuligan на форуме
  16. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от Fedor92 Просмотреть комментарий
    Да ну? А мне кажется Avazart подчеркнул всю суть практики использования глобальных переменных в первом своём посте... Разве нет?
    Тут вопрос стоит так - либо демократия, либо автократия. Демократия, это когда всё для всех, а автократия это когда всё для немногих..
    Понимаете: программа, как целое, не может быть разделена на независимые сущности, как бы кто не пытался это сделать, создавая обьекты, компоненты, модули и пр. Иначе это уже не программа, которая в целом имеет своё состояние. Значит она в принципе неуправляема. Вред глобальных переменных сильно преувеличен. Вот например в PHP все функции, где бы они не были обьявлены входят в глобальное пространство имён. Сейчас появились нэмспейсы и классы, в которых можно ограничить это буйство демократии. Однако это буйство можно ограничить простым соглашением имён.
    Запись от CoderHuligan размещена 08.11.2018 в 10:35 CoderHuligan на форуме
  17. Старый комментарий
    Аватар для Usaga
    Цитата:
    Наоборот, как раз: слишком много знаний, хотя реального опыта создания крупных систем у меня нет.
    Это заблуждение. Знаний никогда не бывает даже "достаточно", не то что "слишком много".

    Цитата:
    Ознакомился. Это чисто обьектный подход, а я не занимаюсь обьектами, я ищу альтернативные пути. И за проект взялся в основном чтобы на практике протестировать некоторые идеи, как общепринятые, так и не очень.
    А, т.е. и инкапсуляция вам нужна и инкапсуляция вам не нужна? Компоненты есть, объектов нет?
    Запись от Usaga размещена 08.11.2018 в 10:50 Usaga вне форума
  18. Старый комментарий
    Аватар для Curry
    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    Однако не хватает ограничения видимости переменных в PHP хотя бы в циклах, как в Си хотя бы. Это упущение самого языка, который вообще не приспособлен к данному подходу.
    У меня сложилось впечатление что PHP не приспособлен ни к чему вообще. "Письмо из Простоквашино" сочинённое разными людьми. Не спорю что он самый распространённый серверный язык, но объясняется это исключительно историческими причинами - очень много на нём уже написали.
    Запись от Curry размещена 08.11.2018 в 12:38 Curry вне форума
  19. Старый комментарий
    Аватар для Curry
    Цитата:
    Сообщение от Usaga Просмотреть комментарий
    А, т.е. и инкапсуляция вам нужна и инкапсуляция вам не нужна? Компоненты есть, объектов нет?
    Инкапсуляция - это только один из китов ООП. Она существует и без ООП. Разумеется, должна поддерживаться языком.
    Запись от Curry размещена 08.11.2018 в 12:40 Curry вне форума
  20. Старый комментарий
    Аватар для Fedor92
    Цитата:
    Тут вопрос стоит так - либо демократия, либо автократия.
    Любой демократии я предпочитаю тотальный контроль(в IT разумеется не в жизни , хотя в жизни иногда тоже бы не помешало)... Зачем в случае возникновения проблем перебирать нужные пространства имён или классы, если можно разом отсечь все уязвимости?
    Запись от Fedor92 размещена 08.11.2018 в 12:45 Fedor92 на форуме
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru