Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 119 120 [121] 122 123 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#1801
,
|
|
|
|
Тут главное определить - кто владеет каждым набором данных и какой к ним предоставляется интерфейс. Подвешивать id в глобальной области видимости - явный огрех проектирования. Как только твой модуль начнут использовать в многопоточных приложениях, будут долго чесать голову, откуда баги лезут =) Добавлено Цитата korvin @ не, если б в С++ были как в Яве/C# только классы и их члены, без возможности объявить "простые" переменные и функции, не относящиеся ни к какому классу, вопросов бы не было. а так получается, что язык вроде и позволяет писать без классов, но никаких гарантий модульности не предоставляет. Гарантии модульности предоставляют программисты. Язык предоставляет возможности обеспечивать такие гарантии, не запрещая при этом стрелять в ногу =) |
|
Сообщ.
#1802
,
|
|
|
|
Цитата Мяут-Настоящий @ Тут главное определить - кто владеет каждым набором данных и какой к ним предоставляется интерфейс. Подвешивать id в глобальной области видимости - явный огрех проектирования. Как только твой модуль начнут использовать в многопоточных приложениях, будут долго чесать голову, откуда баги лезут =) перепиши мой код "по-правильному" Добавлено Цитата Мяут-Настоящий @ Гарантии модульности предоставляют программисты. Язык предоставляет возможности обеспечивать такие гарантии, не запрещая при этом стрелять в ногу =) вот делфи и предоставляет такую возможность, в C++ же нужно эту возможность реализовывать самому =) |
|
Сообщ.
#1803
,
|
|
|
|
![]() ![]() class GenericString { private: int id; public: GenericString() : id(0) { } std::string operator()(std::string prefix) { std::stringstream ss; ss << prefix << id++; return ss.str(); } } ; std::string genstr(std::string prefix) { static GenericString Generator = GenericString(); return Generator(prefix); } Цитата korvin @ вот делфи и предоставляет такую возможность, в C++ же нужно эту возможность реализовывать самому =) Самому-не самому, но мой метод более гибкий ;-) |
|
Сообщ.
#1804
,
|
|
|
|
Цитата Мяут-Настоящий @ ![]() ![]() class GenericString { private: int id; public: GenericString() : id(0) { } std::string operator()(std::string prefix) { std::stringstream ss; ss << prefix << id++; return ss.str(); } } ; std::string genstr(std::string prefix) { static GenericString Generator = GenericString(); return Generator(prefix); } Цитата korvin @ вот делфи и предоставляет такую возможность, в C++ же нужно эту возможность реализовывать самому =) Самому-не самому, но мой метод более гибкий ;-) о боже... и где тут я должен увидеть потокобезопасность? оператор '++' потокобезопасен? в чем большая гибкость твоего метода? |
|
Сообщ.
#1805
,
|
|
|
|
Цитата korvin @ в C++ же нужно эту возможность реализовывать самому =) Что значит реализовывать самому? - Конструктор - это initialization - class - это аналог unit - Интерфейс, реализация - выполняется аналогично Ну а если уж очень хочется пощеголять ключевыми словами, используй #define |
|
Сообщ.
#1806
,
|
|
|
|
Цитата Мяут-Настоящий @ - Конструктор - это initialization - class - это аналог unit - Интерфейс, реализация - выполняется аналогично Ну а если уж очень хочется пощеголять ключевыми словами, используй #define ![]() а давай без классов? для простых переменных и функций, их же никто писать не запрещает? и таки не занимай пространство имен типов! =) |
|
Сообщ.
#1807
,
|
|
|
|
Цитата korvin @ о боже... и где тут я должен увидеть потокобезопасность? оператор '++' потокобезопасен? Нет, но у меня id - инкапсулирован, и поэтому гарантируется, что при реализации потокобезопасности поправить код нужно только в одном месте - GenericString. Цитата korvin @ в чем большая гибкость твоего метода? На основе GenericString шаблонами и наследованием можно плодить генераторы. Для начала создав например генератор, начинающий числа не с нуля =) Добавлено Цитата korvin @ и таки не занимай пространство имен типов! =) У нас нет такой проблемы. Если все совсем плохо - можно обернуть все в namespace. Цитата korvin @ а давай без классов? для простых переменных и функций, их же никто писать не запрещает? А давай я буду показывать код на C++, чистый C в заголовке темы не заявлен. |
|
Сообщ.
#1808
,
|
|
|
|
Цитата Мяут-Настоящий @ если уж очень хочется пощеголять ключевыми словами расскажи про explicit, ага =) |
|
Сообщ.
#1809
,
|
|
|
|
Ну explicit это скорее одно из многих C++ных исключений чем правило =)
В общем случае C++ - старается быть лаконичным (отсюда кстати и проблема с читабельностью, что ты выше писал) |
|
Сообщ.
#1810
,
|
|
|
|
Цитата Мяут-Настоящий @ Нет, но у меня id - инкапсулирован, и поэтому гарантируется, что при реализации потокобезопасности поправить код нужно только в одном месте - GenericString. дык и у меня инкапсулирован =) и также максимум -- поправить genstr. Цитата Мяут-Настоящий @ На основе GenericString шаблонами и наследованием можно плодить генераторы. Для начала создав например генератор, начинающий числа не с нуля =) если б я хотел плодить генераторы, так бы и написал, мне нужен один общий, глобальный. гарантировано общий глобальный =) Цитата Мяут-Настоящий @ У нас нет такой проблемы. Если все совсем плохо - можно обернуть все в namespace. это не проблема, это факт, class занимает глобальное пространство имен типов. Цитата Мяут-Настоящий @ А давай я буду показывать код на C++, чистый C в заголовке темы не заявлен. как будто в С++ уже нельзя использовать неклассовые перееменные и функции, ага =) Добавлено Цитата Мяут-Настоящий @ Ну explicit это скорее одно из многих C++ных исключений чем правило =) В общем случае C++ - старается быть лаконичным (отсюда кстати и проблема с читабельностью, что ты выше писал) а namespace -- замена безымянного класса? =) |
|
Сообщ.
#1811
,
|
|
|
|
Цитата korvin @ дык и у меня инкапсулирован =) и также максимум -- поправить genstr. Что мешает какому-нибудь программисту взять и написать GenericString.id = 0? Цитата korvin @ это не проблема, это факт, class занимает глобальное пространство имен типов. ![]() ![]() namespace Internal { class A {}; } В каком месте класс A занимает глобальное пространство имен типов? Цитата korvin @ если б я хотел плодить генераторы, так бы и написал, мне нужен один общий, глобальный. гарантировано общий глобальный =) Я получил тот же результат на текущей итерации результат (общий глобальный), но более гибкую к изменениям систему (что есть плюс). Факт в том, что ты не знаешь заранее, что тебе никогда не потребуется плодить генераторы. |
|
Сообщ.
#1812
,
|
|
|
|
Цитата Мяут-Настоящий @ Что мешает какому-нибудь программисту взять и написать GenericString.id = 0? то, что оно находится в секции implementation и не видно извне модуля =) Добавлено Цитата Мяут-Настоящий @ Я получил тот же результат на текущей итерации результат (общий глобальный), но более гибкую к изменениям систему (что есть плюс). Факт в том, что ты не знаешь заранее, что тебе никогда не потребуется плодить генераторы. эм... знаю. это требование к генератору. Добавлено Цитата Мяут-Настоящий @ ![]() ![]() namespace Internal { class A {}; } а почему не ![]() ![]() class Internal { class A {}; } ? зачем нужно namespace, если по словам D_KEY классы в С++ покрывают все необходимости? =) |
|
Сообщ.
#1813
,
|
|
|
|
Погуглил. Так то шо ты показал сейчас - это ж даже в C есть.
![]() ![]() // genstr.h void genstr(char* dest, int n, const char* prefix); // genstr.c static int id = 0; void genstr(char* dest, int n, const char* prefix) { snprinf(dest, n, "%s%d", prefix, id++); } Добавлено Цитата korvin @ зачем нужно namespace, если по словам D_KEY классы в С++ покрывают все необходимости? =) namespace можно размазывать по библиотеке в 100 исходников. Добавлено В принципе id упаковываем в genstr |
|
Сообщ.
#1814
,
|
|
|
|
Цитата Мяут-Настоящий @ Погуглил. Так то шо ты показал сейчас - это ж даже в C есть. ![]() ![]() // genstr.h void genstr(char* dest, int n, const char* prefix); // genstr.c static int id = 0; void genstr(char* dest, int n, const char* prefix) { snprinf(dest, n, "%s%d", prefix, id++); } что мне мешает подключить genstr.c вместо genstr.h? и как тут с пространством имен, можно обратиться из внешнего кода к функции genstr как genstr.genstr (модуль.функция), а то вдруг какой-то еще модуль предоставляет функцию с такой сигнатурой? =) |
|
Сообщ.
#1815
,
|
|
|
|
Цитата korvin @ что мне мешает подключить genstr.c вместо genstr.h? Наличие мозга в черепной коробке? Цитата korvin @ и как тут с пространством имен, можно обратиться из внешнего кода к функции genstr как genstr.genstr (модуль.функция), а то вдруг какой-то еще модуль предоставляет функцию с такой сигнатурой? =) Не паясничай |