С>// В объявлении класса
С>CString tax(_T("1000$"));
С>// В его методе (другой файл, строка так пятитысячная)
С>CString (или std::string) = CFormatString("его возраст - %i лет, его з/п - %.2f, имя ему - %s")
С><< age << tax << name;
С>
С>Разве использование хоть какого-нибудь класса может избавить от такой ошибки?
Это смотря как ты класс CFormatString напишешь. Можно при несовпадении форматного параметра и типа переданного параметра, писать в Trace.log сообщение, кто тебе мешает?
С>Даже если не вылетит исключение, строка не будет корректно отформатирована, что уже — run-time ошибка. По мне, так лучше принтф, он хоть всё повешает,
А вот это уже как повезет... Самое обидное будет, если на твоей машине это работает, неправильный printf испортил не очень важные данные, а у заказчика dump-ит core-у. И что ты с этим будешь делать?
C> а некорректную строку можно и в final release пропустить.
Лучше уже в final release пропустить некорректную строку, чем "хрен знает из-за чего падение". А как ты собираешься в большом приложение выяснять какой именно printf уронил всю систему, я не понимаю...
С>Конечно, если глаза не растут из зада и с помощью Вассиста мы отследим такую ошибку, но коим образом правильная ОО-организация заменяет нам венгерку?
Дык, все просто — неправильная вывод строки для меня, как заказчика, всегда дешевле, чем падение целой системы.
зы
Т.е. априори в системе всегда есть ошибки, так надо просто уменьшить цену их проявления... ОО, а в следствии, этого ненужность венгерки, эту цену уменьшает.
Насколько я понимаю противники венгерской записи предлагают "верблюда" (особенно для C# и проч). Но тут появляется проблема. Допустим я пишу объект на C# в котором есть проперти Count. Как мне обозвать поле класса, которое его представляет? Насколько я понимаю count. Однако когда мы этот класс начнем юзать в VB.NET, мы поимеем проблемы — он нечувствителен к регистру. Честно говоря я неуверен, что он вообще будет работать (поставить эксперимент что ли )... Поэтому имхо венгерку рано хоронить (по-крайней мере m_xxx и проч....).
Ну и еще одна вещь, где венгерка не собирается отступать — объявления интерфейсов (Ixxx)...
Здравствуйте, swamp, Вы писали:
S>Допустим я пишу объект на C# в котором есть проперти Count. Как мне обозвать поле класса, которое его представляет? Насколько я понимаю count. Однако когда мы этот класс начнем юзать в VB.NET, мы поимеем проблемы — он нечувствителен к регистру.
Как ты интересно собрался в VB юзать приватное поле?
S>Честно говоря я неуверен, что он вообще будет работать (поставить эксперимент что ли )... Поэтому имхо венгерку рано хоронить (по-крайней мере m_xxx и проч....).
S>Ну и еще одна вещь, где венгерка не собирается отступать — объявления интерфейсов (Ixxx)...
Ты по моему путаешь венгерку с префиксами вобще. Венгерка это префиксы, отражающие тип переменной. m-xxx и IXxx венгеркой не являются.
Здравствуйте, DarkGray, Вы писали:
DG>Здравствуйте, Снорк, Вы писали:
С>>
С>>// В объявлении класса
С>>CString tax(_T("1000$"));
С>>// В его методе (другой файл, строка так пятитысячная)
С>>CString (или std::string) = CFormatString("его возраст - %i лет, его з/п - %.2f, имя ему - %s")
С>><< age << tax << name;
С>>
С>>Разве использование хоть какого-нибудь класса может избавить от такой ошибки?
Вопрос, может, ламерский, но все же...
Если вы используете std::string (да даже если и не используете), то что вам мешает воспользоваться классом std::ostrstream? Он вроде как специально под это заточен.
std::ostrstream str;
str << "его возраст - " << age << " лет, его з/п - " << tax << " имя ему - " << name << '\0';
std::string myStr = str.str();
Конечно, есть некие нюансы с использованием манипуляторов потока, иъх просто знать нужно (сиречь, MSDN читать)
- Простите, профессор, не пса, а когда он уже был человеком.
— То-есть он говорил? Это еще не значит быть человеком. (с) Булгаков
SC>Если вы используете std::string (да даже если и не используете), то что вам мешает воспользоваться классом std::ostrstream? Он вроде как специально под это заточен.
Тем, что форматная строка намного нагляднее, а также проще выносится в ресурсы(внешний файл), например, для локализации.
В общем-то, я всё для себя уяснил по теме.
DG>Дык, все просто — неправильная вывод строки для меня, как заказчика, всегда дешевле, чем падение целой системы.
То есть, резюмируя:
Использование ОО-технологий (не разрушающих стек) при отсутствии должного контроля за типами позволяет перевести систему из класса работающих с фатальными ошибками в класс работающих просто некорректно (но не вывалювающихся). Этого явно мало, чтобы выкинуть венгерку, но её применение становится менее оправданным. Впрочем, есть целая куча других причин от неё отказаться.
Здравствуйте, AndrewVK, Вы писали:
AVK>Ты по моему путаешь венгерку с префиксами вобще. Венгерка это префиксы, отражающие тип переменной. m-xxx и IXxx венгеркой не являются.
Здравствуйте, DarkGray, Вы писали:
DG>Тем, что форматная строка намного нагляднее, а также проще выносится в ресурсы(внешний файл), например, для локализации.
А точнее, является единственным на данный момент способом локализации. Т.к. оная может помимо вординга включать и изменение порядка следования включаемых элементов. В форматной строке это можно сделать без перекомпиляции, а в коде, нанизывающем вызовы операторов — нет.
... << RSDN@Home 1.0 beta 6 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
DG>>Тем, что форматная строка намного нагляднее, а также проще выносится в ресурсы(внешний файл), например, для локализации. S>А точнее, является единственным на данный момент способом локализации. Т.к. оная может помимо вординга включать и изменение порядка следования включаемых элементов. В форматной строке это можно сделать без перекомпиляции, а в коде, нанизывающем вызовы операторов — нет.
А можно примерчик, а то не соображу как это? %f и %s местами поменять, оставив сами аргументы в старом порядке???
Здравствуйте, UgN, Вы писали:
UgN>А можно примерчик, а то не соображу как это? %f и %s местами поменять, оставив сами аргументы в старом порядке???
Оппа! Это, походу, Borland-specific. там можно между процентом и всем остальным вставить индекс, примерно так:
"Reverted %1:s string goes before the %0:f Float"
... << RSDN@Home 1.0 beta 6 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
UgN>>А можно примерчик, а то не соображу как это? %f и %s местами поменять, оставив сами аргументы в старом порядке??? S>Оппа! Это, походу, Borland-specific.
C>В констркуции anObject.instance понятно. А вот в теле функции строчек в 20 и поболее уже не понятно!
Дак и не зачем такие большие функции плодить.
Функция должна занимать 5-10 строчек. Так ещё можно контролировать код. А при 30 строчках, ты не в переменных, так в алгоритме ошибёшся. Преффиксы, в данном случае, просто загоняют проблему в даль.....
Жизнь, как игра —
идея паршивая,
графика обалденная...
Здравствуйте, Pushkin, Вы писали:
P>А если в нём (языке) вообще как бы и нет типов, то вообще о чём говорить..
Ну уж нет уж!
Вспомните префикс m_ — это не от типа, а от области видимости.
Удалые хлопцы могут и ещё наворотить к имени чёрт знает что...
Например, вспомните иерархии классов С++ : там префик принято ещё ставить по производителю или автору (если C-то вероятно MFC, если T-то Борлонд и т.д.). А то что для этого есть понятие namespace не все помнят...
И таких примеров куча!
Полагаю и в остальных случаях можно без префиксов обойтись...
Жизнь, как игра —
идея паршивая,
графика обалденная...
Здравствуйте, Awaken, Вы писали:
A>включение информации о типе в имя в языках ООП со строгой типизацией абсолютно бесполезно. если осмысленно выбраны идентификаторы то и так все понятно. существительное — имя сущности(класса). глагол — имя метода.
А атрибуты на "какой" (типа Hiden)? А что за методы OnSomeEvent? Ой не просто поступаться традициями и практическими потребностями — чтобы все обработчики были сгруппированы в одном месте на дереве, отдельно (невперемешку) с, например, объектами синхронизации на eventXXX... ну и lpszPath из тойже из той же серии %).
S>Насколько я понимаю противники венгерской записи предлагают "верблюда" (особенно для C# и проч). Но тут появляется проблема. Допустим я пишу объект на C# в котором есть проперти Count. Как мне обозвать поле класса, которое его представляет? Насколько я понимаю count. Однако когда мы этот класс начнем юзать в VB.NET, мы поимеем проблемы — он нечувствителен к регистру. Честно говоря я неуверен, что он вообще будет работать (поставить эксперимент что ли )... Поэтому имхо венгерку рано хоронить (по-крайней мере m_xxx и проч....).
Если m_ используется снаружи, то это нарушение инкапсуляции.
Если внутри метода, значит это code smell — большой метод, в котором ничего не понять. На крайний случай можно применять префиксы для параметров — _count, aCount...
S>Ну и еще одна вещь, где венгерка не собирается отступать — объявления интерфейсов (Ixxx)...
Из моих проектах она уже давно ретировалась.
IStream — Streamable
IPrint — Printable
S>А вообще, есть ли другие альтернативы?
Читабельные имена.
А вообще это не альтернатива, а исправление code smell — вписывание в идентификаторы информации о типе/области видимости, а не ролей.
Плюс неявный дефект, который сопутствует нотации — плохой дизайн/качество кода.
Здравствуйте, DarkGray, Вы писали:
DG>Здравствуйте, Снорк, Вы писали: DG>В форуме по C++ я уже постил класс, который типизированным образом работает с форматной строкой: DG>
DG>CString (или std::string) = CFormatString("его возраст - %i лет, его з/п - %.2f$, имя ему - %s")
DG> << age << зарплата << name;
DG>
Непонятно, зачем там сделаны i f и s? Это же дублирование информации о типе параметра, и чего делать если не совпадет, повешать систему как принтф, подставить вместо парамтра слово матом или кинуть исключение, которое никто не поймает?
А еще не плохо бы в таком классе нумеровать параметры. Иначе преимуществ перед std::ostringstream 0.
CString (или std::string) = CFormatString("его возраст - {0} лет, его з/п - {1}, имя ему - {2}") << age << std::setprecision(2) << зряплата << name;
Здравствуйте, Micker, Вы писали: M>Удалые хлопцы могут и ещё наворотить к имени чёрт знает что... M>Например, вспомните иерархии классов С++ : там префик принято ещё ставить по производителю или автору (если C-то вероятно MFC, если T-то Борлонд и т.д.). А то что для этого есть понятие namespace не все помнят...
Нет, это не так.
Обе библиотеки вводят свои coding conventions. Друг к другу эти конвенции не имеют никакого отношения. У борланда префикс T сделан, чтобы отличать вызов класс-методов от вызовов методов объекта и квалификации имени юнита.
... << RSDN@Home 1.0 beta 6 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.