Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

yaji - ещё один вариант наследования (WingedFox, оценка: 1)
Goto page Previous  1, 2, 3
Author Message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Fri Mar 07, 2008 5:05 pm (написано за 2 минуты 12 секунд)
   Post subject:
Reply with quote

alexkunin
Я говорю про тестирование, в первую очередь =)
Пока не будет именно нормальной методики - смысла в тесте нет, потому как он ничего не отражает.

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

PS: мне вполне хватает и моего наследования из 1 функции =)
Back to top
View user's profile Send private message
alexkunin
Участник форума



Joined: 25 Feb 2006
Posts: 113
Карма: 11
   поощрить/наказать


PostPosted: Fri Mar 07, 2008 5:12 pm (спустя 7 минут; написано за 5 минут 15 секунд)
   Post subject:
Reply with quote

WingedFox wrote:
Я говорю про тестирование, в первую очередь =)
Пока не будет именно нормальной методики - смысла в тесте нет, потому как он ничего не отражает.
Да, конечно, ранняя оптимизация (тем более на этапе создания методики :) есть зло.
WingedFox wrote:
Кстати, приведите пример реализации тех самых замыканий, на предмет которых пинали мой вариант =)
Э, да все то же:
Code (JavaScript): скопировать код в буфер обмена
var B = A.extend(function (Super) { return {
        sin:function () {
                var cache = {};
                return function (x) {
                        if (cache[x] === undefined) {
                                cache[x] = Math.sin(x);
                        }
                        return cache[x];
                };
        }()
}});
Вместо sin можно подставить любую другую емкую операцию. Например, сходить на сервер XHR-ом за чем-то эдаким. Можно переформулировать и под ваш вариант. Но будет не так изящно, что ли. Типа дзен. Вещь в себе.

Super здесь не нужен, конечно же. Но и не помешает, разве что для вас имеют значение те две миллисекунды во время подгрузки-парсинга скрипта.
Back to top
View user's profile Send private message Send e-mail
alexkunin
Участник форума



Joined: 25 Feb 2006
Posts: 113
Карма: 11
   поощрить/наказать


PostPosted: Fri Mar 07, 2008 5:15 pm (спустя 2 минуты; написано за 1 минуту 14 секунд)
   Post subject:
Reply with quote

WingedFox wrote:
PS: мне вполне хватает и моего наследования из 1 функции =)
Вы же понимаете, я тоже мог бы выразиться в одну функцию. И использовать f вместо BlankConstructor. Вначале так и было. Но стараюсь читабельности кода (особенно выкладываемого в публичных местах) уделять повышенное внимание.
Back to top
View user's profile Send private message Send e-mail
alexkunin
Участник форума



Joined: 25 Feb 2006
Posts: 113
Карма: 11
   поощрить/наказать


PostPosted: Mon Mar 10, 2008 2:29 pm (спустя 2 дня 21 час 13 минут; написано за 12 минут 18 секунд)
   Post subject:
Reply with quote

А вот и результаты более разнообразных тестов (код в аттаче; если запустить test3.html, то будет все видно как на ладони; сам тестил только в Сафари).
Соревнующиеся (достоинства, недостатки и оговорки уже вроде все давно определены)
  1. No Sugar - "чистое" наследование, как по книжкам; многословное
  2. Sugar "WF" - метод WingedFox'а с перезамыканиями
  3. Sugar "AK" - предложенная мною функция Sugar
Малое количество наследуемых методов
  1. No Sugar и Sugar "WF" весьма близки по производительности (WF даже быстрее - селекторы покороче получаются)
  2. все методы с увеличением глубины наследования, понятное дело, замедляются, но AK - в два раза проигрывает
Десяток наследуемых методов
  1. классика и AK - все то же самое
  2. WF - заметно медленнее создаются экземпляры; скорость вызовов на том же отличном уровне
Сотня наследуемых методов
  1. классика и AK - все то же самое
  2. WF - жуткое замедление создания экземпляров; скорость вызовов - опять вне конкуренции
Резюме
  1. много "глубоких" вызовов? классика или WF
  2. нужно глубокое наследование? классика или АК
  3. много экземпляров? классика или (если не феноменально глубокое наследование) АК
  4. нужен сахар? WF или АК
Я бы сказал, что сахар у WF выглядит заметно получше моего (только б вот extend не просто так болтался, а был бы "статическим" методом - вообще хорошо было бы).


Archive.zip
 Description:
код тестов

Download
 Filename:  Archive.zip
 Filesize:  3.19 KB
 Downloaded:  614 Time(s)

Back to top
View user's profile Send private message Send e-mail
alexkunin
Участник форума



Joined: 25 Feb 2006
Posts: 113
Карма: 11
   поощрить/наказать


PostPosted: Mon Mar 10, 2008 10:36 pm (спустя 8 часов 7 минут; написано за 7 минут)
   Post subject:
Reply with quote

Увы, немного ошибся в тестах из предыдущего поста: по методу WF нужно вызывать не parent.func1(), а parent.func1.call(this). Впрочем, на конечный результат это почти не повлияло.

И теперь вот окончательный вариант: совмещение моего Super и WingedFox'овского parent. Сначала резюме результатов: практически ноздря в ноздрю с "классикой" и по созданию экземпляра, и по вызову метода. В Сафари 3 цифры просто совпадают, в Файрофоксе 3 создание экземпляра чуть-чуть медленнее "классики", зато вызов метода чуть-чуть быстрее (в фоксе различие между a.b.c() и a.b.c.d() значительно заметнее, чем в сафари). Ну и, конечно же, никаких проблем с замыканиями и дебагом.
Code (JavaScript): скопировать код в буфер обмена
AK.extend5 = function () {
    function inherit(dolly) {
        function Clone() {}
        Clone.prototype = dolly;
        return new Clone();
    }

    function enhance(parent, newProperties) {
        var child, property;

        if (typeof newProperties === 'function') {
            newProperties = newProperties(parent);
        }

        if (!newProperties.hasOwnProperty('constructor')) {
            newProperties.constructor = function () {
                parent.constructor.apply(this, arguments);
            };
        }

        child = inherit(parent);

        for (property in newProperties) {
            if (newProperties.hasOwnProperty(property)) {
                child[property] = newProperties[property];
            }
        }

        child.prototype = parent;

        child.constructor.prototype = child;

        child.constructor.extend = function (newProperties) {
            return enhance(this.prototype, newProperties).constructor;
        };

        return child;
    }

    return function (prototype, newProperties) {
        return enhance(prototype, newProperties).constructor;
    };
}();
Полный код для всех тестов в аттаче. Быстрее вроде уже некуда. Можно считать готовым решением, разве что какие баги закрались.


Archive.zip
 Description:
исходный код + тесты

Download
 Filename:  Archive.zip
 Filesize:  3.55 KB
 Downloaded:  606 Time(s)

Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Tue Mar 01, 2011 5:02 pm (спустя 2 года 11 месяцев 18 дней 18 часов 26 минут; написано за 9 минут 33 секунды)
   Post subject:
Reply with quote

alexkunin wrote:
А можно даже так:
Code (JavaScript): скопировать код в буфер обмена
var B = A.extend(function (Super) { return {
        method1:function (a) {
                return Super(this).method1(a + 2);
        }
}});
Super как бы кастует на this прототип на один уровень раньше по цепочке. Опять же, реализация мне кажется тривиальной, причем не нужно трудиться для каждого экземпляра, хотя при этом каждый вызов будет на два дполнительных "пустых" вызова длиннее - Super и обертка над method1. От parent.method1.call(this, a + 2) отличается тем, что кишков таки не видно, ИМХО.
Прошло почти три года и я задумал добавить пару замечаний в это обсуждение. Это красивое решение можно было бы улучшить, так чтобы Super был внутри метода Inheritance.extend. Тогда реализация упростилась бы без потери заявленного функционала.
Плюсы и минусы реализации те же, но требуется оговорка о сакральном смысле слова Super (parent, superclass, clazz inherited или какое-то еще имя для создания ссылки на родителя).
Code (JavaScript): скопировать код в буфер обмена
var B = A.extend({
        method1:function (a) {
                return Super(this).method1(a + 2);
        }
}});
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 82
   поощрить/наказать


PostPosted: Tue Mar 01, 2011 8:52 pm (спустя 3 часа 50 минут; написано за 25 секунд)
   Post subject:
Reply with quote


М

Rumata,
я тогда балл теме прибавлю. Пусть висит повыше, раз она еще актуальна и интересна.
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Tue Mar 01, 2011 10:08 pm (спустя 1 час 15 минут; написано за 40 секунд)
   Post subject:
Reply with quote

Александр Михалицын
Не так чтобы и актуальна. Она интересна скорее теоретическими выкладками.
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Wed Mar 02, 2011 2:44 pm (спустя 16 часов 35 минут; написано за 38 секунд)
   Post subject:
Reply with quote

Rumata
Тут есть одна проблема - Super является не просто словом, а ссылкой на реализацию родителя.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Goto page Previous  1, 2, 3
Page 3 of 3    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML