Всего один jQuery слишком много:
$("[id$=" + endOfIdToMatch + "]").each(function () {
alert(this.tagName);
});
По умолчанию используются функции с пространством имен.
Классы предназначены для создания объектов, а не для замены пространств имен.
Скотт Мейерс написал целую статью для своего Эффективного Книга C ++ по этой теме: «Предпочитайте функции-члены, не являющиеся членами, не дружественными функциями». Я нашел онлайн-ссылку на этот принцип в статье Херба Саттера: http://www.gotw.ca/gotw/084.htm
Важно знать следующее: В функциях C ++ в том же пространстве имен, что и класс, принадлежат к интерфейсу этого класса (потому что ADL будет искать эти функции при разрешении вызовов функций).
Функции с именами, если они не объявлены как «друг», не имеют доступа к внутренним компонентам класса, тогда как статические методы имеют.
Это означает, например, что при поддержке вашего класса если вам нужно изменить внутреннее устройство вашего класса, вам нужно будет искать побочные эффекты во всех его методах, включая статические.
Добавление кода в интерфейс класса.
В C #, вы можете добавлять методы в класс, даже если у вас нет к нему доступа. Но в C ++ это невозможно.
Но, все еще в C ++, вы все равно можете добавить функцию с пространством имен даже в класс, который кто-то написал для вас.
Посмотрите с другой стороны, это важно при разработке вашего кода , потому что, помещая свои функции в пространство имен, вы разрешаете своим пользователям увеличивать / дополнять интерфейс класса.
Побочный эффект предыдущего пункта, невозможно объявлять статические методы в нескольких заголовки. Все методы должны быть объявлены в одном классе.
Для пространств имен, Классы предназначены для классов.
C ++ был разработан таким образом, что каждая концепция отличается и используется по-разному, в разных случаях, как решение разных проблем.
Не используйте классы, когда вам нужны пространства имен.
И в В вашем случае вам нужны пространства имен.
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).
Вам следует использовать пространство имен, потому что пространство имен имеет множество преимуществ перед классом:
использовать
член класса; вы можете использовать
член пространства имен использовать класс
, хотя с использованием пространства имен
часто не является хорошей идеей Статические члены, на мой взгляд, очень часто используются. В большинстве случаев они не являются реальной необходимостью. Статические функции-члены, вероятно, лучше использовать как функции файловой области, а статические элементы данных - это просто глобальные объекты с лучшей, незаслуженной репутацией.
Я бы предпочел пространства имен, так вы можете иметь личные данные в анонимном пространстве имен в файле реализации (чтобы они вообще не отображались в заголовке, в отличие от ] частные
участников). Еще одно преимущество заключается в том, что, используя
ваше пространство имен, клиенты методов могут отказаться от указания MyMath ::
В противном случае используйте функции с именами.
В ответ на комментарии: да, статические методы и статические данные, как правило, используются чрезмерно. Вот почему я предложил только два связанных сценария, в которых я думаю, что они могут быть полезны. В конкретном примере 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;
Если вам это не нужно, тогда непременно используйте пространство имен.