Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Объектный код (https://javascript.ru/forum/misc/28454-obektnyjj-kod.html)

Раед 20.05.2012 17:02

Объектный код
 
Как научится правильно писать гибкий объектно ориентированный код?
Обычно я делаю как-то так
function construct(l) {
 var obj = {
  a : 5,
  b : function() {
   
  },
  c : l
 }
 return obj;
}

Или даже так
function construct(l) {
 var obj = {}
 obj.a = 5;
 obj.b = function() {
 
 }
 obj.l = l;
 return obj;
}

Но хочется чего то более сложного.
Как создают объекты профессионалы?

B@rmaley.e><e 20.05.2012 17:04

Цитата:

Сообщение от Раед
Как создают объекты профессионалы?

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

vadim5june 20.05.2012 17:48

я не знаю как профессианалы пишут но продолжаю так
function const2(){
var obj=new construct(55);
obj.c=6;
obj.d=function(){this.f=this.a+this.c}
return obj;
};
var f=new const2();alert('f='+f);f.d();alert(f.f);

vadim5june 20.05.2012 18:44

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 175619)
так же функции должны быть короткими.

Как их сделаешь короткими если они по алгоритму длинные

melky 20.05.2012 18:47

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 175619)
лично моя прихоть в том что ни одно свойство обьекта не изменяется прямым присваиванием (и не юзаю сеттеры).

в твоем же коде Hash.set разве не сеттер?
Цитата:

Сообщение от Maxmaxmахimus (Сообщение 175619)
Вот вот, профессионалы, в отличии от школоты, гонятся за простотой.

я бы добавил ещё, за сокращением количества ненужных телодвижений в скриптах.
Цитата:

Сообщение от vadim5june (Сообщение 175624)
Как их сделаешь короткими если они по алгоритму длинные

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

Раед 20.05.2012 18:59

Цитата:

Сообщение от Maxmaxmахimus
Hash.prototype.keys = function () {
var elements = this._elements,
keys = [];

for ( var key in elements ) if ( elements.hasOwnProperty( key ) ) {
keys.push( key );
}

return Object.getOwnPropertyNames( this._elements );
};

Ээээ, ммм, а зачем верхняя часть.
Вы написали фи-ю, а потом вспомнили,что всё это делается одной строкой, но первый вариант удалить забыли. Да?

vadim5june 20.05.2012 19:00

Цитата:

Сообщение от melky (Сообщение 175625)
Декомпозиция-. разбиваешь задачу на подзадачи и решаешь. так может получиться -фасад.

Спасибо-посмотрю-

melky 20.05.2012 19:00

Цитата:

Сообщение от nasqad
melky, не предложите ли вы чего нибудь почитать заумного?
сам найду как настрой будет :3

на меня огромное впечатление произвела книга Крокфорда. может, и вам понравится.

beard 20.05.2012 19:24

Цитата:

Сообщение от melky (Сообщение 175633)
на меня огромное впечатление произвела книга Крокфорда. может, и вам понравится.

она уже едет ко мне, я вчера заказал :) Вместе с доставкой под дверь 100грн.

melky 21.05.2012 07:50

как много букв тратится на Toggle.prototype

Раед 21.05.2012 16:32

Maxmaxmахimus,
А не лучше ли прототип объектом присвоить.
/**
 * Переключатель.
 * Имеет 2 состояния.
 * Если включен, то возвращает хранимое значение,
 * если выключен, то возвращает undefined.
 * По умолчанию включен
 *
 * @param value - значение
 * @constructor
 */
function Toggle ( value ) {
    this._state = true;
    this._value = value;
}
Toggle.prototype = {
 on : function() {
    this._state = true;
 },
 off : function () {
    this._state = false;
 },
 toggle : function () {
    this._state = !this._state;
 },
 state : function () {
    return this._state;
 },
 value : function ( value ) {
 
    if (  arguments.length < 0 ) {
        this._value = value;
    }
    else if ( this._state ) {
        return this._value;
    }
 }
}

Джэксон 21.05.2012 16:45

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

melky 21.05.2012 18:25

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 175762)
Так же приходится фиксить конструктор.
<...>
то накладывает впечатление не правильного использования системы прототипов.

поясни и первое, и второе.

что тут не так ?

function a(b){ 
  this.b = b; this.scream(); 
}

a.prototype = { 
  scream: function(){
    alert(this.b + ", World!")
  } 
};

new a("Hello");

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 175762)
То есть ЛУЧШЕ для производительности ?? да. Лучше вообще все в одну строку написать, или вообще сразу бинарниками писать)

код из твоего примера:
Hash.prototype.keys = function () {
	var elements = this._elements,
		keys = [];

	for ( var key in elements ) if ( elements.hasOwnProperty( key ) ) {
		keys.push( key );
	}

	return /*массив ключей*/;
};

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

Раед 21.05.2012 19:03

Цитата:

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

А что быстрее, хранить имена всех свойств в массиве и когда нужно делать перебор циклом for, или юзать for-in

melky 21.05.2012 19:22

Цитата:

Сообщение от Раед (Сообщение 175794)
А что быстрее, хранить имена всех свойств в массиве и когда нужно делать перебор циклом for, или юзать for-in

Hash.prototype.keys возвращает массив. не нужно делать перебор.

for по массиву быстрее, чем for-in по объекту.

melky 22.05.2012 21:17

Цитата:

Сообщение от Maxmaxmахimus
melky,
ну во первых я уже писал что я просто забыл удалить лишнее

return Object.getOwnPropertyNames( this._elements );

если ты на серъёзе собираешься оставить эту строчку, то IE7, IE8, Opera будут срать кирпичами при каждом вызове keys.


Цитата:

Сообщение от Maxmaxmахimus
Так же нет свойства lenght которое бы постоянно изменялось, есть метод count, то есть когда НУЖНО, то можешь посчитать количество элементов и закэшировать. В остальыне же моменты на это ресурсы не тратятся.

Ы. тут ситуация такая же, как и у свойства length у массивов в старых браузерах (напомню, он не кешировался)
Цитата:

Сообщение от Maxmaxmахimus
операций по получению ключей меньше чем операций с работой с элементами хэша.

return cached_keys;
// vs
for(i in elements) keys.push(i);
return keys;

ты так думаешь? "просто вернуть" и "перебрать".
Цитата:

Сообщение от Maxmaxmахimus
Или когда НУЖНО просто ПОСЧИТАТЬ эти ключи.

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

Сообщение от Maxmaxmахimus
что лучше ВСЕГДА кэшировать ключи. При любых операциях дергать этот кэш.

при добавлении добавляешь в кэш. при удалении - удаляешь. это все операции с изменением кеша.

PS. а давай протестируем Hash на больших данных? что голословить...

Раед 22.05.2012 22:05

Ещё такой вопрос: что считаете правильнее, использовать замыкания или _доверится _соглашению _программистов?

melky 22.05.2012 22:52

Цитата:

Сообщение от Раед (Сообщение 176118)
Ещё такой вопрос: что считаете правильнее, использовать замыкания или _доверится _соглашению _программистов?

тут надо всё взвесить. лучшего варианта нет.
  • устойчивость кода к воздействиям извне
    замыкания
    если код не дает возможности изменить её, то её не изменить, т.е. устойчивость высокая.
    соглашение
    можно изменить, как и любое свойство (конечно, если не запретить изменение\конфигурировани свойства в дескрипторе)
  • простота использования
    замыкания

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

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

    после сжатия в GCC в advanced mode могут возникнуть проблемы, если такие приватные свойства будут переименовываться минификатором.
    если сохранять имена - то может страдает качество сжатия кода.
я, вероятно, не всё учел. пишите, может быть, добавлю в ФАК .

nerv_ 22.05.2012 22:54

Цитата:

Сообщение от Maxmaxmахimus
Лучше, только потом конструктор не забывай поправлять.

что скажите на этот счет? (от поста по ссылке, до конца темы)

Функция inherit для эмуляции Object.create(proto)

Раед 22.05.2012 23:54

Цитата:

Сообщение от Maxmaxmахimus
смотря какой паттерн юзаешь

Хороший вопрос.. Определить бы :)

melky 23.05.2012 00:12

Цитата:

Сообщение от Maxmaxmахimus
ну я же описаал, ты чем читал вообще. я описал что это более затратно и описал почему.

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

я лучше болт забью, чем буду вникать в твои посты, путающие смысл.
Цитата:

Сообщение от Maxmaxmахimus
/** @private */ для кого придумали?

тюю... точно. я забыл.


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