Очистка создание класса / расширение


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

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

Исходный код и тестовые случаи здесь.

function is(type, obj) {
    return Object.prototype.toString.call(obj).slice(8, -1) === type;
}
function copy(val) { /* ...make shallow copy */ }
function wrap(caller, obj) {
    obj = obj || Function.call;
    return function() {
        return obj.apply(caller, arguments);
    };
}

function Class(ctor) {
    // ...default ctor stuff here....
    function clas(args) { /* ...actual instance ctor stuff... */}

    var proto = {};
    clas.init = wrap(ctor);

    // extend needs to be reduced in width, it easily goes over 80 columns
    // without some ugly if statements
    clas.extend = function(ext) {
        if (is('Function', ext)) {
            return ext.extend(proto); // holy closure!
        }

        for (var e in ext) {
            if (!ext.hasOwnProperty(e)) {
                continue; // a bit ugly imo, but it helps to prevent the indentation
                          // from blowing up
            }

            // this needs some refactoring, it creates bound and unbound
            var val = ext[e], func = is('Function', val);
            if (/^\$/.test(e)) { // statics
                proto[e] = copy(val);
                clas[e] = clas.prototype[e] = func ? wrap(clas, val) : val;

            } else if (func) {
                clas[e] = wrap(proto[e] = clas.prototype[e] = val);
            }
        }
        return clas;
    };

    // this could also need some clean up I suppose
    for (var i = ctor.hasOwnProperty('init') ? 0 : 1,
             l = arguments.length; i < l; i++) {

        var arg = arguments[i];
        is('Object', arg) ? clas.extend(arg) : arg.extend(clas);
    }
    return clas;
}


890
19
задан 20 января 2011 в 10:01 Источник Поделиться
Комментарии
1 ответ

Несколько советов:


  • Убедитесь, что вы используете хорошие вмятины

  • Не создать функцию, которая запускает собственный метод

    • так: если(есть("функция",ВН)) становится если(typeof на внутр == "функция")


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

  • Не сократить ваши переменные, так как это приводит к проблемам с последним разработчики

  • использование более жестких типажей:

    • если (!ВН.метод hasOwnProperty(е)) будет если(ВН.метод hasOwnProperty(е) == ложь)


  • Держите ваши условия для петель на одной линии

  • Нет никакого смысла в перераспределении значение из массива, потому что вы хотите, чтобы отправить его в функцию

    • ВАР арг = аргументы[я]; удаляется и аргументы[я] отправлено в функцию


С учетом выше ваш класс будет выглядеть так:

function Class(ClassBase)
{
/*
* Default Constructor, used to do XXX with YYY
*/
var Arguments = args || [];

function __Class(Arguments)
{

}

var Prototype = {};
__Class.Initialize= Wrap(ClassBase);

/*
* extend needs to be reduced in width, it easily goes over 80 columns
* without some ugly if statements
*/

__Class.Extend = function(ExtendableEntity)
{
if (typeof ExtendableEntity == "function")
{
return ExtendableEntity.extend(Prototype);
}

for (var Entity in ExtendableEntity)
{
if (ext.hasOwnProperty(Entity) == true)
{
var Value = ext[Entity]
var _Function = (typeof Value == "function");

if (/^\$/.test(Entity))
{
Prototype[Entity] = Copy(Value);
__Class[Entity] = __Class.Prototype[Entity] = function ? Wrap(__Class, Value) : Value;
}else
{
__Class[Entity] = Wrap(Prototype[Entity] = __Class.Prototype[Entity] = Value);
}
}
}
return __Class;
}

for (var i = ClassBase.hasOwnProperty('Initialize') ? 0 : 1, l = Arguments.length; i < l; i++)
{
(typeof Arguments[i] == 'object') ? __Class.Extend(Arguments[i]) : Arguments[i].Extend(__Class);
}
return __Class;
}

1
ответ дан 20 января 2011 в 12:01 Источник Поделиться