Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > указатели и хендлы


Автор: 0x07L 7.7.2006, 19:55
Я уже несколько раз читал, что венгерская нотация - это плохо. Но как без нее называть переменные-указатели и хендлы? Неужели дописывать к имени переменной Pointer или Handle? И вообще, стоит ли отказываться от венгерской нотации, если за это приходиться расплачиваться необычайной пестротой кода, когда используешь библиотеки типа MFC, располагающие своими собственными правилами именования переменных?  

Автор: maxim1000 7.7.2006, 20:29
тут есть некоторые мысли о венгерской нотации:
http://www.joelonsoftware.com/articles/Wrong.html
раньше там, по-моему, была ссылка на русский перевод, но сейчас что-то не нашёл... 

Автор: Fazil6 7.7.2006, 20:29
Цитата

Но как без нее называть переменные-указатели и хендлы? Неужели дописывать к имени переменной Pointer или Handle?
 как хочешь - так и называй. 

Автор: 0x07L 8.7.2006, 09:17
Ага, ясно. Плоха не сама венгерская нотация, а ее интерпретация от Micro$oft. Значит, не стоит полностью отказываться от венгерской нотации и можно использовать ее там, где это нужно. Я, как всегда, все не так понял.

А второй вопрос я, пожалуй, уберу. С ним как-нибудь разберусь сам.

maxim1000, спасибо за ссылочку. 

Автор: Farik 26.7.2006, 14:43
Цитата

тут есть некоторые мысли о венгерской нотации:
http://www.joelonsoftware.com/articles/Wrong.html
раньше там, по-моему, была ссылка на русский перевод, но сейчас что-то не нашёл... 

http://local.joelonsoftware.com/mediawiki/index.php/Как_заставить_неправильный_код_выглядеть_неправильно

Цитата

Плоха не сама венгерская нотация, а ее интерпретация от Micro$oft.


Венгерская нотация и есть изобретение одного из работников микрософта. Плоха неправильно понятая венгерская нотация.
И как раз на эту плохую венгерку и гонит 90% рунета.

Вот собственно документ первоначальный.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs600/html/hunganotat.asp


Вобщем лучше чем у Джоела это нигде не описано. 

Автор: Mayk 26.7.2006, 15:35
Цитата(Farik @  26.7.2006,  18:43 Найти цитируемый пост)
Вот собственно документ первоначальный.
http://msdn.microsoft.com/library/default..../hunganotat.asp

smile
Код

#include "sy.h"
extern int *rgwDic;
extern int bsyMac;
struct SY *PsySz(char sz[])
{
     char *pch;
     int cch;
     struct SY *psy, *PsyCreate();
     int *pbsy;
     int cwSz;
     unsigned wHash=0;
     pch=sz;
     while (*pch!=0
        wHash=(wHash<>11+*pch++;
    cch=pch-sz;
....

WTF!
 

Автор: FTTA 29.8.2013, 22:26
И все же, стоит ли использовать Венгерскую нотацию?

Автор: akizelokro 3.9.2013, 04:47
А чёрт её знает..
Насколько я помню, она появилась из-за того, что вдруг появилось в Винде куча классов всего, что надо было запоминать (но что не являлось частью стандарта языка, HWND и прочее, например). Притом, вспомни, какая морока была писать, а ещё паче разбираться, например, на Сшкном APIшнике. Вот сейчас смотрел SumatraPDF и вспомнил, какой это финиш.

Насколько я помню, часть венгерской нотации ставила требования к оформлению названий функций, притом, часть из них же относилась к тому, чтобы сначала неявно указывать в названии тип. А сейчас тебе в оболочке тип просто будет показан в той же Студии при наведении. Так что в этом необходимость отпадает. Мир не стоит на месте, что-то остаётся, что-то уходит.
Но в своё время венгерка помогла сэкономить определенное количество времени и дать какую-то стандартизацию

Автор: bsa 3.9.2013, 10:47
Цитата(FTTA @  29.8.2013,  23:26 Найти цитируемый пост)
И все же, стоит ли использовать Венгерскую нотацию? 
Мне в свое время понравилось одно объяснение, зачем она была изначально придумана (в МС ее несколько видоизменили). Например, ты пишешь вэб приложение. Пользователь вводит на страничке какую-то информацию, а ты на ее основе формируешь запрос. Все мы знаем, что есть такой метод взлома как SQL-injection. Так вот, чтобы не допустить его, необходимо все поступаемые данные от пользователя (unsafe) делать безопасными (safe). А данные поступающие из БД преобразовывать к вменяемому виду. Поэтому, пишется две функции: string safeFromUnsafe(string) и string unsafeFromSafe(string). В итоге, когда ты их используешь то выглядит это так: string safeQuery = safeFromUnsafe(unsafeQuery). Слева от From идут все "safe", а справа "unsafe". Если вдруг, после рефакторинга что-то поменяется, то сразу же бросится в глаза.
А вот так выглядит "привычная" форма: string safeQuery = unsafeToSafe(unsafeQuery). Очевидно, что она менее наглядна и интуитивна.

Вот в этом и заключается исходный смысл Венгерской нотации. А не в дописывании приставки обозначающей тип переменной.

Автор: baldina 5.9.2013, 12:33
внеязыковые средства должны прояснять то, что требует пояснения, но языка не хватает
низкоуровневые типы как таковые к этому имхо не относятся

Автор: ТарасАтавин 7.9.2013, 08:19
0x07L, зачем вообще что то дописывать? 
Код
HWND WindowMain;
 ни чем не хуже, чем 
Код
HWND hwndWindowMain;
. Венгерская нотация предназначена для сред программирования, к которых нельзя быстро проверить тип переменной по её декларации и приходится включать его в имя. В первую очередь при программировании на языке ассемблера. Просто для того, чтоб не забыть размер и формат данных.

Добавлено через 10 минут и 35 секунд
Цитата(bsa @  3.9.2013,  10:47 Найти цитируемый пост)
Все мы знаем, что есть такой метод взлома как SQL-injection. Так вот, чтобы не допустить его, необходимо все поступаемые данные от пользователя (unsafe) делать безопасными (safe). А данные поступающие из БД преобразовывать к вменяемому виду. Поэтому, пишется две функции: string safeFromUnsafe(string) и string unsafeFromSafe(string). 
А какое это имеет отношение к венгерской нотации, согласно которой в имя включается информация о типе? Это обычные смысловые имена, отражающие назначение, их к тому же отлично можно заменить на Code/deCode.

Добавлено через 13 минут и 15 секунд
Цитата(bsa @  3.9.2013,  10:47 Найти цитируемый пост)

А вот так выглядит "привычная" форма: string safeQuery = unsafeToSafe(unsafeQuery). Очевидно, что она менее наглядна и интуитивна.
Очевидно, что интутивность здесь и при прочих равных то совпадает, а при условии привычности её здесь даже больше.

Автор: bsa 9.9.2013, 11:39
Цитата(ТарасАтавин @  7.9.2013,  09:19 Найти цитируемый пост)
А какое это имеет отношение к венгерской нотации, согласно которой в имя включается информация о типе?
Цитата(bsa @  3.9.2013,  11:47 Найти цитируемый пост)
Мне в свое время понравилось одно объяснение, зачем она была изначально придумана (в МС ее несколько видоизменили).
Еще раз для тех кто в танке, Венгерская нотация придумана для указания вида (не типа) хранимых данных в переменной. А в МС переиначили и получилось, что они стали приписывать тип переменной вместо вида хранимых данных.

Автор: JoKe 10.9.2013, 09:41
не стоит использовать такую нотацию. это вырвиглазие.

Автор: Alca 10.9.2013, 11:51
Цитата

не стоит использовать такую нотацию. это вырвиглазие.

особенно если "сложный" тип

Автор: borisbn 10.9.2013, 18:55
Цитата(Alca @  10.9.2013,  11:51 Найти цитируемый пост)
особенно если "сложный" тип 

Ага. Вот например - http://msdn.microsoft.com/en-us/library/aa915440.aspx
А теперь представь, что эта структура входит в другую. Представь, как будет выглядеть код:
Код

struct DXParams {
    DDSURFACEDESC ddsfdescPrimarySurfaceDesc;
};
DXParams dxParams;
dxParams.ddsfdescPrimarySurfaceDesc.ddckCKDestOverlay.dwColorSpaceHighValue = 42; // <------- УЖОС

Автор: ТарасАтавин 16.9.2013, 15:29
Цитата(borisbn @  10.9.2013,  18:55 Найти цитируемый пост)
dxParams.ddsfdescPrimarySurfaceDesc.ddckCKDestOverlay.dwColorSpaceHighValue = 42; // <------- УЖОС
У меня операнды не всегда в экран влазят и ничего ужасного в этом нет. А попытка из принципа избежать таких конструкций гарантирует ужас.

Автор: baldina 16.9.2013, 17:19
Цитата(ТарасАтавин @  16.9.2013,  15:29 Найти цитируемый пост)
У меня операнды не всегда в экран влазят и ничего ужасного в этом нет. А попытка из принципа избежать таких конструкций гарантирует ужас.

похоже на пропаганду мазохизма. попытка избежать таких конструкций - нормальный подход, позволяющий сделать код управляемым

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)