Привет, Хабр, меня зовут Александра, я программист в отделе разработки серверных решений Ю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"; } }
По мере взросления у человека могут меняться как атрибуты, так и поведение. Но есть неизменные вещи, на которые не может повлиять ни сам человек, ни социум: национальность, дата рождения. Также есть и изменяемые, приватные характеристики, которые невозможно определить, просто взглянув на человека со стороны, но которые человек может изменить сам. Либо на них может повлиять общество, например религия, социальная группа, к которой принадлежит человек, семейные ценности. В программировании такое явление называется инкапсуляцией. Это сокрытие данных от внешнего мира в некой оболочке, которой в этом случае выступает класс.
В психологии тоже есть такое понятие. Человек сосредотачивается на своих внутренних переживаниях и фантазиях в ущерб реальной жизни и взаимодействию с социумом. В основном такое поведение встречается у детей и подростков, особенно у тех, кому не хватает внимания родителей. К этому состоянию подталкивают какие-то сильные стрессы или переживания, например потеря близкого. Психика человека просто не готова к сильным потрясениям, и срабатывает защитный механизм, происходит эмоциональное и психическое отстраивание от внешнего мира.
Непроработанная психологическая инкапсуляция может привести к потере социальных навыков, ухудшению самооценки, отношений с родственниками и другими людьми. Также это создаёт препятствие для личностного роста и развития и в итоге приводит к стагнации, депрессии и неудовлетворённости жизнью. Но всё это можно проработать и исправить.
В наших примерах из кода изменить приватные атрибуты или получить их значения можно с помощью методов, которые называются сеттеры и геттеры. Для получения или обновления информации о том или ином приватном свойстве можно дополнительно добавив валидацию данных. В программировании это может быть валидация на тип данных или проверка на диапазон и ограничения, а также проверка на уникальность и так далее. У человека валидатором в общении с людьми могут выступать семейные ценности, образование, профессия, взгляды и убеждения.

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