2008-09-07 7 views
28

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

я наткнулся на следующее недавно: http://www.cafeaulait.org/course/week4/22.html:

Когда метод должен быть статическим?

  1. Ни читает, ни пишет полей экземпляр
  2. независимых от состояния объекта
  3. Математических методов, которые принимают аргументы, применить алгоритм этих аргументов и возвращают значение
  4. Фабричных методы которые служат вместо конструкторов

Я был бы очень заинтересован в обратной связи Stack Переполнение сообщества на этом.

ответ

20

Сделать методы статическими, если они не являются частью экземпляра. Не потейте микрооптимизации.

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

15

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

1

Поведенческий подход, статический метод C++ может быть немного быстрее, чем метод не виртуального экземпляра, так как нет необходимости в указателе этого «этого», чтобы передать метод. В свою очередь, оба будут быстрее, чем виртуальные методы, так как нет необходимости в поиске VMT.

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

+0

Справа в полностью оптимизированном компиляторе, когда это имеет значение (большую часть времени). – 2008-09-17 18:45:56

+0

Он не может быть оптимизирован в C++. Вызывающий не имеет возможности узнать, что вызываемый не собирается использовать «это», поэтому должен пройти его независимо. Для других языков YMMV. – Roddy 2008-09-29 15:39:44

2

@jagmal Я думаю, что у вас есть какие-то провода, скрещенные где-то - все приведенные вами примеры явно не являются статическими методами.

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

Для примера автомобиля скорость, кмс ведомая, явно связана с атрибутом. Распределение передач и скорость вычислений, если они рассматриваются на уровне автомобиля, зависят от атрибутов, но рассматривают класс carModel, который наследуется от автомобиля: в этот момент они могут стать статическими методами, поскольку требуемые атрибуты (например, диаметр колеса) можно определить как константы на этом уровне.

+3

Вы правы. У меня действительно было что-то смешное. Может быть, потому, что я был лишен сна в те дни. В духе SO, я удалил комментарий, и я не думаю, что у меня есть что-то большее, чем то, что люди уже сказали. В любом случае спасибо. – Jagmal 2008-09-29 20:14:04

2

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

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

Эта идея взята из an article by Steve Yegge, что я считаю интересным и полезным для чтения.

12

Другая проблема со статическими методами заключается в том, что для них довольно сложно писать модульные тесты для них - по крайней мере, на Java. Вы никак не можете издеваться над статическим методом. Существует post on google testing blog about this issue.

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

0

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