Re[9]: Re[3]: Венгерская нотация
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 13.03.03 13:07
Оценка:
Здравствуйте, Снорк, Вы писали:

С>
С>// В объявлении класса
С>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 уронил всю систему, я не понимаю...

С>Конечно, если глаза не растут из зада и с помощью Вассиста мы отследим такую ошибку, но коим образом правильная ОО-организация заменяет нам венгерку?


Дык, все просто — неправильная вывод строки для меня, как заказчика, всегда дешевле, чем падение целой системы.

зы
Т.е. априори в системе всегда есть ошибки, так надо просто уменьшить цену их проявления... ОО, а в следствии, этого ненужность венгерки, эту цену уменьшает.
... << RSDN@Home 1.0 beta 6 >>
Re: "Верблюд" vs венгерка?
От: swamp Россия  
Дата: 13.03.03 13:09
Оценка:
Насколько я понимаю противники венгерской записи предлагают "верблюда" (особенно для C# и проч). Но тут появляется проблема. Допустим я пишу объект на C# в котором есть проперти Count. Как мне обозвать поле класса, которое его представляет? Насколько я понимаю count. Однако когда мы этот класс начнем юзать в VB.NET, мы поимеем проблемы — он нечувствителен к регистру. Честно говоря я неуверен, что он вообще будет работать (поставить эксперимент что ли )... Поэтому имхо венгерку рано хоронить (по-крайней мере m_xxx и проч....).

Ну и еще одна вещь, где венгерка не собирается отступать — объявления интерфейсов (Ixxx)...

А вообще, есть ли другие альтернативы?
Sincerely yours,
Andrew Simontsev.
Re[2]: "Верблюд" vs венгерка?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 13.03.03 13:38
Оценка:
Здравствуйте, swamp, Вы писали:

S>Допустим я пишу объект на C# в котором есть проперти Count. Как мне обозвать поле класса, которое его представляет? Насколько я понимаю count. Однако когда мы этот класс начнем юзать в VB.NET, мы поимеем проблемы — он нечувствителен к регистру.


Как ты интересно собрался в VB юзать приватное поле?

S>Честно говоря я неуверен, что он вообще будет работать (поставить эксперимент что ли )... Поэтому имхо венгерку рано хоронить (по-крайней мере m_xxx и проч....).


S>Ну и еще одна вещь, где венгерка не собирается отступать — объявления интерфейсов (Ixxx)...


Ты по моему путаешь венгерку с префиксами вобще. Венгерка это префиксы, отражающие тип переменной. m-xxx и IXxx венгеркой не являются.
... << RSDN@Home 1.0 beta 6a >>
AVK Blog
Re[10]: Re[3]: Венгерская нотация
От: small_cat Россия  
Дата: 13.03.03 14:28
Оценка:
Здравствуйте, 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 читать)
- Простите, профессор, не пса, а когда он уже был человеком.
— То-есть он говорил? Это еще не значит быть человеком. (с) Булгаков
Re[11]: Re[3]: Венгерская нотация
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 13.03.03 14:40
Оценка: 7 (1)
Здравствуйте, small_cat, Вы писали:


SC>Если вы используете std::string (да даже если и не используете), то что вам мешает воспользоваться классом std::ostrstream? Он вроде как специально под это заточен.


Тем, что форматная строка намного нагляднее, а также проще выносится в ресурсы(внешний файл), например, для локализации.
... << RSDN@Home 1.0 beta 6 >>
Re[10]: Re[3]: Венгерская нотация
От: Снорк  
Дата: 13.03.03 14:46
Оценка:
Здравствуйте, DarkGray, Вы писали:

В общем-то, я всё для себя уяснил по теме.

DG>Дык, все просто — неправильная вывод строки для меня, как заказчика, всегда дешевле, чем падение целой системы.


То есть, резюмируя:

Использование ОО-технологий (не разрушающих стек) при отсутствии должного контроля за типами позволяет перевести систему из класса работающих с фатальными ошибками в класс работающих просто некорректно (но не вывалювающихся). Этого явно мало, чтобы выкинуть венгерку, но её применение становится менее оправданным. Впрочем, есть целая куча других причин от неё отказаться.



Так пойдёт?
Re[3]: "Верблюд" vs венгерка?
От: Снорк  
Дата: 13.03.03 14:50
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Ты по моему путаешь венгерку с префиксами вобще. Венгерка это префиксы, отражающие тип переменной. m-xxx и IXxx венгеркой не являются.


Это подмножество венгерки.
Re[4]: "Верблюд" vs венгерка?
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.03.03 15:47
Оценка:
Здравствуйте, Снорк, Вы писали:
С>Это подмножество венгерки.
нет
... << RSDN@Home 1.0 beta 6 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[12]: Re[3]: Венгерская нотация
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.03.03 15:52
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>Тем, что форматная строка намного нагляднее, а также проще выносится в ресурсы(внешний файл), например, для локализации.

А точнее, является единственным на данный момент способом локализации. Т.к. оная может помимо вординга включать и изменение порядка следования включаемых элементов. В форматной строке это можно сделать без перекомпиляции, а в коде, нанизывающем вызовы операторов — нет.
... << RSDN@Home 1.0 beta 6 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[13]: Re[3]: Венгерская нотация
От: UgN  
Дата: 13.03.03 16:10
Оценка:
Здравствуйте, Sinclair, Вы писали:

DG>>Тем, что форматная строка намного нагляднее, а также проще выносится в ресурсы(внешний файл), например, для локализации.

S>А точнее, является единственным на данный момент способом локализации. Т.к. оная может помимо вординга включать и изменение порядка следования включаемых элементов. В форматной строке это можно сделать без перекомпиляции, а в коде, нанизывающем вызовы операторов — нет.

А можно примерчик, а то не соображу как это? %f и %s местами поменять, оставив сами аргументы в старом порядке???

ЗЫ: Сам пользуюсь подобием в.н. — хуже не будет.
Re[14]: Re[3]: Венгерская нотация
От: Sinclair Россия https://github.com/evilguest/
Дата: 13.03.03 16:37
Оценка:
Здравствуйте, UgN, Вы писали:

UgN>А можно примерчик, а то не соображу как это? %f и %s местами поменять, оставив сами аргументы в старом порядке???


Оппа! Это, походу, Borland-specific. там можно между процентом и всем остальным вставить индекс, примерно так:
"Reverted %1:s string goes before the %0:f Float"
... << RSDN@Home 1.0 beta 6 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[15]: Re[3]: Венгерская нотация
От: Frostbitten Россия  
Дата: 13.03.03 17:10
Оценка:
Здравствуйте, Sinclair, Вы писали:

UgN>>А можно примерчик, а то не соображу как это? %f и %s местами поменять, оставив сами аргументы в старом порядке???

S>Оппа! Это, походу, Borland-specific.

Нет. И ::FormatMessage() что-то такое тоже умеет.
Re[5]: "Верблюд" vs венгерка?
От: Frostbitten Россия  
Дата: 13.03.03 17:10
Оценка:
Здравствуйте, Sinclair, Вы писали:

С>>Это подмножество венгерки.

S>нет

Хорошо, тогда сначала. А что тогда есть "венгерка" (т.е. более менее серьезный документ, на который можно было бы ссылаться)?

P.S.
Я в @home вижу только новые ветки этой темы (с 11 марта), поэтому прошу прощения если об этом уже писали ранее.
Re[5]: Венгерская нотация
От: Micker  
Дата: 13.03.03 17:15
Оценка:
Здравствуйте, Constructor, Вы писали:


C>В констркуции anObject.instance понятно. А вот в теле функции строчек в 20 и поболее уже не понятно!


Дак и не зачем такие большие функции плодить.
Функция должна занимать 5-10 строчек. Так ещё можно контролировать код. А при 30 строчках, ты не в переменных, так в алгоритме ошибёшся. Преффиксы, в данном случае, просто загоняют проблему в даль.....
Жизнь, как игра —
идея паршивая,
графика обалденная...
Re[5]: Венгерская нотация
От: Micker  
Дата: 13.03.03 17:21
Оценка:
Здравствуйте, Pushkin, Вы писали:

P>А если в нём (языке) вообще как бы и нет типов, то вообще о чём говорить..


Ну уж нет уж!
Вспомните префикс m_ — это не от типа, а от области видимости.
Удалые хлопцы могут и ещё наворотить к имени чёрт знает что...
Например, вспомните иерархии классов С++ : там префик принято ещё ставить по производителю или автору (если C-то вероятно MFC, если T-то Борлонд и т.д.). А то что для этого есть понятие namespace не все помнят...

И таких примеров куча!

Полагаю и в остальных случаях можно без префиксов обойтись...
Жизнь, как игра —
идея паршивая,
графика обалденная...
Re[2]: Оформление кода: Венгерская нотация
От: Frostbitten Россия  
Дата: 13.03.03 17:46
Оценка:
Здравствуйте, Awaken, Вы писали:

A>включение информации о типе в имя в языках ООП со строгой типизацией абсолютно бесполезно. если осмысленно выбраны идентификаторы то и так все понятно. существительное — имя сущности(класса). глагол — имя метода.


А атрибуты на "какой" (типа Hiden)? А что за методы OnSomeEvent? Ой не просто поступаться традициями и практическими потребностями — чтобы все обработчики были сгруппированы в одном месте на дереве, отдельно (невперемешку) с, например, объектами синхронизации на eventXXX... ну и lpszPath из тойже из той же серии %).
Re[2]: "Верблюд" vs венгерка?
От: _vovin http://www.pragmatic-architect.com
Дата: 13.03.03 21:37
Оценка: -1
S>Насколько я понимаю противники венгерской записи предлагают "верблюда" (особенно для C# и проч). Но тут появляется проблема. Допустим я пишу объект на C# в котором есть проперти Count. Как мне обозвать поле класса, которое его представляет? Насколько я понимаю count. Однако когда мы этот класс начнем юзать в VB.NET, мы поимеем проблемы — он нечувствителен к регистру. Честно говоря я неуверен, что он вообще будет работать (поставить эксперимент что ли )... Поэтому имхо венгерку рано хоронить (по-крайней мере m_xxx и проч....).

Если m_ используется снаружи, то это нарушение инкапсуляции.

Если внутри метода, значит это code smell — большой метод, в котором ничего не понять. На крайний случай можно применять префиксы для параметров — _count, aCount...

S>Ну и еще одна вещь, где венгерка не собирается отступать — объявления интерфейсов (Ixxx)...


Из моих проектах она уже давно ретировалась.

IStream — Streamable
IPrint — Printable

S>А вообще, есть ли другие альтернативы?


Читабельные имена.

А вообще это не альтернатива, а исправление code smell — вписывание в идентификаторы информации о типе/области видимости, а не ролей.
Плюс неявный дефект, который сопутствует нотации — плохой дизайн/качество кода.

--

Владимир.
Re[4]: Re[3]: Венгерская нотация
От: Рома Мик Россия http://romamik.com
Дата: 13.03.03 23:33
Оценка:
Здравствуйте, 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;
... << RSDN@Home 1.0 beta 6a >>
Re[6]: "Верблюд" vs венгерка?
От: Sinclair Россия https://github.com/evilguest/
Дата: 14.03.03 08:37
Оценка: 15 (2)
F>Хорошо, тогда сначала. А что тогда есть "венгерка" (т.е. более менее серьезный документ, на который можно было бы ссылаться)?
Здесь
... << RSDN@Home 1.0 beta 6 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: Венгерская нотация
От: Sinclair Россия https://github.com/evilguest/
Дата: 14.03.03 08:37
Оценка: 8 (1) +1
Здравствуйте, Micker, Вы писали:
M>Удалые хлопцы могут и ещё наворотить к имени чёрт знает что...
M>Например, вспомните иерархии классов С++ : там префик принято ещё ставить по производителю или автору (если C-то вероятно MFC, если T-то Борлонд и т.д.). А то что для этого есть понятие namespace не все помнят...
Нет, это не так.
Обе библиотеки вводят свои coding conventions. Друг к другу эти конвенции не имеют никакого отношения. У борланда префикс T сделан, чтобы отличать вызов класс-методов от вызовов методов объекта и квалификации имени юнита.
... << RSDN@Home 1.0 beta 6 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.