Какую самую главную ошибку совершают новички в ООП?
Начав изучать ООП, многие знакомятся с его тремя столпами: инкапсуляция, наследование и полиморфизм. Но удаётся ли правильно понять все из них?
Если выполнить поиск определения инкапсуляции в Google, то можно получить примерно следующее:
«Инкапсуляция в программировании — это принцип, согласно которому внутреннее устройство сущностей нужно объединять в специальной «оболочке» и скрывать от вмешательств извне.»
А теперь вспомним, что самыми популярными объектно-ориентированными языками программирования являются Java и C#, где модификаторы доступа (
На самом же деле, корректнее привести следующее определение:
«Инкапсуляция – это объединение в рамках одной структуры функций и данных, с которыми эти функции работают.»
То есть, в случае объектно-ориентированного программирования, создав некоторый объект, мы связали его данные с определёнными методами на всё время его жизни.
А в случае, например, обычных функций мы просто описали некий алгоритм, который описывает последовательность действий никак не связанных с некоторым состоянием.
Вот простой пример, чтобы понять разницу:
Начав изучать ООП, многие знакомятся с его тремя столпами: инкапсуляция, наследование и полиморфизм. Но удаётся ли правильно понять все из них?
Если выполнить поиск определения инкапсуляции в Google, то можно получить примерно следующее:
«Инкапсуляция в программировании — это принцип, согласно которому внутреннее устройство сущностей нужно объединять в специальной «оболочке» и скрывать от вмешательств извне.»
А теперь вспомним, что самыми популярными объектно-ориентированными языками программирования являются Java и C#, где модификаторы доступа (
private
, public
, protected
, etc.) это одни из самых используемых ключевых слов. И получается, что начинающие программисты путают сокрытие с инкапсуляцией.На самом же деле, корректнее привести следующее определение:
«Инкапсуляция – это объединение в рамках одной структуры функций и данных, с которыми эти функции работают.»
То есть, в случае объектно-ориентированного программирования, создав некоторый объект, мы связали его данные с определёнными методами на всё время его жизни.
А в случае, например, обычных функций мы просто описали некий алгоритм, который описывает последовательность действий никак не связанных с некоторым состоянием.
Вот простой пример, чтобы понять разницу:
class Doubler
{
private readonly int value;
public Doubler(int value) => this.value = value;
public int Double() => this.value * 2;
}
//…
public int Double(int value) => value * 2;