2015-12-05 9 views
1

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

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

Если это не имеет значения, это будет верно и для сгенерированного javascript * .dart.js?

Редактировать: После прочтения моего собственного вопроса это не очень согласовано. Я попытаюсь сформулировать его снова, но яснее.

Этот код ...

class MyClass { 
    void foo() {} 
} 

void main() { 
    MyClass a = new MyClass(); 
    MyClass b = new MyClass(); 

    print(a.foo == b.foo); 
} 

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

PS: Вопрос в основном такой же, как this question, но затем для Dart.

+0

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

ответ

2

Классы Dart не имеют разных методов для разных экземпляров. Существует только один метод для каждого класса.

Распаковка функция создает новый объект функции каждый раз, когда вы это делаете, и эти объекты могут или не могут быть равны в зависимости от того, какие функции вы извлекаете из которых объекты:

class MyClass { 
    void foo() {} 
} 

void main() { 
    MyClass a = new MyClass(); 
    MyClass b = new MyClass(); 

    print(a.foo == b.foo); // False. 
    print(a.foo == a.foo); // True 
    print(identical(a.foo, a.foo)); // False! 
} 

При выполнении извлечение метода из объекта, вы создаете новый объект. Новый объект - это «закрытие», которое содержит функцию для вызова и объект для ее вызова. Два таких замыкания равны (согласно оператору ==), если они ссылаются на ту же функцию на на тот же объект. Вот почему a.foo и b.foo не равны - они эквивалентны () => a.foo() и () => b.foo() соответственно, а так как a и b - это не тот же объект, объекты функции не считаются равными.

3

Нет, создание двух экземпляров не дублирует методы. Методы похожи на статические функции, в которых экземпляр объекта передается в качестве аргумента с именем this.

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