Skip to content

Instantly share code, notes, and snippets.

@nin-jin
Last active August 29, 2015 14:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nin-jin/13297c8723ecf4516dda to your computer and use it in GitHub Desktop.
Save nin-jin/13297c8723ecf4516dda to your computer and use it in GitHub Desktop.
Инкапсуляция и сокрытие
/**
* Инкапсуляция
*
* @class Greeter1
*/
var Greeter1 = function(){}
/**
* Генерирует прикольное имя
*
* @protected
* @method _generateName
* @returns string
*/
Greeter1.prototype._generateName = function( ){
return 'Mr. ' + Math.random()
}
/**
* Приветствует пользователя.
*
* @method say
*/
Greeter1.prototype.say = function( ){
alert( 'Hello, ', localStorage.userName || this._generateName() )
}
/**
* Сокрытие
*
* @class Greeter2
*/
var Greeter2 = function(){
function _generateName( ){
return 'Mr. ' + Math.random()
}
/**
* Приветствует пользователя.
*
* @method say
*/
this.say = function( ){
alert( 'Hello, ', localStorage.userName || _generateName() )
}
}
/**
* Перед тобой две огромные библиотеки Greeter1 и Greeter2.
* Они тебе почти полностью подходят, вот только генерируемые имена не слишком интересные.
* Авторы библиотеки и не подозревали, что кому-то может потребоваться изменять способ генерации имён,
* поэтому и не сделали никакой публичной ручки для его "инъекции".
* Однако, в первом случае ты можешь отнаследоваться и перегрузить метод _generateName,
* а во втором тебе придётся лезть в исходники библиотеки и править там
* В обоих случаях ты лезешь в потроха и берешь на себя ответственность за совместимость с будущими версиями библиотек.
* Только в первом случае что-то сломается только, если автор библиотеки отрефакторит её так,
* что метода _generateName больше не будет или он будет заменён другим.
* А во втором твой патч будет слетать каждый раз при обновлении библиотеки,
* даже если там поменялся всего один пробел вначале.
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment