Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   private vs public (https://javascript.ru/forum/misc/29797-private-vs-public.html)

almac 11.07.2012 18:21

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

Цитата:

Сообщение от almac
Хочется сделать private переменные с возможностью наследования, но я не знаю как.. Вот какая есть идея:

через замыкание это делается и прототип незачем расширять
http://www.ozon.ru/context/detail/id/6287517/
там всё. и ответы на прежде заданные вопросы и на те что ещё попытаетесь задать...

Drimogemon 11.07.2012 18:32

используй это
https://github.com/Livanderiamarum/O...ster/README.md

п.с. а можно вопрос, зачем тебе приватные нужны?
то есть покажи пример их использования, мне просто интересно

almac 11.07.2012 18:33

Цитата:

Сообщение от dmitriymar
через замыкание это делается и прототип незачем расширять

Выходит, что только через создание функции-замыкания я смогу реализовать такое? Например:

function Car(speed) { // локальная переменная speed
  this.getSpeed = function() {
    return speed;
  }
}

Я правильно понял?

Drimogemon 11.07.2012 18:35

Цитата:

Сообщение от almac
Я правильно понял?

да, но вопрос тот же, зачем тебе приватные?

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

Цитата:

Сообщение от almac
Хочется сделать private переменные с возможностью наследования

Приветные с возможностью наследования это ПРОТЕКТЕД. в javascruot принято такие называть с жесткого пробела для усиления инкапсуляции.


function Cat (){
  this._protected = 10;
  this.public = function(){
    alert( this._protected )
  }
}

almac 11.07.2012 18:43

Цитата:

Сообщение от Drimogemon
п.с. а можно вопрос, зачем тебе приватные нужны?
то есть покажи пример их использования, мне просто интересно

ООП строится на 4ех принципах: инкапсуляция, агрегация, наследование, полиморфизм. Скрытие данных - это и есть инкапсуляция, я считаю что действительно не нужно открывать доступ к переменным\данным, которые используются по-своему внутри объекта.

Пример: кот , у кота есть имя. Можно было бы записать кот.имя чтобы его получить, но исходя из логики запроса нам надо просто получить имя: нужен публичный метод "получитьИмя". Причем внутри метода возможно будет "своя" специфичная логика (может получиться так, что нужно не просто вернуть имя внутри метода, но и инициализировать какую нибудь переменную, например).
Вобщем, инкапсуляция нужна в ООП.

Drimogemon 11.07.2012 18:45

Цитата:

Сообщение от almac
Скрытие данных - это и есть инкапсуляция

сразу видно нуба http://javascript.ru/forum/184083-post1.html

dmitriymar 11.07.2012 18:47

Drimogemon,
а сам то ты кто? нуб неадекватный. сколько уже твоих аков здесь забанили?

Drimogemon 11.07.2012 18:49

ХВАТИТ ЭТО ТЕРПЕТЬ

almac 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
Цитата:

Сообщение от 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 в этом моменте речи не идёт.


dmitriymar 11.07.2012 18:53

Цитата:

Сообщение от 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)

Drimogemon 11.07.2012 18:53

almac,
то есть ты либо совсем не понимаешь че такое модификаторы доступа и зачем они нужны, либо притворяешься. если не понмиаешь то я могу обьяснить своими словами.
dmitriymar,
теперь сделай мне с этим дерьмом наследование?

п.с. вот сахарная обертка на ооп в javascript
https://github.com/Livanderiamarum/O...ster/README.md

dmitriymar 11.07.2012 18:58

Цитата:

Сообщение от Drimogemon
dmitriymar,
теперь сделай мне с этим дерьмом наследование?

да ты даун полный. Тудаже к чтению Стоянова Шаблоны Javascript.
Там всё это есть -в том где ты корчишь из себя умника а на самом деле тупишь не по детски. И если ты не читал эту книгу -то это только твоя проблема,но никак не моя.
ты -ТУПОРЕЗ ТРОЛЬ-ЭТО АКСИОМА

almac 11.07.2012 19:00

Цитата:

Сообщение от Drimogemon
Инкапсулирия вспомогательные (локальные) объекты, мы обеспечиваем возможность дальнейших изменений поведения public-интерфейса с минимумом затрат, локализуя и прогнозируя места этих изменений. И именно в этом заключается главная суть инкапсуляции.

Вот тут! Все верно!
Само собой, если переменная только для чтения, то используем простой геттер, и просто НЕОБХОДИМО использовать "скрытие" переменной. Если же можно использовать и геттер, и сеттер, то тут вроде можно и не писать эти "лишние" методы get и set, но это правило хорошего тона.

Drimogemon 11.07.2012 19:04

almac,
инкапсуляция в javascript достигается пространством имен _
и люди знают что если свойство начинается с _ то оно внутреннее.
обычно даже итерируют свойства так:

for ( key in obj ) if( key.indexOf('_') !== 0 ){

}

(если итератор не поедусмотрен интерфейсом обьекта конечно)

Конструкторы же объектов принято называть с Заглавной буквы. Javascript очень динамичный язык(хорошо это или нет), по этому в нем много возможностей и много договоренностей.



Цитата:

Сообщение от dmitriymar
да ты даун полный. Тудаже к чтению Стоянова Шаблоны Javascript.
Там всё это есть -в том где ты корчишь из себя умника а на самом деле тупишь не по детски. И если ты не читал эту книгу -то это только твоя проблема,но никак не моя.
ты -ТУПОРЕЗ ТРОЛЬ-ЭТО АКСИОМА

Я попросил сделать с этим говном наследование, а опять слышу кулстори за место аргументов.

dmitriymar 11.07.2012 19:12

Цитата:

Сообщение от Drimogemon
Я попросил сделать с этим говном наследование, а опять слышу кулстори за место аргументов.

Да какого я должен тебе чтото писать,если тебе в западло достать книжку и почитать самому?

almac 11.07.2012 19:14

TO Drimogemon: ну и зачем вы так с людьми? не надо нас так люто ненавидеть... я про все ваши сообщения, которые не касаются javascript

dmitriymar 11.07.2012 19:15

almac,
это его шестая или более попытка прижиться на форуме,все прежние под бан попадали-так что его бан это вопрос времени.

Drimogemon 11.07.2012 19:23

Цитата:

Сообщение от almac
ну и зачем вы так с людьми? не надо нас так люто ненавидеть... я про все ваши сообщения, которые не касаются javascript

вы видно перепутали ник и хотели обратиться к dmitriymar ?
Цитата:

Сообщение от almac
я про все ваши сообщения, которые не касаются javascript

и можно примерчик его таких сообщений)? я пока только одно насчитал где он оскорбляет меня, есть еще примеры)?

п.с. еще раз повторюсь ВОТ лучшая реализация ООП на javascript
https://github.com/Livanderiamarum/O...ster/README.md

лучшая по всем параметрам

oneguy 11.07.2012 19:37

В Джаваскрипте нет собственной поддержки приватных методов.
В примере dmitriymar'а приватные переменные определяются внутри конструктора. При этом они недоступны снаружи конструктора, однако, на мой взгляд, в этом подходе есть недостаток: все методы, которые должны иметь доступ к приватным переменным, должны создаваться для каждого экземпляра класса вместо одного метода в прототипе.
Поэтому подход Drimogemon'а кажется мне более рациональным: использовать определённые конвенции для отделения приватных и публичных методов, например имена приватных методах начинать с символов "_".

dmitriymar 11.07.2012 19:43

oneguy,
неужто вы думаете что существует один шаблон наследования? Выбор большой шаблонов и у каждого свои возможности

oneguy 11.07.2012 19:58

Ещё не забывайте, что в Джаваскрипте есть собственная поддержка свойств доступа. Поэтому вместо этого:
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 11.07.2012 20:06

Цитата:

Сообщение от dmitriymar (Сообщение 188143)
oneguy,
неужто вы думаете что существует один шаблон наследования? Выбор большой шаблонов и у каждого свои возможности

Да, естественно. Однако я хотел сказать, что шаблон, предложенный вами не нужно использовать для довольно общей задачи с приватными и публичными методами.

Drimogemon 11.07.2012 20:18

Цитата:

Сообщение от oneguy
Однако я хотел сказать, что шаблон, предложенный вами не нужно использовать

Конечно не нужно использовать, сравнить это хотя бы с моей реализацией ООП. Которая кстати самая лучшая из существующих.
Да вы даже посмотрите как обьекты созданные классами выгладят в консоли, МАКСИМАЛЬНАЯ ОПТИМИЗАЦИЯ,
использование делегации НА ВСЮ КАТУШКУ.
https://github.com/Livanderiamarum/O...ster/README.md

vadim5june 11.07.2012 20:35

Цитата:

Сообщение от Drimogemon (Сообщение 188157)
Которая кстати самая лучшая из существующих.

Любой фреемворк или программу можно оценить только тогда когда она доходит до стадии практического применения
Вот если Вы сделаете у себя виджеты-интерфейсы UI и какуюто страницу примеров с такими базовыми классами как
окна табы слайдеры итд только тогда можно сравнивать и говорить чье лучше
А пока по вашим программам даже сказать нечего-все на очень ранней стадии и возможно из этой стадии и выходить не собирается

dmitriymar 11.07.2012 21:13

Цитата:

Сообщение от oneguy
Однако я хотел сказать, что шаблон, предложенный вами не нужно использовать для довольно общей задачи с приватными и публичными методами.

это то причём? вопрос был о приватности -возможно или нет-показал один из шаблонов,причём о наследовании в том момент речь не шла

Drimogemon 11.07.2012 21:39

Цитата:

Сообщение от vadim5june
А пока по вашим программам даже сказать нечего-все на очень ранней стадии и возможно из этой стадии и выходить не собирается

не понял, как им образом создание виджетов (на чем я кстати и тестировал этот шаблон ООП) связано с его качеством, качество может каждый оценить протевтировав САМ. Уже по примерам по ссылке должно быть понятно как удобно и сахарно стало работать с ООП. Создай видежты себе сам используя это и другие реализации ООП, и сравни где было удобнее.

vadim5june 11.07.2012 22:40

Цитата:

Сообщение от Drimogemon (Сообщение 188174)
Создай видежты себе сам используя это и другие реализации ООП, и сравни где было удобнее.

В этом нет никакого смысла потому что у тебя нет вообще никаких средств для работы с HTML элементами

Dim@ 11.07.2012 22:56

vadim5june,
создать классы для работы с HTML :p

vadim5june 11.07.2012 23:01

Цитата:

Сообщение от Dim@ (Сообщение 188192)
vadim5june,
создать классы для работы с HTML :p

Ну так это Maximaximus должен создавать раз фреемворк пишет
а он не хочет

Dim@ 11.07.2012 23:14

vadim5june,
пускай создает=)

Drimogemon 12.07.2012 00:10

Цитата:

Сообщение от vadim5june
В этом нет никакого смысла потому что у тебя нет вообще никаких средств для работы с HTML элементами

И как это я не додумался в обертку в ООП на javascript засунуть функции для работы с HTML элементами...
Щас смотрю, и ведь действительно ни одной нет. Проглядел.., спасибо добавим.


Цитата:

Сообщение от vadim5june
Ну так это 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

Цитата:

Сообщение от Drimogemon (Сообщение 188210)
какой фреймворк я пишу? это идеома ООП, шаблон добавляющий удобное прототипное наследование в javascript.
каким образом это вообще должно быть связанно с чем-то кроме наследования на javascript ?

Понятно... тогда интерес к теме пропал

oneguy 13.07.2012 03:50

Цитата:

Сообщение от dmitriymar
это то причём? вопрос был о приватности -возможно или нет-показал один из шаблонов,причём о наследовании в том момент речь не шла

Так я ничего не имею против вашего сообщения. Я лишь добавил своё замечание. Вы с моим утверждением-то согласны?


Часовой пояс GMT +3, время: 02:23.