Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Как вам такой стиль ООП? (https://javascript.ru/forum/offtopic/36538-kak-vam-takojj-stil-oop.html)

megaupload 19.03.2013 08:18

Как вам такой стиль ООП?
 
function Bullet() {

    /*Переменные
     --------------------------------------------*/
    var HTMLElement, animationFrameId;


    /*Свойства
     --------------------------------------------*/
    this.startTime = new Date;
    this.target = new Point();
    this.position = new Point();
    this.speed = 100;

    this.stop = stop;
    this.sayHi = sayHi;


    /*Инициализация
     --------------------------------------------*/
    HTMLElement = document.createElement('div');
    HTMLElement.className = 'bullet';
    document.body.appendChild(HTMLElement);

    render();


    /*Методы
     --------------------------------------------*/
    function render() {
        step();
        this._animationFrameId = requestAnimationFrame(render, HTMLElement);
    }

    function stop() {
        cancelRequestAnimationFrame(animationFrameId);
    }

    function step() {
        console.log('fly');
    }

    function sayHi() {
        alert('hi')
    }
}

megaupload 19.03.2013 08:20

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

tenshi 19.03.2013 08:27

инстанцирование медленное, потребление памяти больше, а так норм)

megaupload 19.03.2013 08:46

Цитата:

Сообщение от tenshi
инстанцирование медленное

медленнее чем что)?
Цитата:

Сообщение от tenshi
потребление памяти больше

замыкания больше жрут?

megaupload 19.03.2013 09:11

как выяснилось строгий сиподобный стиль работает быстрее так как под него куча оптимизаций, для игрушек самое то

этот стиль говно

megaupload 19.03.2013 09:15

тогда вопрос

function Bullet() {

    /*Инициализация
     --------------------------------------------*/
    var HTMLElement = document.createElement('div');
    HTMLElement.className = 'bullet';
    document.body.appendChild(HTMLElement);


    /*Свойства
     --------------------------------------------*/
    this.HTMLElement = HTMLElement;
    this.animationFrameId = null;

    this.startTime = new Date;
    this.position = new Point(200, 200);
    this.target = new Point(1300, 500);
    this.speed = 1;


    /*Методы
     --------------------------------------------*/
    this.start = function () {
        this.step();
        this.animationFrameId = requestAnimationFrame(this.start.bind(this), this.HTMLElement);
    };

    this.stop = function () {
        cancelRequestAnimationFrame(this.animationFrameId);
    };

    this.step = function () {

        this.position.x += this.speed;

        this.HTMLElement.style.left = this.position.x + 'px';
        this.HTMLElement.style.top = this.position.y + 'px';
    };


    /* ШТО ЭТО ТАКОЕ И ПОЧЕМУ ОНО НЕ В СЕКЦИИ ИНИЦИАЛИЗАЦИИ????????????? */
    this.start();

}

kobezzza 19.03.2013 09:28

Цитата:

Сообщение от megaupload (Сообщение 241451)
Ни одного бинда и.т.п. а наследование для быдла. и вообще мне ни разу не приходилось что то наследовать от чего то, может это потому что я ни одного сайта так и не сделал.

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

Сейчас в своём проекте, над которым работаю последнее время использую паттерн БЭМ, где наследование используется крайне жирно: блок представляет себе полностью инкапсулированную структуру, которая включает в себя и CSS и JS и шаблоны. Для наследования в CSS использую препроцессор Stylus, для шаблонов написал специально свою реализацию: https://github.com/kobezzza/Snakeskin, ну с JS использую паттерн: подмешивания в прототипах (на мой взгляд самое универсально решение).

melky 19.03.2013 11:19

Интересно, чем не устраивает обычный стиль - прототипное наследование?

kobezzza 19.03.2013 11:35

Цитата:

Сообщение от melky (Сообщение 241466)
Интересно, чем не устраивает обычный стиль - прототипное наследование?

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

function parent() {}
parent.prototype.myProp = {
    a: {b: {...}},
    c: {...},

    onEvents: {onInit, onRemove}
};

function child() {}
child.prototype.myProp = {
    a: {b: 2},
    c: [1, 2, 3],

    onEvents: {onUpdate}
};

extend(parent, child);


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

Пример из реальной жизни: когда работал над новой реализацией отчётов для Яндекс.Метрики, то для графиков использовал библиотеку Hightcharts. У неё очень гибкая и глубокая древовидная система настроек, а многие отчёты могут отличаться на n-м уровне настроек, при этом каждый отчёт является классом, т.к. мы можем захотеть создать инстанс например для виджета на дашборд или внешнего виджета. Получается, что у класса отчёта в прототипе прописаны настройки для Hightcharts и дочерний класс просто переопределяет или дополняет любой уровень настроек.

Из плюсов такого подхода: значительно более гибкая система наследования.
В плане затраты ресурсов и скорости работы они одинаковы, т.к. конечный код с точки зрения интерпретатора JS один и тот же, т.е. это просто сахар.

monolithed 19.03.2013 12:38

Цитата:

Сообщение от kobezzza
https://github.com/kobezzza/Snakeskin

Напомнило:

https://github.com/archimag/cl-closure-template
http://lisperator.net/sytes/


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