Пасоны, помогите со стайлом OOP в очередной раз
function Cat () { this.say = function () { }; this.run = function () { var speed = countSpeed(s / t, getAngle(0)); function getAngle () { } function countSpeed () { } }; } run и say - методы но метод run использует функции getAngle и countSpeed которые работают с его локальными переменными, где в данном случае удобнее писать эти функции? ВНУТРИ метода? так как только он их использует, но бывают и такие полезные функции которые используют несколько методов, например say захочет использовать getAngle, и в каждом методе писать одно и то же не круто. Но может сделать эти функции getAngle и countSpeed приватными методами? Но тогда они не будут иметь доступ к локальным переменным каждого метода который их использует и придется передавать эти переменные в качестве параметров?. Как поступать если например заведомо 100% ТОЛЬКО run использует эти функции? писать их в нем? но это сильно раздувает сам метод и его уже неудобно читать не понятно где начало а где конец. Если же вынести эти функции во вне (не делая приватными _методами, а просто объявить) а они ЗАВЕДОМО используются только ОДНИМ методом (и как бы являются его частью просто вынесенной в отдельную функцию) то не будет ли возникать непонятков "что это ваще тут за функция и какой метод её использует и к какому она относится?" а так же придется передавать в эти функции локальные переменные самих методов которые им нужны. В общем я остановился пока на раздувании метода этими функциями и объявляю их прямо у него внизу, так как ТОЛЬКО ЭТОТ МЕТОД использует эти функции и они являются как бы его частью (раз используют даже его локальные переменные), ПЛЮС гугл компиллер разворачивает эти функции просто в код который просто использует в методе, что вообще круто. НОО не сильно ли это раздувает метод? А так же из минусов то что внутри этих функций нет доступа к this по этому приходится вверху любого конструктора писать либо var self = this либо выносить все используемые данным методом СВОЙСТВА обьекта в переменные логически названные, и к этим свойствам (через переменные) уже будут иметь доступ функции. В общем как поступить? И что делать если например и метод say захочет использовать функцию getAngle а у него её нету... |
почему нельзя написать просто как функцию?
|
Цитата:
а так же она относится К НЕМУ и использует её ТОЛЬКО ОН и если все такие функции выносить будет не понятно к какому методу какая функция относится. |
Ну а зачем при каждом вызове метода пересоздавать эти функции? Нечем больше процессор пользователя занять чтоли?
|
Cat.prototype = { say: function () {}, run: function() {}, _getAngle: function() {}, _countSpeed: function() {} }; |
Цитата:
Цитата:
|
nerv_,
это охуенный вариант! спасибо! гугл компиллер достает код из этих приватных методов и вставляет туда где он используеться тупо копируя. То есть остаются только публичные методы. А так же сразу понятно какой публичный какие приватные использует. Вопрос, если приватный метод захотят использовать 2 публичных то как это указать? Например если в данном случае публичный метод say захочет использовать приватный _getAngle ? Цитата:
Код для машин, пишут компиляторы. |
Цитата:
Есть ещё такой вариант, для истинных фанатов замыканий: Cat.prototype.say = function () {}; (function(proto){ function getAngle() {} function countSpeed() {} proto.run = function() {}; }(Cat.prototype)); И соответственно, если надо некие приватные функции сделать доступными для двух методов - добавить ещё одно обёртывающее замыкание и вынести функцию туда итд. До полного ада.) |
Цитата:
Цитата:
![]() |
var Cat = (function () { // Обшие для всех котов переменные и ф-и ... var CatConstructor = function () {}; CatConstructor.prototype = { // ... }; return CatConstructor; })(); jQuery плагины фигачу примерно по такой схеме jQuery.fn.cat = (function ($, undefined) { var defaultOptions = {}; var Cat = function (options, element) { if (!(this instanceof Cat)) { return new Cat(options, $(this)); var self = this; this.options = $.extend(true, {}, defaultOptions, options); this.element = element; } }; CatConstructor.prototype = { constructor: Cat // ... }; return Cat; })(jQuery); |
Цитата:
|
он прав. создавать одни и те же методы для каждого объекта - не путь настоящего джедая.
|
Приватные методы нужны для тех же целей что и публичные, только приватно.=)
Ну, на самом деле приватными методами конкретного объекта должны быть те функции, что выполняют абстрактную задачу и могут потребоваться из любого публичного метода: имеющегося или возможно созданного в будущем. Не стоит же превращать в общедоступные приватные методы те функции, что выполняют конкретную задачу в конкретном месте и востребованы впоследствии где-либо ещё быть не могут в силу своей специфичности. А вот что с ними делать - вопрос уже другой.) |
Цитата:
|
Хз.)
|
Aetae,
ну блин определи уж, используя свои знания то ну. ты должен знать то) |
Цитата:
|
Цитата:
Цитата:
var Cat = (function() { function getAngle() {} function countSpeed() {} // something return function() { // constructor this.say(); }; }()); Это почти то же, что Tim приводил. Но я бы воспользовался его вариантом :D Цитата:
|
А истина печальна: идеально красивого и при этом работающего кода не получить, если строк поболе сотни. Всегда приходится идти на компромиссы. =(
|
Цитата:
спасибо тебе.. ну так и чо делать? я начал созавать тупо приватные методы под публичными которые их используют..... это по моему самый лучший подход. |
Цитата:
|
Цитата:
|
Aetae,
потому что заголовки пишутся НАД содержимым и мы привыкли читать сверху вниз. кэп |
Цитата:
Цитата:
|
кстати идея то годная, древовидная такая структура, где прямоугольники это методы)) ща нарисую
|
Придумал небольшую штуку:
var Cat = function ( ) { var private_functions = Cat.prototype.private_functions; //Ссылка на объект с функциями this.say = function ( ) { }; var fun = function ( ) { alert ( "FUN" )}; this.run = function ( ) { with (private_functions) {//загружаем приватные методы this.x = 12;//на свойствах объекта созданного через конструктор Cat это не отражается func1 ( );//работает func2 ( );//работает fun ( ); //сработает - я даже не думал, что сработает } }; } Cat.prototype.x = 6;//дефолтное значение Cat.prototype.private_functions = {//объект с функциями func1 : function ( ) { alert ("Func1"); }, func2 : function ( ) { alert ("Func2"); } }; var cat = new Cat; alert ( cat.x );//дефолтное значение 6 cat.run ( );//работает alert ( cat.x );//12 Но с оператором with надо быть осторожным - все переменные обязательно с var, иначе "переменную" сделают св-ом объекта private_functions и многие не любят оператор with, я же как стереотипный человек тоже немного избегаю его, но ....:) |
Кстати вопрос на засыпку: megaupload === maxmaxmaximus?
Меня просто целый год не было :lol: |
Dim@, это я.
Как отслужил? |
megaupload,
Пока не служил :lol: Здарова |
Цитата:
А как отслужил то всё таки? |
Tim,
говорю же не служил .... пока что:lol: |
Tim,
зачем ты меня обозвал, ты что желаешь мне зла? |
megaupload,
Где я тебя обозвал? В твоём представлении приведённая мной цепочка должна где то после аквариума сломаться, так что до древней рептилии дело не дойдёт. У тебя же множественная личность и ты не помнишь предыдущие свои образы. Забыл? |
Dim@, они тебя троллят)) лол
|
Цитата:
|
Hekumok,
это то понятно :D |
Часовой пояс GMT +3, время: 16:40. |