Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.04.2013, 12:44
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Пасоны, помогите со стайлом 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 а у него её нету...

Последний раз редактировалось megaupload, 17.04.2013 в 12:52.
Ответить с цитированием
  #2 (permalink)  
Старый 17.04.2013, 13:20
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

почему нельзя написать просто как функцию?
Ответить с цитированием
  #3 (permalink)  
Старый 17.04.2013, 13:22
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Сообщение от melky
почему нельзя написать просто как функцию?
как функцию ВНЕ тела метода? потому что эта функция использует локальные переменные метода.
а так же она относится К НЕМУ и использует её ТОЛЬКО ОН и если все такие функции выносить будет не понятно к какому методу какая функция относится.
Ответить с цитированием
  #4 (permalink)  
Старый 17.04.2013, 14:04
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Ну а зачем при каждом вызове метода пересоздавать эти функции? Нечем больше процессор пользователя занять чтоли?
Ответить с цитированием
  #5 (permalink)  
Старый 17.04.2013, 14:34
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Cat.prototype = {
    say: function () {},
    run: function() {},
    _getAngle: function() {},
    _countSpeed: function() {}        
};
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #6 (permalink)  
Старый 17.04.2013, 15:44
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от megaupload
потому что эта функция использует локальные переменные метода.
а аргументы для чего придуманы)

Сообщение от megaupload
а так же она относится К НЕМУ и использует её ТОЛЬКО ОН и если все такие функции выносить будет не понятно к какому методу какая функция относится.
тогда зачем ты её вообще создал? заинлайни и всё делов... императивщина ж.
Ответить с цитированием
  #7 (permalink)  
Старый 17.04.2013, 16:07
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

nerv_,
это охуенный вариант! спасибо! гугл компиллер достает код из этих приватных методов и вставляет туда где он используеться тупо копируя.

То есть остаются только публичные методы. А так же сразу понятно какой публичный какие приватные использует.

Вопрос, если приватный метод захотят использовать 2 публичных то как это указать? Например если в данном случае публичный метод say захочет использовать приватный _getAngle ?


Сообщение от melky
тогда зачем ты её вообще создал?
для инкапсуляции определенного действия и давания ему имени, для того чтобы код был более читабельный. КАЖДОЕ логическое действие, которое состоит из нескольких простых, нужно пихать в функцию и давать ей четкое название. КОД пишется ДЛЯ ЛЮДЕЙ а не для машин.

Код для машин, пишут компиляторы.

Последний раз редактировалось megaupload, 17.04.2013 в 16:11.
Ответить с цитированием
  #8 (permalink)  
Старый 18.04.2013, 01:22
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,491

Сообщение от nerv_ Посмотреть сообщение
Cat.prototype = {
    say: function () {},
    run: function() {},
    _getAngle: function() {},
    _countSpeed: function() {}        
};
А не будет ли прототип таким образом засран тонной приватных методов, нафиг не нужных изначально конструируемому объекту, в которых сам чёрт ногу сломит?

Есть ещё такой вариант, для истинных фанатов замыканий:
Cat.prototype.say = function () {};

(function(proto){
    function getAngle() {}
    function countSpeed() {}      
    
    proto.run = function() {};
  
}(Cat.prototype));

И соответственно, если надо некие приватные функции сделать доступными для двух методов - добавить ещё одно обёртывающее замыкание и вынести функцию туда итд. До полного ада.)
__________________
29375, 35

Последний раз редактировалось Aetae, 18.04.2013 в 01:38.
Ответить с цитированием
  #9 (permalink)  
Старый 18.04.2013, 01:42
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Сообщение от Aetae
нафиг не нужных изначально конструируемому объекту
вот и я думаю, это по сути не методы а части метода

Сообщение от Aetae
добавить ещё одно обёртывающее замыкание и вынести функцию туда итд.
продолжай

Ответить с цитированием
  #10 (permalink)  
Старый 18.04.2013, 10:48
Аватар для Tim
Tim Tim вне форума
Профессор
Отправить личное сообщение для Tim Посмотреть профиль Найти все сообщения от Tim
 
Регистрация: 05.06.2009
Сообщений: 1,703

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);
__________________
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
Самые главные в жизни вещи - не вещи! (было написано на одном гараже =)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск