Форум программистов, компьютерный форум, киберфорум
Viktorrus
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

Инкапсуляция и глобальные переменные

Запись от Viktorrus размещена 03.11.2021 в 13:18
Показов 4037 Комментарии 11

Я решил наконец разобраться с инкапсуляцией.
Из Википедии.
"Инкапсуляция (англ. encapsulation, от лат. in capsula) — в информатике размещение в одном компоненте данных и методов, которые с ними работают. В реализации большинства языков программирования (C++, C#, Java и другие), обеспечивает механизм сокрытия, позволяющий разграничивать доступ к различным компонентам программы.

Инкапсуляция зачастую рассматривается как понятие, присущее исключительно объектно-ориентированному программированию (ООП), но в действительности обширно встречается и в других (см. подтипизация на записях и полиморфизм записей и вариантов). В ООП инкапсуляция тесно связана с принципом абстракции данных (не путать с абстрактными типами данных, реализации которых предоставляют возможность инкапсуляции, но имеют иную природу). Это, в частности, влечёт за собой различия в терминологии в разных источниках. В сообществе C++ или Java принято рассматривать инкапсуляцию без сокрытия как неполноценную. Однако, некоторые языки (например, Smalltalk, Python) реализуют инкапсуляцию, но не предусматривают возможности сокрытия в принципе. Другие (Standard ML, OCaml) жёстко разделяют эти понятия как ортогональные и предоставляют их в семантически различном виде (см. сокрытие в языке модулей ML)."
Те, кто так активно выступают против использования глобальных переменных в Питоне, видимо пришли из С++.
Однако у Питона более гибкий подход к инкапсуляции. С помощью классов переменные могут быть инкапсулированы в пространстве имен класса, но к ним есть доступ (хотя при желании этот доступ можно и закрыть).
Глобальные переменные имеют две негативные особенности.
1) В крупных проектах могут возникать конфликты между глобальными переменными с одинаковыми именами.
2) Может нарушаться алгоритм работы программы, когда не понятно из какого места программы вносятся изменения в глобальную переменную.
Первая проблема снимается, если просто вместо глобальных переменных использовать экземпляры класса с атрибутом v, в который записывать значение переменной, тем самым осуществляя инкапсуляцию. Когда переменные в виде атрибутов экземпляров принадлежат разным экземплярам класса, то конфликтов возникать не может.
Со второй проблемой можно справиться, если такому экземпляру класса, кроме атрибута v добавить еще атрибут is_used, значением которого является список. И в этот список записывать в виде строки модуль и функцию, из которой осуществляется запись в атрибут v, данного экземпляра класса. Понимая из каких мест идет изменение значения v данного экземпляра класса, будет легко выяснить причину возникновения ошибки.
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 11
Комментарии
  1. Старый комментарий
    Так как размер блога ограничен, пример размещу в комментарии.
    Кликните здесь для просмотра всего текста
    Python
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    
    class GV():        # класс "Глобальная переменная" (Global Variable)
        def __init__(self, v):
            self.v = v          # value значение глобальной переменной
            self.is_used = []   # ["func", ...] is_used список функций, использующих переменную,
                                    # не влияет на работу программы, но помогает выявлять при отладке ошибки, 
                                    # которые могут возникать при использовании глобальных переменных.
        
    # Создаем необходимое количество экземпляров персональных глобальных переменных.
    k1 = GV(3)
    k2 = GV(7)
    k3 = GV(0)
    k3.v = k1.v + k2.v
    if not ('__main__' in k3.is_used):
        k3.is_used.append('__main__')
    print(k3.v)            # 10
     
    # Если для одной и той же функции необходимо несколько глобальных переменных,
    # количество которых заранее не известно, 
    # то экземпляры класса и имена переменных с добавлением порядкового номера, 
    # создаются динамически внутри соответствующей функци.
     
    # Если для функции создается только одна персональная глобальная переменная,
    # то можно не использовать класс.
    # Или когда нужно сохранять много значений, глобальную переменную делать списком и добавлять туда результаты работы функции.
     
    last_move_OF_func = GV([])
     
    print(last_move_OF_func.v)        # []
     
    def func(n):
        for i in range(n):
            last_move_OF_func.v.append(i**2)
     
            if not ('__main__.func' in last_move_OF_func.is_used):  # сохранение точки изменения
                last_move_OF_func.is_used.append('__main__.func')   # переменной last_move_OF_func
     
        k3.v += k3.v * n
     
        if not ('__main__.func' in k3.is_used):         # сохранение точки изменения
            k3.is_used.append('__main__.func')          # переменной k3
     
    func(6)
     
    print(last_move_OF_func.v)        # [0, 1, 4, 9, 16, 25]
     
    print(last_move_OF_func.is_used)     # ['__main__.func']
    print(k3.is_used)                    # ['__main__', '__main__.func']
    Запись от Viktorrus размещена 03.11.2021 в 16:40 Viktorrus вне форума
  2. Старый комментарий
    Аватар для Storm23
    Все же инкапсуляция это не про глобальные переменные и не про конфликты имен.

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

    Инкапсуляция кардинально упрощает пользование объектом, потому что хорошо инкапсулированный объект работает "сам по себе", имеет простой внешний интерфейс и не заставляет внешнего пользователя знать про свое внутреннее устройство.
    Пример - машина. Все знают как крутить рулем или нажимать на педали. При этом, большинство понятия не имеют как оно устроено внутри, куда этот руль ведет, и что там внутри происходит. И это правильно, машина - хорошо инкапсулированный объект. Для пользования им не нужно знать его внутренние механизмы. Эти и есть пример инкапсуляции.

    А вот эти все глобальные перменные, приватные поля - это не инкапсуляция, это просто ее побочный продукт. Ограничение доступа к данным это для того, что бы кто-то извне не поломал объект, который управляется сложными внутренними механизмами, и поля которго нельзя менять "просто так".
    Запись от Storm23 размещена 05.11.2021 в 09:28 Storm23 вне форума
  3. Старый комментарий
    Storm23 Вы путаете инкапсуляцию с модульным программированием. Почитайте про модульное программирование, и увидите, что там говорится то же что и у Вас, один к одному. А про инкапсуляцию я привел выдержку из Википедии, Если Вы не поняли, почитайте там еще статьи про инкапсуляцию. Спорте со специалистами , а я с Вами спорить не собираюсь. Удачи.
    Запись от Viktorrus размещена 05.11.2021 в 15:22 Viktorrus вне форума
  4. Старый комментарий
    Storm23 я понял, в чем Ваша ошибка. Вы под инкапсуляцией понимаете более узкий ее смысл, тот который используется в языках семейства С++ или Java, где используется инкапсуляция с сокрытием. Но само понятие инкапсуляции имеет более широкий смысл, так например в таких языках, как Smalltalk или Python, используется инкапсуляция без сокрытия.
    Еще раз прочитайте статью из Википедии, там как раз объясняется, что инкапсуляция имеет более широкий смысл, чем тот, о котором говорите Вы.
    Запись от Viktorrus размещена 06.11.2021 в 08:08 Viktorrus вне форума
  5. Старый комментарий
    Спасибо, Viktorrus! Зацепили Вы меня своей статьёй, долго она мне покоя не давала, но вчера у себя в блоге я тоже всё-таки разродился К вопросу о глобальных переменных и инкапсуляции в приложениях PyQt.. Исходный посыл там, конечно, другой, но вот результат получился прямо под Вашу статью. Гляньте, может пригодится в Ваших изысканиях? С уважением, дата, подпись
    Запись от iamvic размещена 15.11.2021 в 12:07 iamvic вне форума
  6. Старый комментарий
    Цитата Сообщение от Viktorrus
    А про инкапсуляцию я привел выдержку из Википедии, Если Вы не поняли, почитайте там еще статьи про инкапсуляцию. Спорте со специалистами , а я с Вами спорить не собираюсь. Удачи.
    В русской вики написаны какие-то не совсем корректные тезисы. Например вот эта фраза
    В сообществе C++ или Java принято рассматривать инкапсуляцию без сокрытия как неполноценную.
    очень спорная. По большому счету она является оценочным суждением, и без конкретных ссылок (например на стандарт языка) это просто личное мнение автора, такому не место в энциклопедическом тексте.
    Кроме того, сверху статьи красуется:
    Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 21 сентября 2016; проверки требуют 69 правок.
    Я очень советую, не в порядке спора, а в порядке расширения кругозора прочитать эту же статью в английской версии википедии, она гораздо более строгая и лучше отражает контекст.
    Запись от DrOffset размещена 15.11.2021 в 13:54 DrOffset вне форума
  7. Старый комментарий
    DrOffset Ссылку на Википедию я дал только потому, что бы меньше писать самому, а не потому, что это для меня авторитет. У меня есть свое собственное мнение и я его объяснил. Исходя их этого моего мнения я использую питон, в котором поддерживается мой подход, а не С++, где используется жесткая инкапсуляция, которая противоречит Искусственному Интеллекту, как моделированию человеческого мышления. Но в человеческом мышлении нет жесткой инкапсуляции. Точнее она есть только у людей с ограниченным мышлением. Например женщины, использующие автомобиль, ограничиваются только тем, как управлять автомобилем, и имеют жестко инкапсулированное мышление относительно узлов автомобиля. Для них двигатель, это черный ящик, не доступный их пониманию. И ремонт двигателя они поручают или специалистам или другим автомобилистам, у которых не такое ограниченное мышление, и они разбираются в устройстве двигателя и могут сами устранять какие то неполадки в нем. И для моделирования мышления такого продвинутого автомобилиста жесткая инкапсуляция не подходит. А вот мягкая инкапсуляция питона, самое то. Так как тогда мы можем инкапсулировать двигатель, но предоставлять возможность осуществлять с его содержимым некоторые действия, что будет соответствовать реальному мышлению продвинутого автомобилиста.
    Запись от Viktorrus размещена 15.11.2021 в 18:46 Viktorrus вне форума
  8. Старый комментарий
    Цитата Сообщение от Viktorrus
    а не С++, где используется жесткая инкапсуляция
    Как именно использовать инкапсуляцию определяет программист, а не язык. В С++ нет никаких жестких ограничений связанных с тем, что вы выше написали и с тем, что написано в русской вики по поводу этого. Это все выдумки автора статьи, а не реальное положение вещей. Я напомню, что любой желающий может прямо сейчас поправить любой текст на вики, и для этого не обязательно быть "специалистом". Только проверенные статьи могут быть более-менее ценным источником.

    Цитата Сообщение от Viktorrus
    Так как тогда мы можем инкапсулировать двигатель, но предоставлять возможность осуществлять с его содержимым некоторые действия, что будет соответствовать реальному мышлению продвинутого автомобилиста.
    Это вопрос решаемой задачи, опять же, а не языка. Если постановка такова, что требуется сервисный доступ к двигателю, то язык (и С++ и любой другой) не помешает это сделать.
    Запись от DrOffset размещена 15.11.2021 в 20:30 DrOffset вне форума
  9. Старый комментарий
    Аватар для Azazel-San
    Цитата Сообщение от Viktorrus
    Но в человеческом мышлении нет жесткой инкапсуляции. Точнее она есть только у людей с ограниченным мышлением. Например женщины, использующие автомобиль, ограничиваются только тем, как управлять автомобилем, и имеют жестко инкапсулированное мышление относительно узлов автомобиля. Для них двигатель, это черный ящик, не доступный их пониманию.
    Исходя из вашей цитаты, можно всех людей считать "ограниченными в мышлении". Не существует ни одного человека, который бы разбирался во всем глубоко. Т.е. например, есть эксперты в своих областях, в весьма ограниченных областях того или иного предмета. Не существует человека-эксперта во всех областях. А, если и кто-то такое заявляет, то этот человек скорее всего не эксперт вовсе.
    Вот вы, например, руководствуетесь стереотипами по отношению к противоположному полу, хотя нет ни одного научного доказательства, что женщины каким-либо образом более ограничены в мышлении чем мужчины, получается у вас тоже ограниченное мышление в этой сфере. Кроме того, как вы выразились "ограниченность в мышлении" и вовсе не зависит от пола, а скорее от набора генов или полученных травм, если говорить с точки зрения нейробиологии. Остальное не более чем социальный конструкт.
    Кстати, автомобиль, как раз отличный пример инкапсуляции.

    P.S. - по поводу научных доказательств, если у вас такие имеются, буду рад, если сможете их привести, мне будет интересно почитать;
    P.S.S. - заранее ни в коем случае не пытался вас оскорбить.
    Запись от Azazel-San размещена 15.11.2021 в 23:14 Azazel-San вне форума
  10. Старый комментарий
    Azazel-San Я уже достаточно подробно все объяснил. Если Вы не поняли, я не буду заниматься тем, что бы именно Вам и другим, кто со мной не согласен, что то еще доказывать. Не согласны, это Ваше мнение. Я же высказал свое мнение, и следую ему в разработках. Пишите Ваш код как хотите, мне это не важно.
    Что касается женщин, тут Вы опять просто не понимаете. Женщины не ограничены в мышлении, а ограничивают себя в силу менталитета. Они стремятся к красоте, а возится с мотором это грязь, и требуется физическая сила. Уподобление мужчине не делает женщину привлекательнее. Поэтому они умышленно и обоснованно ограничивают область своего мышления, не берясь за ремонт двигателей. Зря я взялся Вам это объяснять, раз Вы не понимаете таких элементарных вещей. Все, кто со мной не согласен, делайте как хотите, я больше с вами не дискутирую. Удачи.
    Запись от Viktorrus размещена 16.11.2021 в 02:17 Viktorrus вне форума
  11. Старый комментарий
    Аватар для Avazart
    Например женщины, использующие автомобиль, ограничиваются только тем, как управлять автомобилем, и имеют жестко инкапсулированное мышление относительно узлов автомобиля. Для них двигатель, это черный ящик, не доступный их пониманию
    А сексизм это типа новый признак "расширенного" сознания !?
    Запись от Avazart размещена 16.11.2021 в 18:05 Avazart вне форума
 
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru