Ответ 1
Инкапсуляция, вероятно, является самой непонятой концепцией ООП.
Инкапсуляция - это не скрытие данных!
"Инкапсуляция" происходит от "капсулы". Это означает объединение вещей, закрытие их в пакете, а "вещи", о которых мы говорим, - это данные и функции. Программирование без инкапсуляции означает, что функции, относящиеся к данным, "плавают вокруг", где-то в вашем коде, и хотя они обрабатывают ваши данные и даже принимают этот конкретный тип в качестве входных данных, они отделены от ваших данных.
Позвольте мне привести пример, не сосредотачиваясь на "public" и т.п.: если у вас есть класс, который имеет дело со сложными числами, которые имеют реальную и мнимую часть, вы можете просто определить его следующим образом:
class complex {
double real;
double imaginary;
};
При использовании старого стиля pre-encapsulation, который использовался, например, на C, чтобы получить абсолютное значение этого числа, вы бы определили такую функцию:
double absolute(double real, double imaginary);
И это не будет связано с классом вообще! Конечно, вы также можете определить функцию, которая принимает комплексный класс в качестве входных данных, но все равно будет внешней функцией. Таким образом, чтобы использовать его, вам нужно будет сделать это:
complex A;
A.real = 1;
A.imaginary = -3;
и чтобы получить абсолютное значение, вы должны были бы вызвать
absolute(A.real, A.imaginary);
Вместо этого вы можете использовать инкапсуляцию и поместить данные и функции вместе:
class complex {
double real;
double imaginary;
double absolute(); // inside the class, encapsulated into it!
};
а затем, чтобы получить абсолютное значение, вам просто нужно вызвать метод, например
A.absolute();
Это вовсе не требует скрытия данных. Преимущество состоит в том, что код более управляемый, потому что вы можете четко видеть все связанные вещи (то есть данные и функции), сгруппированные вместе, поэтому с первого взгляда вы знаете, что у вас есть (данные) и что вы можете делать с это (методы).
Скрывать информацию было бы невозможно без этого, потому что это означает, что вы ограничиваете доступ к некоторым членам (частным) извне, поэтому вы должны иметь некоторые методы внутри, или вы не сможете ничего сделать с помощью ваши данные!
В то же время скрытие информации помогает эффективно использовать инкапсуляцию: если люди могут получать доступ к данным извне, существует очень большая опасность для других кодеров, которые пишут собственный (не инкапсулированный) код, чтобы иметь дело с вашим данные, которые, по крайней мере, приведут к дублированию кода (т.е. к бесполезным усилиям) и к несоответствиям, если реализации несовместимы. Вместо этого скрытие данных означает, что для доступа к конфиденциальным данным все ДОЛЖНЫ использовать общедоступные методы, которые предоставляются, так что они одинаковы для всех.
Поэтому для скрытия данных требуется инкапсуляция, и в то же время ей помогает скрытие данных. Вместе они работают хорошо, но это не одно и то же!
Вернемся к вашему вопросу: в свете этого определение 1 неверно. И 2, как отмечено CommuSoft, на самом деле не является определением, это правило. И я добавлю, что это правило большого пальца о том, когда использовать скрытие данных, а не инкапсуляцию.
На стороне примечания, electrometro предполагает, что это может быть дубликат этого вопроса. Я думаю, что стоит отметить, что большинство ответов там неверны, включая верхний ответ, который представляет собой пример инкапсуляции, которая фактически является противоположной инкапсуляции.
Если вам нужны внешние ссылки, вот две статьи об этом:
Инкапсуляция не скрывает информацию
Абстракция, инкапсуляция и скрытие информации (обратите внимание, что когда он начинает абзац под названием "ENCAPSULATION" и цитирует множество определений, он просто пытается показать путаницу вокруг этой темы, эти определения неверны, как он объясняет позже!)