Привет, Хабр, меня зовут Александра, я программист в отделе разработки серверных решений ЮMoney. В этой статье описываю, как принципы объектно-ориентированного программирования можно использовать в психологии человека. Моя цель — показать, что за техническими терминами часто скрываются идеи, которые могут обогатить наше восприятие не только программирования, но и природы человека.

Объектно-ориентированное программирование (далее ООП) — один из основополагающих подходов к разработке. Этот метод позволяет структурировать код, сделать его более гибким и удобным для понимания и модификации. Однако, помимо технологий, ООП можно рассматривать и через призму человеческой психологии. Когда изучала программирование, я заинтересовалась темой ООП на стыке этих двух дисциплин, и заметила, что концепции, которые используются в ООП, имеют много общего с тем, как мы воспринимаем своё поведение в обществе.

Что же такое ООП и при чём здесь психология

С точки зрения программирования, ООП — это подход, подразумевающий, что программа имеет набор объектов, которые взаимодействуют друг с другом.

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

Если рассматривать человека с точки зрения ООП, к нему как к объекту тоже применимы основные принципы такого подхода: абстракция, наследование, инкапсуляция и полиморфизм. Давайте попробуем объяснить все эти принципы с точки зрения психологии.

В социуме есть базовые принципы взаимодействия между людьми или группами

Умение выстраивать отношения с людьми называется социальными навыками. С их помощью человек может грамотно общаться, учиться чему-то новому, просить помощи и многое другое. Для разных социальных групп или ролей эти навыки могут быть разными, но можно выделить самые важные, которые необходимы каждому: говорить и слушать собеседника, читать и писать, обучаться. Всё это можно считать неким соглашением, за счёт которого общество может ожидать от любого человека плюс-минус одинакового поведения.

В программировании такое соглашение называется интерфейсом, который определяет, каким поведением будет обладать объект, и гарантирует, что определённый класс может совершать определённые действия. В коде это будет выглядеть так:

<?php

interface SocietyInterface
{
    // умение общаться
    public function communicate($message);

    // умение писать
    public function write($content);

    // умение читать
    public function read($text);

    // умение учиться
    public function learn($topic);

    // умение представляться
    public function introduce($name);

    // и другие...
}

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

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

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

Рассмотрим на примере кода: создадим интерфейс с методами, и у каждого класса, который будет реализовывать интерфейс, будет своя собственная реализация этих методов:

<?php

// Интерфейс FamilyMember
interface FamilyMember
{
    public function introduce();
}

// Класс Parent
class Parent implements FamilyMember
{
    protected $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function introduce()
    {
        return "Я родитель по имени " . $this->name;
    }
}

// Класс Child
class Child implements FamilyMember
{
    protected $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function introduce()
    {
        return "Я ребенок по имени " . $this->name;
    }
}

// Функция для представления члена семьи
function introduceFamilyMember(FamilyMember $member)
{
    echo $member->introduce() . "\n";
}

// Создаем объекты
$parent = new Parent("Сергей");
$child = new Child("Анна");

// Используем полиморфизм
introduceFamilyMember($parent); // Вывод: Я родитель по имени Сергей.
introduceFamilyMember($child);  // Вывод: Я ребенок по имени Анна.

Классы Parent и Child реализуют интерфейс FamilyMember и предоставляют свою версию метода introduce. Метод introduceFamilyMember принимает объекты, которые реализуют интерфейс FamilyMember. Это позволяет использовать объекты и класса Parent, и класса Child. Таким образом, мы видим, как с помощью интерфейса можно достичь полиморфизма, позволяя различным классам реализовывать один и тот же метод с разной логикой.

Абстракция — ещё один принцип ООП, фокусирующийся на конкретных свойствах и методах системы, которые важны для выполнения какой-либо задачи, а менее существенное отбрасывается.

У каждого из нас есть родители, которые обучают нас основам поведения. Благодаря им мы учимся ходить и говорить, у них же перенимаем какие-то ценности. Всё это можно поделить на атрибуты и поведение, присущие любому человеку с самого детства. Это некая абстракция, каким должен быть человек. То есть получается, что есть некий каркас человека, состоящий из минимального набора атрибутов и поведения.

Также в психологии существует такое понятие, как абстрагирование — сознательное отключение от внешнего мира, чтобы сосредоточится на чём-то более важном, на внутренних процессах. Так нервная система человека приходит в состояние покоя, и он может оценить происходящее более объективно, без эмоциональной окраски.

Представим каркас человека в виде кода абстрактного класса:

<?php

abstract class AbstractHuman
{
    // имя
    protected $name;

    // возраст
    protected $age;

    // дата рождения
    protected $birthday;

    // пол
    protected $gender;

    // цвет глаз
    protected $eye_color;

    // цвет волос
    protected $hair_color;

    // конструктор
    public function __construct(
        $name, 
        $age, 
        $birthday, 
        $gender, 
        $eye_color, 
        $hair_color
    ) {
        $this->name = $name;
        $this->age = $age;
        $this->birthday = $birthday;
        $this->gender = $gender;
        $this->eye_color = $eye_color;
        $this->hair_color = $hair_color;
    }

    // говорить
    abstract public function speak($message);

    // слушать
    abstract public function listen($message);

    // есть
    abstract public function eat($food);

    // ходить
    abstract public function walk($destination);

    // думать
    abstract public function think($thought);

    // и другие методы, которыми владеет каждый человек
}

Наши родители тоже обладают минимальным набором атрибутов и поведения. Пока растём, мы пользуемся тем, что они в нас заложили, и пользуемся этим так, как нам объяснили. По сути, мы перенимаем от них и атрибуты (которые могут полностью совпасть, а могут быть уникальными), и некоторые социальные навыки (в том виде, в котором ими владеют наши родители). Но перенимаем не полностью — мы всего лишь берём основы и развиваем их на свой лад.

И вот мы подошли к ещё одному из принципов ООП наследованию. Тот самый механизм системы, который позволяет классам наследовать атрибуты и поведение других классов для дальнейшего использования, для расширения или модификации. Класс, от которого производится наследование, называют базовым (или родительским), а новый класс — потомком (или наследником). Всё как у людей.

Давайте посмотрим, как может выглядеть родительский класс в коде:

<?php

class Parents extends AbstractHuman implements SocietyInterface
{
    // профессия
    private $profession;

    // фамилия
    protected $surname;

    // семейные ценности
    protected $familyValues;

    // религия
    protected $religion;

    // национальность
    protected $nationality;

    public function __construct(
        $name,
        $age,
        $birthday,
        $gender,
        $eye_color,
        $hair_color,
        $profession,
        $surname,
        $familyValues,
        $religion,
        $nationality
    ) {
        parent::__construct($name, $age, $birthday, $gender, $eye_color, $hair_color);
        $this->profession = $profession;
        $this->surname = $surname;
        $this->familyValues = $familyValues;
        $this->religion = $religion;
        $this->nationality = $nationality;
    }

    public function speak($message) {
        echo "$this->name говорит: $message\n";
    }

    public function listen($message) {
        echo "$this->name слушает: $message\n";
    }

    public function eat($food) {
        echo "$this->name ест: $food\n";
    }

    public function walk($destination) {
        echo "$this->name идет в: $destination\n";
    }

    public function think($thought) {
        echo "$this->name думает: $thought\n";
    }

    // Реализация методов интерфейса SocietyInterface
    public function communicate($message) {
        echo "$this->name общается: $message\n";
    }

    public function write($text) {
        echo "$this->name пишет: $text\n";
    }

    public function read($text) {
        echo "$this->name читает: $text\n";
    }

    public function learn($topic) {
        echo "$this->name изучает: $topic\n";
    }

    public function introduce($name) {
        return "Меня зовут {$this->name}, я {$this->profession}, фамилия: {$this->surname}.";
    }
}

На примере видно, что класс Parents это потомок абстрактного класса AbstractHuman, в котором как раз содержится минимальный набор атрибутов и поведения человека. То есть у каждого объекта класса Parents будет свой набор атрибутов, разные имена и возраст, пол, дата рождения, цвет глаз и волос. И даже реализация методов (писать, читать и обучаться) может быть абсолютно разной. У кого-то красивый и разборчивый почерк, а у кого-то не очень, кто-то читает бегло, а кто-то медленно, кто-то схватывает информацию сразу же, а кому-то необходимо подольше посидеть над задачей.

А теперь посмотрим, как будет выглядеть класс ребёнка в коде:

<?php

class Children extends Parents
{
    private $favoriteToy;

    public function __construct(
        $name,
        $age,
        $birthday,
        $gender,
        $eye_color,
        $hair_color,
        $profession,
        $surname,
        $family_values,
        $religion,
        $nationality,
        $favoriteToy) {
        parent::__construct(
            $name,
            $age,
            $birthday,
            $gender,
            $eye_color,
            $hair_color,
            $profession,
            $surname,
            $family_values,
            $religion,
            $nationality);
        $this->favoriteToy = $favoriteToy;
    }

    public function play() {
        echo "$this->name играет с игрушкой: {$this->favoriteToy}\n";
    }
}

По мере взросления у человека могут меняться как атрибуты, так и поведение. Но есть неизменные вещи, на которые не может повлиять ни сам человек, ни социум:  национальность, дата рождения. Также есть и изменяемые, приватные характеристики, которые невозможно определить, просто взглянув на человека со стороны, но которые человек может изменить сам. Либо на них может повлиять общество, например религия, социальная группа, к которой принадлежит человек, семейные ценности. В программировании такое явление называется инкапсуляцией. Это сокрытие данных от внешнего мира в некой оболочке, которой в этом случае выступает класс.

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

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

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

Мир вокруг нас постоянно меняется, как и требования к человеку. Нам приходится постоянно приспосабливаться к новым реалиям жизни. Иногда в процессе адаптации мы приобретаем какие-то чужие особенности поведения — а в программу копируют чужой код, или, как говорят в программировании, вставляют «костыли». Всё это может привести к поломкам в программе или внутри человека. В программировании такие поломки называются багом, а в психологии человека — психологической травмой, проблемой. В обоих примерах для выявления причины поломки или некорректного поведения нужен анализ, отладка. Тот самый баг необходимо воспроизвести в контролируемой среде, проанализировать и локализовать проблему для последующего исправления. Для человека такой средой может стать кабинет психолога, который, как дебаггер (отладчик), поможет всё проанализировать, выявить причину душевной поломки и её исправить.

Заключение

Из примеров, которые мы рассмотрели, видно, что в психологии человека и объектно-ориентированном программировании много общего: от названия каких-либо принципов до ожидаемого поведения. Иными словами, ООП в психологии — это некий аналог процессов программирования, которые происходят в человеке и с человеком. Такой подход даёт возможность иначе взглянуть на индивидуальные особенности и поведение человека. Понимание того, что человек — это объект с уникальными характеристиками, эмоциями и собственным опытом, помогает глубже проанализировать его внутреннее состояние и внешнее поведение, учитывая также влияние социальных и культурных норм.

Применение ООП в психологии позволяет более точно моделировать психологические процессы и создавать персонализированные методы терапии, что помогает расширить горизонты изучения психологии и повысить эффективность психотерапии.


Пишите в комментариях свои мысли по поводу ООП, а если есть вопросы — задавайте. Буду рада обсудить.?  

Комментарии (17)


  1. GospodinKolhoznik
    27.01.2025 11:56

    Удачное сравнение, мне нравится, хорошо передаёт суть ООП. Говорить и слушать собеседника это методы, поведение которых зависит не только от того, что сказал собеседник, но и от того, какое в данный момент состояние у объёкта слушатель - буквально что у него внутри - насколько он голоден, сколько он до этого выпил, какой у него гормональный фон и тому подобное. И в зависимоти от этого состояния объекта слушатель, результат выполнения его метода "слушать" варьируется от глубоко поблагодарит до бросится драться с кулаками. И действительно предсказуемость его поведения во многом похожа на предсказуемость поведения методов в ООП.


    1. Dhwtj
      27.01.2025 11:56

      Мне совсем не нравится когда поведение объекта или субъекта зависит от его настроения)


      1. MikeHail
        27.01.2025 11:56

        Вы его rm -rf боитесь?


  1. jhoag
    27.01.2025 11:56

    Вы немного путаете причину и следствие. Не человек подобен языку программирования, а язык человеку. Это естественно: языки создаются людьми и неизбежно наследуют особенности человеческой психики, с одной стороны, и объективной реальности, с другой. Но язык программирования на фоне психики — скудная формализация, примитив, и рассмотрение психики через призму такого примитива не поможет её изучению. Вы провели занятную аналогию, но, боюсь, не более.


    1. SpiSaSha Автор
      27.01.2025 11:56

      Никто и не говорит о том, что человек подобен языку программирования. Конечно все языки изобрел человек, это неоспоримый факт. Слово программирование пришло из информатики, однако по аналогии оно вполне адекватно используется и при описании функционирования мозга.
      В этой статье говорится о подходе, который применяется в обоих дисциплинах. а также приводятся доводы в пользу схожести. Этот подход применяется и не только в психологии, но и во многих других дисциплинах.


  1. Dhwtj
    27.01.2025 11:56

    Абстракция не уникальна для ООП, наследование часто антипатерн, инкапсуляция дырявая, полиморфизм подтипов не самый лучший из вариантов полиморфизма. Остаётся только объединение функций и данных - на любителя: удобней сконцентрировать бизнес логику в одном месте, но сложнее добиться устойчивой, редко изменяемой абстракции

    Функциональное программирование как минимум заслуживает не меньшего внимания


    1. SpiSaSha Автор
      27.01.2025 11:56

      Функциональное программирование не менее интересно, согласна с вами. Однако, в этой статье я не рассматриваю плюсы и минусы того или иного подхода.


      1. Dhwtj
        27.01.2025 11:56

        Всё равно хочу отметить, что абстракция, наследование и полиморфизм есть не только в ООП


  1. domix32
    27.01.2025 11:56

    Ужасный мир, где все мы живём в симуляции написанной на PHP


  1. verls
    27.01.2025 11:56

    тэги поправьте - не 9 минут а 5 минут, и уровень легкий (рука-лицо).

    Вопрос от Зигмунда Фрейда:

    • Как вы относитесь к множественному наследованию?


    1. SpiSaSha Автор
      27.01.2025 11:56

      Это когда слишком много претендентов на одну квартиру? :)


      1. MikeHail
        27.01.2025 11:56

        Шведская семья наверное - много конфессиональная и многонациональная, своеобразный микс.


  1. leahch
    27.01.2025 11:56

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

    Как же хорошо жить в мире, где улитка и человек могут взаимодействовать напрямую, без врапперов, билдеров, промежуточных классов и преобразователей. Где человек может погладить не только кошку или собаку, а улитку, дерево, яблоко, далее - везде и даже наоборот. Где есть функция (погладить one, two). Где данные без лишних манипуляций можно сохранить на диск, вывести в html или передать по сети.

    Где даже сову можно натянуть на глобус, если сова позволяет растягиваться на должный размер :)


    1. gun_dose
      27.01.2025 11:56

      Гладить улитку без враппера - ну такое себе. Про печёночных сосальщиков слышали?


      1. leahch
        27.01.2025 11:56

        Так это же от контекста зависит, передастся, или нет.


  1. randvell
    27.01.2025 11:56

    abstract class AbstractHuman

    abstract public function walk($destination);

    Таким образом мы пришли к тому, что младенец это ЕЩЁ не человек, а пенсионер или человек с физическими ограничениями УЖЕ не человек? Нам ведь нужно реализовать интерфейс в наследниках. Можно, конечно, исключение выкинуть, но тогда код какой-то совсем ломанный выходит.


  1. amazingname
    27.01.2025 11:56

    Хабр который мы все заслужили.