11.07.2012, 18:49
|
|
Профессор
|
|
Регистрация: 02.07.2012
Сообщений: 106
|
|
ХВАТИТ ЭТО ТЕРПЕТЬ
|
|
11.07.2012, 18:49
|
Аспирант
|
|
Регистрация: 29.06.2012
Сообщений: 31
|
|
TO Drimogemon:
В вашем примере используется this, что делает свойства Cat'a public (они же теперь открыты всем объектам). PROTECTED похоже в Javascript совсем нет и вроде это не реализовать никак (возможно, я ошибаюсь).
|
|
11.07.2012, 18:51
|
|
Профессор
|
|
Регистрация: 02.07.2012
Сообщений: 106
|
|
Так, видно придется пересылать копипаст сюда. http://javascript.ru/forum/184083-post1.html
Сообщение от Dmitry A. Soshnikov
|
Инкапсуляция
С этой идеей часто возникает путаница и ошибки в восприятии. В данном случае мы будем рассматривать один из удобных “сахаров” некоторых реализаций ООП, — всем известные модификаторы: private, protected и public, которые также называются уровнями (или модификаторами) доступа к характеристикам объектов.
Я хочу выделить и напомнить самый главный момент, касающийся сущности инкапсуляции: инкапсуляция — это усиление абстракции, но никак не параноидальное сокрытие от “злых хакеров”, которые “то и норовят, что-то записать напрямую в поля ваших классов”.
Это самая большая (и распространённая) ошибка — использовать сокрытие ради сокрытия.
Уровни же доступа — private, protected и public — были введены в ряде реализаций ООП исключительно для удобства самого программиста (и действительно, являются достаточно удобным “сахаром” — поэтому и были введены), чтобы более абстрактно представлять и описывать систему.
Наиболее хорошо, это можно видеть в некоторых реализациях (опять же, в тех же Python’e и Ruby). С одной стороны (в Python), это __private и _protected свойства (определяются именованием через ведущие подчёркивания) и не доступны снаружи. С другой стороны, Python просто переименовывает такие поля определённым образом (_ИмяКласса__имя_поля), и под этим именем они уже доступны снаружи.
Или в Ruby: с одной стороны, есть возможность определять private и protected характеристики, с другой стороны, так же есть ряд методов (например, instance_variable_get, instance_variable_set, send и т.д.), позволяющих получить доступ к инкапсулированным данным.
Основная причина: программист сам, сознательно хочет получить доступ к инкапсулированным (обратите внимание, я специально не использую термин “скрытым”) данным. А значит, если они будут как-то неверно изменены или будет какая-то ошибка, то в ответе за это полностью и осознанно программист, а не просто “опечатка” или “кто-то случайно изменил какое-то поле”. Однако в частых подобных случаях, всё-таки, есть смысл говорить о плохом стиле программирования.
Основной же ролью инкапсуляции, повторим, является абстрагирование от пользователя вспомогательных сущностей и никак не “способ обезопасить объект от хакеров”. Для безопасности программного обеспечения применяются куда более серьёзные меры, нежели модификатор “private”.
Инкапсулирия вспомогательные (локальные) объекты, мы обеспечиваем возможность дальнейших изменений поведения public-интерфейса с минимумом затрат, локализуя и прогнозируя места этих изменений. И именно в этом заключается главная суть инкапсуляции.
Так же важной задачей сеттера является абстрагирование сложных вычислений. Например, сеттер element.innerHTML — мы просто абстрактно говорим — “теперь html этого элемента будет таким”, в то время, как внутри функции-сеттера для свойства innerHTML будут сложные вычисления и проверки. Здесь речь идёт об абстракции, но инкапсуляция, как усиление её — имеет место быть.
Само же понятие инкапсуляции может и не быть связано с ООП. Так, например, в качестве инкапсулирующей сущности может выступать и обычная функция, которая инкапсулирует в себе различные вычисления, делая использование её абстрактным (пользователю не важно знать, как реализована, к примеру, функция Math.round(…), он просто её вызывает). Это — есть инкапсуляция реализации и, обратите внимание, ни о каких private, protected, public в этом моменте речи не идёт.
|
|
|
11.07.2012, 18:53
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от almac
|
В вашем примере используется this, что делает свойства Cat'a public (они же теперь открыты всем объектам). PROTECTED похоже в Javascript совсем нет и вроде это не реализовать никак (возможно, я ошибаюсь).
|
function Car(speed)
{
var a=10;
this.getSpeed=function(){ return a};
this.setSpeed=function(){ a=20};
}
var car = new Car(100);
alert(car.getSpeed())
car.setSpeed()
alert(car.getSpeed())
alert(car.a)
|
|
11.07.2012, 18:53
|
|
Профессор
|
|
Регистрация: 02.07.2012
Сообщений: 106
|
|
almac,
то есть ты либо совсем не понимаешь че такое модификаторы доступа и зачем они нужны, либо притворяешься. если не понмиаешь то я могу обьяснить своими словами.
dmitriymar,
теперь сделай мне с этим дерьмом наследование?
п.с. вот сахарная обертка на ооп в javascript
https://github.com/Livanderiamarum/O...ster/README.md
Последний раз редактировалось Drimogemon, 11.07.2012 в 18:55.
|
|
11.07.2012, 18:58
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от Drimogemon
|
dmitriymar,
теперь сделай мне с этим дерьмом наследование?
|
да ты даун полный. Тудаже к чтению Стоянова Шаблоны Javascript.
Там всё это есть -в том где ты корчишь из себя умника а на самом деле тупишь не по детски. И если ты не читал эту книгу -то это только твоя проблема,но никак не моя.
ты -ТУПОРЕЗ ТРОЛЬ-ЭТО АКСИОМА
|
|
11.07.2012, 19:00
|
Аспирант
|
|
Регистрация: 29.06.2012
Сообщений: 31
|
|
Сообщение от Drimogemon
|
Инкапсулирия вспомогательные (локальные) объекты, мы обеспечиваем возможность дальнейших изменений поведения public-интерфейса с минимумом затрат, локализуя и прогнозируя места этих изменений. И именно в этом заключается главная суть инкапсуляции.
|
Вот тут! Все верно!
Само собой, если переменная только для чтения, то используем простой геттер, и просто НЕОБХОДИМО использовать "скрытие" переменной. Если же можно использовать и геттер, и сеттер, то тут вроде можно и не писать эти "лишние" методы get и set, но это правило хорошего тона.
|
|
11.07.2012, 19:04
|
|
Профессор
|
|
Регистрация: 02.07.2012
Сообщений: 106
|
|
almac,
инкапсуляция в javascript достигается пространством имен _
и люди знают что если свойство начинается с _ то оно внутреннее.
обычно даже итерируют свойства так:
for ( key in obj ) if( key.indexOf('_') !== 0 ){
}
(если итератор не поедусмотрен интерфейсом обьекта конечно)
Конструкторы же объектов принято называть с Заглавной буквы. Javascript очень динамичный язык(хорошо это или нет), по этому в нем много возможностей и много договоренностей.
Сообщение от dmitriymar
|
да ты даун полный. Тудаже к чтению Стоянова Шаблоны Javascript.
Там всё это есть -в том где ты корчишь из себя умника а на самом деле тупишь не по детски. И если ты не читал эту книгу -то это только твоя проблема,но никак не моя.
ты -ТУПОРЕЗ ТРОЛЬ-ЭТО АКСИОМА
|
Я попросил сделать с этим говном наследование, а опять слышу кулстори за место аргументов.
Последний раз редактировалось Drimogemon, 11.07.2012 в 19:10.
|
|
11.07.2012, 19:12
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от Drimogemon
|
Я попросил сделать с этим говном наследование, а опять слышу кулстори за место аргументов.
|
Да какого я должен тебе чтото писать,если тебе в западло достать книжку и почитать самому?
|
|
11.07.2012, 19:14
|
Аспирант
|
|
Регистрация: 29.06.2012
Сообщений: 31
|
|
TO Drimogemon: ну и зачем вы так с людьми? не надо нас так люто ненавидеть... я про все ваши сообщения, которые не касаются javascript
|
|
|
|