Пространство имен + функционирует по сравнению со статическими методами для класса

Всего один jQuery слишком много:

$("[id$=" + endOfIdToMatch + "]").each(function () {
    alert(this.tagName);
});
268
задан Stephen Canon 16 September 2009 в 09:00
поделиться

5 ответов

По умолчанию используются функции с пространством имен.

Классы предназначены для создания объектов, а не для замены пространств имен.

В объектно-ориентированном коде

Скотт Мейерс написал целую статью для своего Эффективного Книга C ++ по этой теме: «Предпочитайте функции-члены, не являющиеся членами, не дружественными функциями». Я нашел онлайн-ссылку на этот принцип в статье Херба Саттера: http://www.gotw.ca/gotw/084.htm

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

Функции с именами, если они не объявлены как «друг», не имеют доступа к внутренним компонентам класса, тогда как статические методы имеют.

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

Расширение I

Добавление кода в интерфейс класса.

В C #, вы можете добавлять методы в класс, даже если у вас нет к нему доступа. Но в C ++ это невозможно.

Но, все еще в C ++, вы все равно можете добавить функцию с пространством имен даже в класс, который кто-то написал для вас.

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

Расширение II

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

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

C ++ был разработан таким образом, что каждая концепция отличается и используется по-разному, в разных случаях, как решение разных проблем.

Не используйте классы, когда вам нужны пространства имен.

И в В вашем случае вам нужны пространства имен.

227
ответ дан 23 November 2019 в 02:22
поделиться

There are a lot of people who would disagree with me, but this is how I see it:

A class is essentially a definition of a certain kind of object. Static methods should define operations that are intimately tied to that object definition.

If you are just going to have a group of related functions not associated with an underlying object or definition of a kind of object, then I would say go with a namespace only. Just for me, conceptually, this is a lot more sensible.

For instance, in your case, ask yourself, "What is a MyMath?" If MyMath does not define a kind of object, then I would say: don't make it a class.

But like I said, I know there are plenty of folks who would (even vehemently) disagree with me on this (in particular, Java and C# developers).

53
ответ дан 23 November 2019 в 02:22
поделиться

Вам следует использовать пространство имен, потому что пространство имен имеет множество преимуществ перед классом:

  • Вам не нужно определять все в одном заголовке
  • Вам не нужно показать всю вашу реализацию в заголовке
  • Вы не можете использовать член класса; вы можете использовать член пространства имен
  • Вы не можете использовать класс , хотя с использованием пространства имен часто не является хорошей идеей
  • class подразумевает, что существует какой-то объект, который должен быть создан, хотя на самом деле его нет

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

12
ответ дан 23 November 2019 в 02:22
поделиться

Я бы предпочел пространства имен, так вы можете иметь личные данные в анонимном пространстве имен в файле реализации (чтобы они вообще не отображались в заголовке, в отличие от ] частные участников). Еще одно преимущество заключается в том, что, используя ваше пространство имен, клиенты методов могут отказаться от указания MyMath ::

3
ответ дан 23 November 2019 в 02:22
поделиться
  • Если вам нужны статические данные, используйте статические методы.
  • Если это функции шаблона, и вы хотите иметь возможность указать набор параметров шаблона для всех функций вместе, используйте статические методы в шаблонном классе.

В противном случае используйте функции с именами.


В ответ на комментарии: да, статические методы и статические данные, как правило, используются чрезмерно. Вот почему я предложил только два связанных сценария, в которых я думаю, что они могут быть полезны. В конкретном примере OP (набор математических подпрограмм), если ему нужна возможность указывать параметры - скажем, базовый тип данных и точность вывода - которые применялись бы ко всем подпрограммам, он мог бы сделать что-то вроде:

template<typename T, int decimalPlaces>
class MyMath
{
   // routines operate on datatype T, preserving at least decimalPlaces precision
};

// math routines for manufacturing calculations
typedef MyMath<double, 4> CAMMath;
// math routines for on-screen displays
typedef MyMath<float, 2> PreviewMath;

Если вам это не нужно, тогда непременно используйте пространство имен.

16
ответ дан 23 November 2019 в 02:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: