Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Пасоны, помогите со стайлом OOP в очередной раз (https://javascript.ru/forum/offtopic/37368-pasony-pomogite-so-stajjlom-oop-v-ocherednojj-raz.html)

megaupload 17.04.2013 12:44

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

melky 17.04.2013 13:20

почему нельзя написать просто как функцию?

megaupload 17.04.2013 13:22

Цитата:

Сообщение от melky
почему нельзя написать просто как функцию?

как функцию ВНЕ тела метода? потому что эта функция использует локальные переменные метода.
а так же она относится К НЕМУ и использует её ТОЛЬКО ОН и если все такие функции выносить будет не понятно к какому методу какая функция относится.

danik.js 17.04.2013 14:04

Ну а зачем при каждом вызове метода пересоздавать эти функции? Нечем больше процессор пользователя занять чтоли?

nerv_ 17.04.2013 14:34

Cat.prototype = {
    say: function () {},
    run: function() {},
    _getAngle: function() {},
    _countSpeed: function() {}        
};

melky 17.04.2013 15:44

Цитата:

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

а аргументы для чего придуманы)

Цитата:

Сообщение от megaupload
а так же она относится К НЕМУ и использует её ТОЛЬКО ОН и если все такие функции выносить будет не понятно к какому методу какая функция относится.

тогда зачем ты её вообще создал? заинлайни и всё делов... императивщина ж.

megaupload 17.04.2013 16:07

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

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

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


Цитата:

Сообщение от melky
тогда зачем ты её вообще создал?

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

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

Aetae 18.04.2013 01:22

Цитата:

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

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

megaupload 18.04.2013 01:42

Цитата:

Сообщение от Aetae
нафиг не нужных изначально конструируемому объекту

вот и я думаю, это по сути не методы а части метода

Цитата:

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

продолжай


Tim 18.04.2013 10:48

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);

megaupload 18.04.2013 12:15

Цитата:

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

А зачем по твоему ВООБЩЕ нужны приватные методы тогда если не за этим??? Приведи пример?

Tim 18.04.2013 12:31

он прав. создавать одни и те же методы для каждого объекта - не путь настоящего джедая.

Aetae 18.04.2013 12:35

Приватные методы нужны для тех же целей что и публичные, только приватно.=)
Ну, на самом деле приватными методами конкретного объекта должны быть те функции, что выполняют абстрактную задачу и могут потребоваться из любого публичного метода: имеющегося или возможно созданного в будущем. Не стоит же превращать в общедоступные приватные методы те функции, что выполняют конкретную задачу в конкретном месте и востребованы впоследствии где-либо ещё быть не могут в силу своей специфичности. А вот что с ними делать - вопрос уже другой.)

megaupload 18.04.2013 12:38

Цитата:

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

ну у нас getAngle и countSpeed так и есть)) не?

Aetae 18.04.2013 12:45

Хз.)

megaupload 18.04.2013 12:51

Aetae,
ну блин определи уж, используя свои знания то ну. ты должен знать то)

Tim 18.04.2013 12:58

Цитата:

А вот что с ними делать - вопрос уже другой.)
Создавать их только на время выполнения функции, чтобы соседний кусок кода их не спёр случайно.

nerv_ 18.04.2013 13:09

Цитата:

Сообщение от Aetae
А не будет ли прототип таким образом засран тонной приватных методов

смотря как и сколько писать :)

Цитата:

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

как вариант
var Cat = (function() {

	function getAngle() {}
	function countSpeed() {}
	
	// something

	return function() {
		// constructor
            this.say();
	};
}());

Это почти то же, что Tim приводил. Но я бы воспользовался его вариантом :D

Цитата:

Сообщение от Дзен-трансгуманист
и узришь больше нюансов и альтернатив

истину :)

Aetae 18.04.2013 13:18

А истина печальна: идеально красивого и при этом работающего кода не получить, если строк поболе сотни. Всегда приходится идти на компромиссы. =(

megaupload 19.04.2013 00:40

Цитата:

Сообщение от Aetae
А истина печальна: идеально красивого и при этом работающего кода не получить, если строк поболе сотни. Всегда приходится идти на компромиссы. =(

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




ну так и чо делать? я начал созавать тупо приватные методы под публичными которые их используют..... это по моему самый лучший подход.

DjDiablo 19.04.2013 02:15

Цитата:

ну так и чо делать? я начал созавать тупо приватные методы под публичными которые их используют..... это по моему самый лучший подход.
Правильно !

Aetae 19.04.2013 02:22

Цитата:

Сообщение от megaupload (Сообщение 247039)
под публичными которые их используют...

...а почему бы не над?..

megaupload 19.04.2013 12:43

Aetae,
потому что заголовки пишутся НАД содержимым и мы привыкли читать сверху вниз. кэп

nerv_ 19.04.2013 14:58

Цитата:

Сообщение от megaupload
я начал созавать тупо приватные методы под публичными которые их используют

Цитата:

Сообщение от Aetae
...а почему бы не над?..

узко мыслите, товарищи! Я предлагаю сбоку! С какого именно, решим голосованием!

megaupload 19.04.2013 16:47

кстати идея то годная, древовидная такая структура, где прямоугольники это методы)) ща нарисую

Dim@ 19.04.2013 16:54

Придумал небольшую штуку:
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, я же как стереотипный человек тоже немного избегаю его, но ....:)

Dim@ 19.04.2013 16:56

Кстати вопрос на засыпку: megaupload === maxmaxmaximus?
Меня просто целый год не было :lol:

megaupload 19.04.2013 17:09

Dim@, это я.
Как отслужил?

Dim@ 19.04.2013 17:11

megaupload,
Пока не служил :lol:
Здарова

Tim 19.04.2013 17:36

Цитата:

Кстати вопрос на засыпку: megaupload === maxmaxmaximus?
megaupload === макаксимус === ливандеаквариум === немо === долбоящер :D

А как отслужил то всё таки?

Dim@ 19.04.2013 17:50

Tim,
говорю же не служил .... пока что:lol:

megaupload 19.04.2013 17:55

Tim,
зачем ты меня обозвал, ты что желаешь мне зла?

Tim 19.04.2013 21:46

megaupload,
Где я тебя обозвал? В твоём представлении приведённая мной цепочка должна где то после аквариума сломаться, так что до древней рептилии дело не дойдёт. У тебя же множественная личность и ты не помнишь предыдущие свои образы. Забыл?

Hekumok 19.04.2013 21:52

Dim@, они тебя троллят)) лол

megaupload 19.04.2013 22:30

Цитата:

Сообщение от Tim
Где я тебя обозвал

да, ты обозвал меня долбоящером, зачем?

Dim@ 19.04.2013 22:37

Hekumok,
это то понятно :D


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