Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Как описывать свойства ООП? (https://javascript.ru/forum/offtopic/36647-kak-opisyvat-svojjstva-oop.html)

megaupload 23.03.2013 09:08

Как описывать свойства ООП?
 
Если какие то методы в процессе работы создают и используют какие-то свойства обьекта, стоит ли эти свойства описывать при конструировании изначально чтобы наглядно показывать что эти свойства как бы ЗАНЯТЫ?

/**
 * Dummy (пустышка) Каркас для обьектов на карте.
 * Дамми умеет перемещаться, имеет позицию, скорость и.т.п.
 * От этого класса наследуют все юниты, их пули, в общем все что есть на карте.
 * @constructor
  ---------------------------------------------------------------------------------*/
function Dummy() {
    this.position = new Position;

  /*ВОТ ТУТ СТОИТ ЛИ ИХ ПИСАТЬ для наглядности?*/
    this.isMoving = null;
    this.startTime = null;
    this.targetPosition = null;
}

Dummy.prototype.getPosition = function () {
        return this.position
};

Dummy.prototype.moveTo = function (targetPosition) {
    this.isMoving = true;
    this.startTime = new Date;
    this.targetPosition = targetPosition;
};



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

но в таком случае тип предполагаемого обьекта становится не очевидным..... неужели придется писать рядом с каждым таким свойством jsdoc? или смириться с тем что яваскрипт не строго типизированный и если нужны типы то переходить на typescript и.т.п. ? короче ЧАДНТ?

kobezzza 23.03.2013 09:35

Я описываю все возможное свойства в prototype объекта ( = null) и снабжаю JSDoc.

megaupload 23.03.2013 09:38

чтобы ускорить создание объектов)?

предполагается что я буду наследовать некоторые клаcсы от других вот так

Unit.prototype = new Dummy;
Unit.prototype.constructor = Unit;


ты предлагаешь после этой записи перечислять свойства?

а вообще логично ли это? не считаешь ли ты что свойства они персональные для каждого обьекта по этому логичнее писать их в конструктор а методы пихать в прототип? не считаешь ли ты что методы, не найдя свойство в обьекте, потянутся искать его в прототипе (пока не переопределят конечно) и это еще более замедлит работу чем "долгая" инициализация?


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


(щас кстати это и проверим)

kobezzza 23.03.2013 09:48

Скорость создания объектов тут не причём, это для параноиков :)
Просто не люблю я захламлять конструктор, а когда оформляю в прототип, то всё выглядит очень аккуратно.

var Select = new Class(function () {
    // Конструктор
}, {
    /**
     * Свойство
     *
     * @type {?string}
     */
    myProp: null
}, Input /* Родительский класс */);

var select = new Select();


PS: про поиск методов тоже глупость, я отталкиваюсь от реального опыта, а не от абстрактных статей людей не использующих ООП в JS, кароче всё норм)

megaupload 23.03.2013 09:52

ненене покажи пример на нативном js просто устраиваюсь на работу хочу красиво нативно писать.

п.с. оптимизаций не сделали, придется пихать методы по старинке в прототип)

kobezzza 23.03.2013 09:57

Дык тут всё нативно, т.к.

function Class(construct, opt_params, opt_parent) {
	opt_params = opt_params || {};
	construct.base = opt_parent || null;

	if (!opt_parent) {
		Object.extend(true, construct.prototype, opt_params);

	} else {
		Object.extend(true,
			construct.prototype,
			Function.isFunction(opt_parent) ? opt_parent.prototype : opt_parent, opt_params
		);

		construct.prototype.base = opt_parent;
	}

	return construct;
}


Ну, а если совсем просто, то:
function Select() {
}
Object.extend(true, Select.prototype, {
    myProp: null
});


PS: Object.extend это реализация подмешивания, аналог jQuery.extend

kobezzza 23.03.2013 09:59

Цитата:

Сообщение от megaupload (Сообщение 242136)
п.с. оптимизаций не сделали, придется пихать методы по старинке в прототип)

Писать нужно, как удобно и легко редактировать. В 90% хитрые оптимизации - лишнее.

Цитата:

Сообщение от megaupload (Сообщение 242136)
и вопрос, ка ты вот это в прототип пихнешь?
this.position = new Position;

В прототиппе свойства определять не нужно (если только это не свойства по умолчанию). В прототипе нужно лишь продекларировать её существование.

megaupload 23.03.2013 10:00

и вопрос, ка ты вот это в прототип пихнешь?
this.position = new Position;


Цитата:

Сообщение от kobezzza
Дык тут всё нативно, т.к.

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

Цитата:

Сообщение от kobezzza
В 90% хитрые оптимизации - лишнее.

ну я игру пилю) как портфолио

kobezzza 23.03.2013 10:05

Цитата:

Сообщение от megaupload (Сообщение 242140)
и вопрос, ка ты вот это в прототип пихнешь?
this.position = new Position;



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


ну я игру пилю) как портфолио

1) Ответил выше;
2) Ну если совсем нативно, то простое перечисление:
prototype.свойство

3) По личному опыту скажу, что в играх тормоза не там :) К слову типизированные массивы в JS добавили не с проста)

megaupload 23.03.2013 10:17

Цитата:

Сообщение от kobezzza
1) Ответил выше;

ответь еще раз я не понял как ты это в прототип Unit пихнешь обьект класса Position покажи в коде еще раз

Цитата:

Сообщение от kobezzza
К слову типизированные массивы в JS добавили не с проста)

да да, я тоже читал ту статью)

kobezzza 23.03.2013 10:30

Если я правильно понял твой вопрос, то так.
function Animal() {
	...
	...
	this.life = new Life();
};

/**
 * Объект жизни
 *
 * @type {Life}
 */
Animal.prototype.life = null;

/**
 * Убить животное
 */
Animal.prototype.die = function () {
    ...
};


Т.е. в прототип я просто декларирую сам факт существования свойства, а не его значение (если конечно таковое не требуется).
Такой подход имхо удобен для чтения, а также дополнительный профит, что нормальная ИДЕ лучше автокомплитит по коду.

2) Какую статью? Я просто пробывал писать игрульки в своё время, 2-мерные, аля марио и т.д. и у меня как раз тормоза были на массивах препятствий и монстриков, после того как перешёл на типизированные, то всё исправилось, но на статью ссылку дай :)

megaupload 23.03.2013 10:35

я думал ты про это О_О

http://habrahabr.ru/post/119694/

kobezzza 23.03.2013 10:37

Цитата:

Сообщение от megaupload (Сообщение 242149)
я думал ты про это О_О

http://habrahabr.ru/post/119694/

Да :) Я хабр редко читаю, но читаю mdn, от туда и узнал про них:)

megaupload 23.03.2013 10:48

а наследование ты делаешь так?

/* Животинка
 ----------------------------------------------------*/
function Animal() {
    this.childerns = [];
    this.isWalk = null;
}

Animal.prototype.go = function () {
    alert('i going!')
};


/* Кошечка
 ----------------------------------------------------*/
function Cat() {
    this.position = new Position;
    this.age = null;
    this.name = null;
}

/*наследует от животинки*/
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;

Cat.prototype.sayMew = function () {
    alert('mew')
};

kobezzza 23.03.2013 10:53

Да

megaupload 23.03.2013 11:04

а сделай тройное наследование? с расширением к родительских методов.

kobezzza 23.03.2013 11:08

Без проблем, но напишу завтра) уехал из дома, а с телефона не удобно

megaupload 23.03.2013 11:09

ну я бы сделал его так


/* Боженька
 ----------------------------------------------------*/
function God() {
    this.go = function () {
        alert('i GOD');
    }
}


/* Животинка
 ----------------------------------------------------*/
function Animal() {
    this.childerns = [];
    this.isWalk = null;

    this.go = function () {
        Animal.prototype.go.call(this);
        alert('i going! cuz i animal')
    };
}

/*наследует от боженьки*/
Animal.prototype = new God;


/* Кошечка
 ----------------------------------------------------*/
function Cat() {
    this.position = new Array();
    this.age = null;
    this.name = null;


    this.sayMew = function () {
        alert('mew')
    };
    this.go = function () {
        Cat.prototype.go.call(this);
        alert('and JUMP!! cuz i CAT')
    };
}

/*наследует от животинки*/
Cat.prototype = new Animal();


new Cat().go();

kobezzza 24.03.2013 17:15

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

ЗЫ: я стал дядей, грац меня :)

megaupload 24.03.2013 17:24

твой брат родил или сестра)?

megaupload 24.03.2013 17:27

class Animal {
    animal = 'animal';

    say() {
        alert('i animal')
    }
}


class Cat extends Animal {
    cat = 'cat';

    say() {
        super.say();
        alert('and i cat')
    }
}

new Cat().say();



а получается так

var __extends = this.__extends || function (d, b) {
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};
var Animal = (function () {
    function Animal() {
        this.animal = 'animal';
    }
    Animal.prototype.say = function () {
        alert('i animal');
    };
    return Animal;
})();
var Cat = (function (_super) {
    __extends(Cat, _super);
    function Cat() {
        _super.apply(this, arguments);

        this.cat = 'cat';
    }
    Cat.prototype.say = function () {
        _super.prototype.say.call(this);
        alert('and i cat');
    };
    return Cat;
})(Animal);
new Cat().say();
//@ sourceMappingURL=td.js.map

kobezzza 24.03.2013 17:42

Цитата:

Сообщение от megaupload (Сообщение 242354)
твой брат родил или сестра)?

У брата сынишка родился:)

megaupload 24.03.2013 17:44

охуенно, а сколько вам лет )?

kobezzza 24.03.2013 17:45

Цитата:

Сообщение от megaupload (Сообщение 242355)
class Animal {
    animal = 'animal';

    say() {
        alert('i animal')
    }
}


class Cat extends Animal {
    cat = 'cat';

    say() {
        super.say();
        alert('and i cat')
    }
}

new Cat().say();



а получается так

var __extends = this.__extends || function (d, b) {
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};
var Animal = (function () {
    function Animal() {
        this.animal = 'animal';
    }
    Animal.prototype.say = function () {
        alert('i animal');
    };
    return Animal;
})();
var Cat = (function (_super) {
    __extends(Cat, _super);
    function Cat() {
        _super.apply(this, arguments);

        this.cat = 'cat';
    }
    Cat.prototype.say = function () {
        _super.prototype.say.call(this);
        alert('and i cat');
    };
    return Cat;
})(Animal);
new Cat().say();
//@ sourceMappingURL=td.js.map

TypeScript прикольная штука:)

kobezzza 24.03.2013 17:45

Цитата:

Сообщение от megaupload (Сообщение 242359)
охуенно, а сколько вам лет )?

Мне 23, а брату 25)

megaupload 24.03.2013 18:05

Цитата:

Сообщение от kobezzza
TypeScript прикольная штука

а что лучше ECMA 6 транслируемый в ECMA3 или Typescript транслируемый в ECMA3)?

kobezzza 24.03.2013 18:11

Цитата:

Сообщение от megaupload (Сообщение 242366)
а что лучше ECMA 6 транслируемый в ECMA3 или Typescript транслируемый в ECMA3)?

Лучше ECMA6 работающий нативно во всех современных браузерах) Ну а так мне наверно трудно сказать, т.к. я этих зверей ещё на реальных проектах не пробовал, хотя TypeScript похож C# и ActionScript3 и лично для меня это плюс, т.к. я работал с этими двумя языками и мне в общем они оч нравились.

Кстати поиграйся с Coffee, он ппц сахарный, куда более сахарнее, чем TypeScript. Рекомендую прочитать Марк Бейтс Coffee Script.

megaupload 24.03.2013 18:18

меня бесит синтаксис кофя... он пиздец какой неочевидный это факт.


ну как я понял typescript его суть именно в проверке типов перед компиляцией и все, а строгая типизация позволяет движкам компилить более быстрый байткод... а в ECMA6 такое есть?

functionm  test (lol:string,  qq:Cat){

}

kobezzza 24.03.2013 18:20

Цитата:

Сообщение от megaupload (Сообщение 242370)
меня бесит синтаксис кофя... он пиздец какой неочевидный это факт.

Это как посмотреть. Я вот начал присматриваться у Питону и Кофе сразу стал становится приятным:) По началу меня он тоже бесил.

Цитата:

а в ECMA6 такое есть?
В экме такое давно есть, тот же ActionScript3 тоже реализует синтаксис ECMA и там есть и возможность указывания типов (не обязательное) и классы и неймспейсы (пакеты, как в Java). Хотя наверно ECMAScript дробится на разные ветки, т.к. реализация JS идёт немного по другому.

В новом стандарте JS вроде как должны появится способы проверки входных параметров функций, но не более того.

danik.js 24.03.2013 18:24

var Animal = function () {
    this.animal = 'animal';
};
Animal.prototype.say = function () {
    alert('i animal');
};

var Cat = function () {
        Animal.apply(this, arguments);

        this.cat = 'cat';
}
Cat.prototype = Object.create(Animal.prototype, {
    constructor: {value: Cat, writable: true, enumerable: false, configurable: true}
});
Cat.prototype.say = function () {
    Animal.prototype.say.call(this);
    alert('and i cat');
};

new Cat().say();


То есть на сегодняшний день этот код должен примерно так выглядеть?

megaupload 24.03.2013 18:48

Цитата:

Сообщение от danik.js
То есть на сегодняшний день этот код должен примерно так выглядеть?

епать я проиграл))) ахах

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

melky 25.03.2013 06:36

Цитата:

Сообщение от megaupload
/*ВОТ ТУТ СТОИТ ЛИ ИХ ПИСАТЬ для наглядности?*/

лично я делаю так.

и это только из-за автокомплита в ide
/** 
*  шамансkий JSDOC
*/
dummy.prototype.isMoving = false;

megaupload 25.03.2013 10:20

я короче чо то вообще попробовав тайпскрипт больше не могу ни на чем другом писать..... это шикарно же. с этим на работу берут?

kobezzza 25.03.2013 10:55

Цитата:

Сообщение от megaupload (Сообщение 242462)
я короче чо то вообще попробовав тайпскрипт больше не могу ни на чем другом писать..... это шикарно же. с этим на работу берут?

Язык молодой, но в новые проекты почему бы и нет.

megaupload 25.03.2013 11:00

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

danik.js 25.03.2013 11:06

Цитата:

Сообщение от megaupload
игры например где без нормального наследования ни как, и как раз сиподобный типизированный код работает быстрее..

Ну ты гонишь ) Или решил вбросить говнеца? Не думаю что ты не вкурсе что TS транслируется в обычный JS, так что результат один и тот же.

kobezzza 25.03.2013 11:16

Цитата:

Сообщение от danik.js (Сообщение 242471)
Ну ты гонишь ) Или решил вбросить говнеца? Не думаю что ты не вкурсе что TS транслируется в обычный JS, так что результат один и тот же.

Он имел ввиду, что код JS который генерится из TS лучше оптимизируется современными JIT компиляторами JS, т.к. сгенериный код придерживается строгой статичной структуры.

kobezzza 25.03.2013 11:19

Цитата:

Сообщение от megaupload (Сообщение 242469)
игры например где без нормального наследования ни как, и как раз сиподобный типизированный код работает быстрее..

Игры, как и другие проекты редко пишутся с нуля, всегда есть ядро, которое инкапсулирует в себе азм и оптимизирует его. Если уже написано много-премного кода и он прекрасно работает, то зачем его переписывать на ТС ради чуть более сахарного синтаксиса? А вот те вещи которые пишутся с нуля, то да, в этом есть смысл, т.к. ТС проще и удобнее.

megaupload 25.03.2013 13:24

Цитата:

Сообщение от danik.js
Ну ты гонишь ) Или решил вбросить говнеца? Не думаю что ты не вкурсе что TS транслируется в обычный JS, так что результат один и тот же.

ты чо вообще нубло? мне реально обьяснять почему ts работает быстрее js или ты прикалываешься?

Цитата:

Сообщение от kobezzza
Он имел ввиду, что код JS который генерится из TS лучше оптимизируется современными JIT компиляторами JS, т.к. сгенериный код придерживается строгой статичной структуры.

ну вот) даже обьяснять не надо.

Цитата:

Сообщение от kobezzza
Игры, как и другие проекты редко пишутся с нуля

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

danik.js 25.03.2013 13:48

Цитата:

Сообщение от megaupload
ты чо вообще нубло? мне реально обьяснять почему ts работает быстрее js или ты прикалываешься?

А можно реальные примеры? Не предположения, а факты?


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