LINUX.ORG.RU

[C++] «Статичный» класс vs набор функций в неймспейсе?


0

2

Функции в отдельном пространстве имён:

namespace BitParser
{
bool getBitAt(int buffer, int bitIndex) {
    // Реализация
}

// Ещё десяток функций
}

Класс со статичными методами:

class BitParser
{
public:
    static bool getBitAt(int buffer, int bitIndex) {
        // Реализация
    }
    
    // Ещё десяток статичных методов.

private:
    /// Конструктор приватный, ведь такие объекты создавать нельзя.
    BitParser() {}
};

Что лучше и почему?

★★★★★

Опять C++? No way

В первом варианте вам меньше кода писать ;)

anonymous ()

Во втором варианте можно потом (когда передумаете о невозможности создание подобных объектов) хранит state парсера в кишках объекта, а не тянуть их в аргументах

anonymous ()
Ответ на: комментарий от anonymous

Точно подмечено. А ведь ещё можно чем-то типа «кеша» пользоваться и прочим. На самом деле, вопрос теоретический, парсер тут ни при чём.

Obey-Kun ★★★★★ ()
Ответ на: комментарий от anonymous

> 2 - ибо можно будет напихать приватных и прочих пропертей и методов

В первом случае можно ограничить область видимости static'ом. Насколько я понимаю, смысл вопроса был таким:

1) Нужно реализовать класс, объекты которого никогда не будут создаваться по определению, расширять не нужно и не планируется

2) Что если использовать не класс, а namespace? Какие плюсы/минусы, учитывая №1?

Господин топикстартер, я вас правильно понял?

anonymous ()

Вариант с неймспейсом чище.

Miguel ★★★★★ ()
Ответ на: комментарий от anonymous

> Нужно реализовать класс, объекты которого никогда не будут создаваться по определению, расширять не нужно и не планируется

Расширять — возможно. Но вот в каком направлении — фиг знает. Объекты создаваться не будут.

Что если использовать не класс, а namespace? Какие плюсы/минусы, учитывая №1?

Да.

Пока вижу только минусы — если захочется кеширования или типа того, то фиг вам, а не статичные поля.

Obey-Kun ★★★★★ ()
Ответ на: комментарий от Obey-Kun

> если захочется кеширования или типа того, то фиг вам, а не статичные поля

В *.h функции внутри namespace, в *.cpp есть static переменные для кэширования, при этом пользователь подключая *.h про это кэширование вообще ничего не знает. Чем плох этот вариант?

kamre ★★★ ()

Ассемблер идентичный. Синтаксис вызова одинаковый. Так какая разница? Разве что для нэймспейсов есть using.

unsigned ★★★ ()
Ответ на: комментарий от kamre

> В *.h функции внутри namespace, в *.cpp есть static переменные для кэширования, при этом пользователь подключая *.h про это кэширование вообще ничего не знает. Чем плох этот вариант?

А ведь верно... сделать на неймспейсах, что ли.

Obey-Kun ★★★★★ ()
Ответ на: комментарий от kamre

> ... в *.cpp есть static переменные для кэширования...

Что за моветон?! Анонимные неймспейсы!

k_andy ★★★ ()
Ответ на: комментарий от Obey-Kun

> Пока вижу только минусы — если захочется кеширования или типа того, то фиг вам, а не статичные поля.

Как уже заметили, статичные поля всё равно можно использовать.

Здесь у вас два варианта:

1) Абстракция в виде класса

2) Абстракция в виде модуля (грубо - файла)

Вибирайте, что больше подходит

anonymous ()
Ответ на: комментарий от unsigned

Ассемблер идентичный. Синтаксис вызова одинаковый. Так какая разница? Разве что для нэймспейсов есть using.

Инкапсуляция же ну.

Dudraug ★★★★★ ()
Ответ на: комментарий от Obey-Kun

> верно, а ведь снаружи нужны не все методы.

static тебя спасёт в случае не класса

anonymous ()

Не зная задачи трудно сказать... у каждого подхода есть свои плюсы и минусы. Если не изврщаться и пастись в рамках C++ не вытаскивая это еще куда то то пофик.

У класса ИМНО возможностей побольше - можно его испольщовать как параметр шаблона напр;-)

AIv ★★★★★ ()
Ответ на: комментарий от aho

> static функция в .cpp файле также скрыта

В плюсах static рекомендуется использовать только для локальных переменных. Для всего остального рекомендуется использовать анонимный namespace.

anonymous ()
Ответ на: комментарий от Kosyak

> Я, например, программируя на джаве, приобрел привычку всё в C++ делать в классах.

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

В общем философия у Java такая: 1) В основе всего лежит класс. 2) Если что-то не вписывается в ООП, основанный на классах, то смотри пункт 1.

anonymous ()
Ответ на: комментарий от Miguel

> Писать на C++ программы на жабе - не есть образец хорошего тона.

Жабисты по-другому писать уже не могут ибо безнадежно больны.

anonymous ()
Ответ на: комментарий от Kosyak

> Я и не говорил хорошо это или плохо. Просто привычка....

Огорчу вас - это болезнь. Зачем вам вообще С++, писали бы себе и дальше на жабе.

anonymous ()

> /// Конструктор приватный, ведь такие объекты создавать нельзя.

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

anonymous ()
Ответ на: комментарий от anonymous

вспомнилось

Программист на фортране может писать на фортане на любом языке.

Это прекрасно обобщается и на случай джавы, достаточно добавить пристафикс «ООП-» к языку. Даже есть живой пример - выше в треде.

anonymous ()
Ответ на: вспомнилось от anonymous

Re: вспомнилось

Ммм, наверное не все видели этот чудный язык, если не застали - ищите примеры. Там такое... Ужс

anonymous ()

> Что лучше и почему?

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

Да и потом, что это за класс у которого нет ни одного не статического метода? Если бы вы прочитали Страуструпа, то узнали бы его точку зрения: класс должен содержать только функции-члены, которым действительно(!) нужен доступ к данным-членам.

anonymous ()

первый вариант. второй при отсутствии существенных аргументов порождает bloatware и прочий overdesign

jtootf ★★★★★ ()
Ответ на: комментарий от tailgunner

> Первый вариант.

Есть все-таки еще на лоре разумные люди.

anonymous ()
Ответ на: комментарий от jtootf

> первый вариант

Еще один разумный человек. Зн-т лор еще не совсем скатился.

anonymous ()
Ответ на: комментарий от Dudraug

Инкапсуляция же ну.

Инкапсуляцию придумали/открыли раньше, чем классы.

unsigned ★★★ ()

Много флейма, но при этом местные C++ники забыли, что на функцию под namespace'ом можно сделать предварительное объявление, в отличии от статической функции под классом.

Dendy ★★★★★ ()
Ответ на: комментарий от anonymous

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

Dudraug ★★★★★ ()
Ответ на: комментарий от Dudraug

> все файлы проекта включаются в один инклудами

я вас удивлю, но в 2009 году в gcc смержили ветку по этому самому lto, когда компилятор делает тоже самое, но по умному, а в msvc это было еще раньше

aho ()
Ответ на: комментарий от Dudraug

> А если комилятор нужен gcc 3.x

тогда не буду спорить - раз других вариантов нет, то значит их нет

aho ()
Ответ на: комментарий от Dudraug

> Когда в целях оптимизации по размеру все файлы проекта включаются в один инклудами, а потом этот файл уже компилится. Вот.

Как статик функция здесь будет мешать? У вас что, есть функции с одинаковыми названиями?

anonymous ()
Ответ на: комментарий от Dudraug

> Допустим есть и что?

значит это либо дублирование кода - потенциальные ошибки, либо небрежное отношение к именованию функций

aho ()
Ответ на: комментарий от Dudraug

> > У вас что, есть функции с одинаковыми названиями?

Допустим есть и что?

Быдлокод. Ещё и небось в одном namespace?

anonymous ()
Ответ на: комментарий от aho

значит это либо дублирование кода - потенциальные ошибки, либо небрежное отношение к именованию функций

статик функция же. В реальных проектах, которые постоянно развиваются и изменяются можно и не такое встретить

Dudraug ★★★★★ ()
Ответ на: комментарий от Dudraug

> >значит это либо дублирование кода - потенциальные ошибки, либо небрежное отношение к именованию функций

статик функция же. В реальных проектах, которые постоянно развиваются и изменяются можно и не такое встретить

В реальных проектах такое гогно вырезается при первом обнаружении.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.