Просмотр полной версии : private vs public
Хочется сделать private переменные с возможностью наследования, но я не знаю как.. Вот какая есть идея:
function Car(speed) { // локальная переменная speed
}
Car.prototype.getSpeed = function() {
return speed;
}
var car = new Car(100);
car.getSpeed();//undefined, так как переменная speed не видна прототипу
Как реализовать private переменную с public методами get и set, потипу как в других языках программирования (Java, C++) ? Желательно через прототипы конечно же.
dmitriymar
11.07.2012, 18:27
Хочется сделать private переменные с возможностью наследования, но я не знаю как.. Вот какая есть идея:
через замыкание это делается и прототип незачем расширять
http://www.ozon.ru/context/detail/id/6287517/
там всё. и ответы на прежде заданные вопросы и на те что ещё попытаетесь задать...
Drimogemon
11.07.2012, 18:32
используй это
https://github.com/Livanderiamarum/OOPjavascript/blob/master/README.md
п.с. а можно вопрос, зачем тебе приватные нужны?
то есть покажи пример их использования, мне просто интересно
через замыкание это делается и прототип незачем расширять
Выходит, что только через создание функции-замыкания я смогу реализовать такое? Например:
function Car(speed) { // локальная переменная speed
this.getSpeed = function() {
return speed;
}
}
Я правильно понял?
Drimogemon
11.07.2012, 18:35
Я правильно понял?
да, но вопрос тот же, зачем тебе приватные?
dmitriymar
11.07.2012, 18:37
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())
Drimogemon
11.07.2012, 18:39
Хочется сделать private переменные с возможностью наследования
Приветные с возможностью наследования это ПРОТЕКТЕД. в javascruot принято такие называть с жесткого пробела для усиления инкапсуляции.
function Cat (){
this._protected = 10;
this.public = function(){
alert( this._protected )
}
}
п.с. а можно вопрос, зачем тебе приватные нужны?
то есть покажи пример их использования, мне просто интересно
ООП строится на 4ех принципах: инкапсуляция, агрегация, наследование, полиморфизм. Скрытие данных - это и есть инкапсуляция, я считаю что действительно не нужно открывать доступ к переменным\данным, которые используются по-своему внутри объекта.
Пример: кот , у кота есть имя. Можно было бы записать кот.имя чтобы его получить, но исходя из логики запроса нам надо просто получить имя: нужен публичный метод "получитьИмя". Причем внутри метода возможно будет "своя" специфичная логика (может получиться так, что нужно не просто вернуть имя внутри метода, но и инициализировать какую нибудь переменную, например).
Вобщем, инкапсуляция нужна в ООП.
Drimogemon
11.07.2012, 18:45
Скрытие данных - это и есть инкапсуляция
сразу видно нуба http://javascript.ru/forum/184083-post1.html
dmitriymar
11.07.2012, 18:47
Drimogemon,
а сам то ты кто? нуб неадекватный. сколько уже твоих аков здесь забанили?
Drimogemon
11.07.2012, 18:49
ХВАТИТ ЭТО ТЕРПЕТЬ
TO Drimogemon:
В вашем примере используется this, что делает свойства Cat'a public (они же теперь открыты всем объектам). PROTECTED похоже в Javascript совсем нет и вроде это не реализовать никак (возможно, я ошибаюсь).
Drimogemon
11.07.2012, 18:51
Так, видно придется пересылать копипаст сюда. http://javascript.ru/forum/184083-post1.html
Инкапсуляция
С этой идеей часто возникает путаница и ошибки в восприятии. В данном случае мы будем рассматривать один из удобных “сахаров” некоторых реализаций ООП, — всем известные модификаторы: 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 в этом моменте речи не идёт.
dmitriymar
11.07.2012, 18:53
В вашем примере используется 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)
Drimogemon
11.07.2012, 18:53
almac,
то есть ты либо совсем не понимаешь че такое модификаторы доступа и зачем они нужны, либо притворяешься. если не понмиаешь то я могу обьяснить своими словами.
dmitriymar,
теперь сделай мне с этим дерьмом наследование?
п.с. вот сахарная обертка на ооп в javascript
https://github.com/Livanderiamarum/OOPjavascript/blob/master/README.md
dmitriymar
11.07.2012, 18:58
dmitriymar,
теперь сделай мне с этим дерьмом наследование?
да ты даун полный. Тудаже к чтению Стоянова Шаблоны Javascript.
Там всё это есть -в том где ты корчишь из себя умника а на самом деле тупишь не по детски. И если ты не читал эту книгу -то это только твоя проблема,но никак не моя.
ты -ТУПОРЕЗ ТРОЛЬ-ЭТО АКСИОМА
Инкапсулирия вспомогательные (локальные) объекты, мы обеспечиваем возможность дальнейших изменений поведения public-интерфейса с минимумом затрат, локализуя и прогнозируя места этих изменений. И именно в этом заключается главная суть инкапсуляции.
Вот тут! Все верно!
Само собой, если переменная только для чтения, то используем простой геттер, и просто НЕОБХОДИМО использовать "скрытие" переменной. Если же можно использовать и геттер, и сеттер, то тут вроде можно и не писать эти "лишние" методы get и set, но это правило хорошего тона.
Drimogemon
11.07.2012, 19:04
almac,
инкапсуляция в javascript достигается пространством имен _
и люди знают что если свойство начинается с _ то оно внутреннее.
обычно даже итерируют свойства так:
for ( key in obj ) if( key.indexOf('_') !== 0 ){
}
(если итератор не поедусмотрен интерфейсом обьекта конечно)
Конструкторы же объектов принято называть с Заглавной буквы. Javascript очень динамичный язык(хорошо это или нет), по этому в нем много возможностей и много договоренностей.
да ты даун полный. Тудаже к чтению Стоянова Шаблоны Javascript.
Там всё это есть -в том где ты корчишь из себя умника а на самом деле тупишь не по детски. И если ты не читал эту книгу -то это только твоя проблема,но никак не моя.
ты -ТУПОРЕЗ ТРОЛЬ-ЭТО АКСИОМА
Я попросил сделать с этим говном наследование, а опять слышу кулстори за место аргументов.
dmitriymar
11.07.2012, 19:12
Я попросил сделать с этим говном наследование, а опять слышу кулстори за место аргументов.
Да какого я должен тебе чтото писать,если тебе в западло достать книжку и почитать самому?
TO Drimogemon: ну и зачем вы так с людьми? не надо нас так люто ненавидеть... я про все ваши сообщения, которые не касаются javascript
dmitriymar
11.07.2012, 19:15
almac,
это его шестая или более попытка прижиться на форуме,все прежние под бан попадали-так что его бан это вопрос времени.
Drimogemon
11.07.2012, 19:23
ну и зачем вы так с людьми? не надо нас так люто ненавидеть... я про все ваши сообщения, которые не касаются javascript
вы видно перепутали ник и хотели обратиться к dmitriymar ?
я про все ваши сообщения, которые не касаются javascript
и можно примерчик его таких сообщений)? я пока только одно насчитал где он оскорбляет меня, есть еще примеры)?
п.с. еще раз повторюсь ВОТ лучшая реализация ООП на javascript
https://github.com/Livanderiamarum/OOPjavascript/blob/master/README.md
лучшая по всем параметрам
В Джаваскрипте нет собственной поддержки приватных методов.
В примере dmitriymar'а приватные переменные определяются внутри конструктора. При этом они недоступны снаружи конструктора, однако, на мой взгляд, в этом подходе есть недостаток: все методы, которые должны иметь доступ к приватным переменным, должны создаваться для каждого экземпляра класса вместо одного метода в прототипе.
Поэтому подход Drimogemon'а кажется мне более рациональным: использовать определённые конвенции для отделения приватных и публичных методов, например имена приватных методах начинать с символов "_".
dmitriymar
11.07.2012, 19:43
oneguy,
неужто вы думаете что существует один шаблон наследования? Выбор большой шаблонов и у каждого свои возможности
Ещё не забывайте, что в Джаваскрипте есть собственная поддержка свойств доступа. Поэтому вместо этого:
function Car(speed) {
this._speed=speed;
}
Car.prototype.getSpeed=function () {
alert("Скорость: "+this._speed);
return this._speed;
};
Car.prototype.setSpeed=function (v) {
this._speed=v;
alert("Скорость установлена на "+v);
};
var car = new Car(100);
car.setSpeed(car.getSpeed()+1)
гораздо удобнее работать с этой реализацией Car:
function Car(speed) {
this._speed=speed;
}
Car.prototype={
get speed() {
alert("Скорость: "+this._speed);
return this._speed;
},
set speed(v) {
this._speed=v;
alert("Скорость установлена на "+v);
}
};
var car = new Car(100);
car.speed++;
oneguy,
неужто вы думаете что существует один шаблон наследования? Выбор большой шаблонов и у каждого свои возможности
Да, естественно. Однако я хотел сказать, что шаблон, предложенный вами не нужно использовать для довольно общей задачи с приватными и публичными методами.
Drimogemon
11.07.2012, 20:18
Однако я хотел сказать, что шаблон, предложенный вами не нужно использовать
Конечно не нужно использовать, сравнить это хотя бы с моей реализацией ООП. Которая кстати самая лучшая из существующих.
Да вы даже посмотрите как обьекты созданные классами выгладят в консоли, МАКСИМАЛЬНАЯ ОПТИМИЗАЦИЯ,
использование делегации НА ВСЮ КАТУШКУ.
https://github.com/Livanderiamarum/OOPjavascript/blob/master/README.md
vadim5june
11.07.2012, 20:35
Которая кстати самая лучшая из существующих.
Любой фреемворк или программу можно оценить только тогда когда она доходит до стадии практического применения
Вот если Вы сделаете у себя виджеты-интерфейсы UI и какуюто страницу примеров с такими базовыми классами как
окна табы слайдеры итд только тогда можно сравнивать и говорить чье лучше
А пока по вашим программам даже сказать нечего-все на очень ранней стадии и возможно из этой стадии и выходить не собирается
dmitriymar
11.07.2012, 21:13
Однако я хотел сказать, что шаблон, предложенный вами не нужно использовать для довольно общей задачи с приватными и публичными методами.
это то причём? вопрос был о приватности -возможно или нет-показал один из шаблонов,причём о наследовании в том момент речь не шла
Drimogemon
11.07.2012, 21:39
А пока по вашим программам даже сказать нечего-все на очень ранней стадии и возможно из этой стадии и выходить не собирается
не понял, как им образом создание виджетов (на чем я кстати и тестировал этот шаблон ООП) связано с его качеством, качество может каждый оценить протевтировав САМ. Уже по примерам по ссылке должно быть понятно как удобно и сахарно стало работать с ООП. Создай видежты себе сам используя это и другие реализации ООП, и сравни где было удобнее.
vadim5june
11.07.2012, 22:40
Создай видежты себе сам используя это и другие реализации ООП, и сравни где было удобнее.
В этом нет никакого смысла потому что у тебя нет вообще никаких средств для работы с HTML элементами
vadim5june,
создать классы для работы с HTML :p
vadim5june
11.07.2012, 23:01
vadim5june,
создать классы для работы с HTML :p
Ну так это Maximaximus должен создавать раз фреемворк пишет
а он не хочет
vadim5june,
пускай создает=)
Drimogemon
12.07.2012, 00:10
В этом нет никакого смысла потому что у тебя нет вообще никаких средств для работы с HTML элементами
И как это я не додумался в обертку в ООП на javascript засунуть функции для работы с HTML элементами...
Щас смотрю, и ведь действительно ни одной нет. Проглядел.., спасибо добавим.
http://cs10581.userapi.com/v10581055/a2f/0OR2Fq_oZHg.jpg
Ну так это Maximaximus должен создавать раз фреемворк пишет
какой фреймворк я пишу? это идеома ООП, шаблон добавляющий удобное прототипное наследование в javascript.
каким образом это вообще должно быть связанно с чем-то кроме наследования на javascript ?
Ты вообще понимаешь что такое ООП что такое идеома и что такое паттерн и что такое фреймворк?
Drimogemon
12.07.2012, 00:37
как мы понимаем суть классов это повторное использование кода, в классе Виджет я описываю логику построения всех виджетов, в дочерних классах Кнопка и Лампа, я описываю только свойственную им логику, а логику построения виджета наследую от класса Виджет. КЭП.
<body></body>
<script>
var Widget = new Class( function ( parent ) {
this.HTMLElement = null;
this.__construct = function ( w, h, color ) {
this.HTMLElement = document.createElement( 'div' );
this.HTMLElement.style.position = 'relative';
this.HTMLElement.style.width = w + 'px';
this.HTMLElement.style.height = h + 'px';
this.HTMLElement.style.backgroundColor = color;
document.body.appendChild( this.HTMLElement );
};
} );
var Button = new Class( Widget, function ( parent ) {
this.action = null;
this.onclick = function () {if ( this.action )this.action()};
this.__construct = function ( w, h, color ) {
parent.__construct.call( this, w, h, color );
this.HTMLElement.onclick = this.onclick.bind( this );
};
} );
var Lamp = new Class( Widget, function ( parent ) {
this.state = false;
this.onColor = '';
this.offColor = '';
this.toggle = function () {
this.state = !this.state;
this.HTMLElement.style.backgroundColor = this[this.state ? 'onColor' : 'offColor'];
};
this.__construct = function ( size, onColor, offColor ) {
parent.__construct.call( this, size, size, offColor );
this.HTMLElement.style.borderRadius = size / 2 + 'px';
this.onColor = onColor;
this.offColor = offColor;
};
} );
var lamp = new Lamp( 100, '#ccc', '#444' );
var button = new Button( 100, 50, '#040' );
button.action = lamp.toggle.bind( lamp );
// собственно сама функция которая позволяет вытворять все эти чудеса
function Class( a, b ) {
var description = b ? b : a;
var superClass = b ? a : b;
var constructor = function () {if ( this['__construct'] )this['__construct'].apply( this, arguments )};
description.prototype = Object.create( superClass ? superClass.prototype : Class.base ? Class.base.prototype : Object.prototype );
constructor.prototype = new description( description.prototype );
return constructor;
}
</script>
vadim5june
12.07.2012, 09:59
какой фреймворк я пишу? это идеома ООП, шаблон добавляющий удобное прототипное наследование в javascript.
каким образом это вообще должно быть связанно с чем-то кроме наследования на javascript ?
Понятно... тогда интерес к теме пропал
это то причём? вопрос был о приватности -возможно или нет-показал один из шаблонов,причём о наследовании в том момент речь не шла
Так я ничего не имею против вашего сообщения. Я лишь добавил своё замечание. Вы с моим утверждением-то согласны?
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot