0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В терминологии ООП творится довольно серьёзная путаница. Она возникает в первую очередь из-за того, что многие программируют либо на одном языке, либо если и на разных, то часто схожих по структуре языках. Соответственно, происходит профессиональная деформация, когда программист видит мир сквозь призму одного языка. Одна из таких историй происходит вокруг инкапсуляции и сокрытия данных (data hiding). Напомню, что сокрытие данных - подход, при котором нельзя изменить данные напрямую, в обход интерфейса, тем самым нарушив инварианты (такое происходит не всегда). Есть языки, в которых присутствует сокрытие данных, например, Haskell, но нет инкапсуляции. В ООП сокрытие данных появляется благодаря двум возможностям:</p>
1
<p>В терминологии ООП творится довольно серьёзная путаница. Она возникает в первую очередь из-за того, что многие программируют либо на одном языке, либо если и на разных, то часто схожих по структуре языках. Соответственно, происходит профессиональная деформация, когда программист видит мир сквозь призму одного языка. Одна из таких историй происходит вокруг инкапсуляции и сокрытия данных (data hiding). Напомню, что сокрытие данных - подход, при котором нельзя изменить данные напрямую, в обход интерфейса, тем самым нарушив инварианты (такое происходит не всегда). Есть языки, в которых присутствует сокрытие данных, например, Haskell, но нет инкапсуляции. В ООП сокрытие данных появляется благодаря двум возможностям:</p>
2
<ul><li>инкапсуляции</li>
2
<ul><li>инкапсуляции</li>
3
<li>области видимости свойств</li>
3
<li>области видимости свойств</li>
4
</ul><p><em>Однако учтите, в литературе часто отождествляют термины инкапсуляция и сокрытие данных. Поэтому не пугайтесь, если многие вокруг вас будут утверждать, что инкапсуляция - это про сокрытие данных (защиту), но даже не вспомнят про объединение функций и данных в рамках одной структуры.</em></p>
4
</ul><p><em>Однако учтите, в литературе часто отождествляют термины инкапсуляция и сокрытие данных. Поэтому не пугайтесь, если многие вокруг вас будут утверждать, что инкапсуляция - это про сокрытие данных (защиту), но даже не вспомнят про объединение функций и данных в рамках одной структуры.</em></p>
5
<p>Достаточно изменить ключевое слово public на private у любого свойства, как пропадёт возможность обращаться к нему напрямую снаружи объекта.</p>
5
<p>Достаточно изменить ключевое слово public на private у любого свойства, как пропадёт возможность обращаться к нему напрямую снаружи объекта.</p>
6
<p>Подчеркну, что речь идёт именно о доступе снаружи. Внутри он должен остаться, иначе как мы сможем оперировать этим свойством?</p>
6
<p>Подчеркну, что речь идёт именно о доступе снаружи. Внутри он должен остаться, иначе как мы сможем оперировать этим свойством?</p>
7
<p>Сокрытие данных считается важным атрибутом любой абстракции, независимо от того, работаем мы в ООП-стиле, или нет. Именно по этой причине существуют геттеры. В ООП, построенном на классах, вообще не принято обращаться к свойствам напрямую. Геттеры - первое, что реализуется при описании любого нового класса. Кстати, в языке Ruby нельзя (один способ есть, но он выходит за рамки обсуждаемой темы) обратиться к свойству объекта без геттера, но описываются они там значительно проще и компактнее, чем в таких языках, как PHP или Java, и выглядят как обращения к свойствам (в Ruby можно не ставить скобки при вызове функций). То же самое касается и сеттеров. Свойства напрямую не редактируют, так как потенциально можно нарушить инварианты.</p>
7
<p>Сокрытие данных считается важным атрибутом любой абстракции, независимо от того, работаем мы в ООП-стиле, или нет. Именно по этой причине существуют геттеры. В ООП, построенном на классах, вообще не принято обращаться к свойствам напрямую. Геттеры - первое, что реализуется при описании любого нового класса. Кстати, в языке Ruby нельзя (один способ есть, но он выходит за рамки обсуждаемой темы) обратиться к свойству объекта без геттера, но описываются они там значительно проще и компактнее, чем в таких языках, как PHP или Java, и выглядят как обращения к свойствам (в Ruby можно не ставить скобки при вызове функций). То же самое касается и сеттеров. Свойства напрямую не редактируют, так как потенциально можно нарушить инварианты.</p>