Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > венгерская нотация


Автор: viktor1301 1.8.2006, 05:33
В Интернете прочитал про Венгерскую нотацию, хорошего и плохого. Хотелось бы узнать мнение опытных программистов. Стоит ли её использовать при программировании на C#?

Автор: mr.DUDA 1.8.2006, 08:39
По-моему, это дело привычки. Учитывая, что программисты C# в основном не используют венгерскую нотацию, можно последовать их примеру. А можно и не следовать.

З.Ы. венгерскую используют MFC-шники smile

Автор: Ch0bits 1.8.2006, 10:46
Цитата(mr.DUDA @  1.8.2006,  09:39 Найти цитируемый пост)
программисты C# в основном не используют венгерскую нотацию

Потому что есть IntelliSence.  smile

Автор: ivashkanet 1.8.2006, 13:15
Цитата(Ch0bits @  1.8.2006,  10:46 Найти цитируемый пост)
Потому что есть IntelliSence.  

Именно. 
Но я иногда ее все же использую, когда есть набор однотипных элементов (например кнопок на форме). Тогда они по алфавиту идут одна за другой  smile 

Автор: Дрон 1.8.2006, 13:16
Цитата(Ch0bits @  1.8.2006,  11:46 Найти цитируемый пост)
Потому что есть IntelliSence.  

Ага.

В простом коде иногда использую префиксы n, obj, m_ но только там, где они действительно сильно улучшают восприятие (особенно не люблю m_, но и он иногда помогает)

А вот в UI-дизайне постоянно пользуюсь префиксами, обозначающими тип контрола: 
lbl - Label, tb - TextBox, cb - ComboBox, ch (ck) - CheckBox, btn - Button и т.п.

Автор: Exception 1.8.2006, 13:44
Я лично не пользуюсь. Не считаю нужным. ИМХО, она только мешает чтению кода.

Автор: Softaz 1.8.2006, 14:23
Использую рекомендованные CodeArchitect префиксы имен.

Автор: Exception 2.8.2006, 14:27
Раз уж пишем -- ссылочку можно?

Автор: stab 2.8.2006, 15:16
для полей использую префикс "m_", чтобы с параметрами путаницы не возникало:

public MyObject(string name)
{
  m_name = name;
}

и это единственная причина. иначе приходится извращаться с придумыванием названий вроде nameArg или nameField.

Автор: ivashkanet 2.8.2006, 15:21
Цитата(cully @  2.8.2006,  15:16 Найти цитируемый пост)
m_name

А просто префикса почему не хватает?
Код

_name

P.S. OffTop: Наберите name на русской раскладке. Получится... тфьу (почти тьфу) smile 

Автор: stab 2.8.2006, 15:28
Цитата(ivashkanet @  2.8.2006,  19:21 Найти цитируемый пост)
А просто префикса почему не хватает?


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

Добавлено @ 15:30 
..кстати, "m" видимо от слова member (член) произошло.

Автор: Дрон 2.8.2006, 15:36
Цитата(cully @  2.8.2006,  16:28 Найти цитируемый пост)
..кстати, "m" видимо от слова member (член) произошло. 

Я тоже так думаю.

Код
m_name = name;

Не... я m_ использую в случае, если есть поле класса, но я не хочу случайно (например, из-за опечатки или забыв что-то) к нему обращаться напрямую, вместо вызова соответствующего аксессора:
Код
private int m_field;

private int Field
{
 get
 {
   // какая-то инициализация
   return m_field;
 }
 set
 {
  // тоже какие-то действия
 }
}

Автор: ivashkanet 2.8.2006, 15:49
Дрон, так и у cully ображение к полю идет в конструкторе (Во всяком случае по названию точно конструктор)
Цитата(cully @  2.8.2006,  15:16 Найти цитируемый пост)
public MyObject(string name){  m_name = name;}




Автор: Bose 1.10.2006, 02:25
Прошу всех интересующихся венгерской нотацией взлянуть на эту http://local.joelonsoftware.com/mediawiki/index.php/Как_заставить_неправильный_код_выглядеть_неправильно

 smile 

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

Автор: $tatic 1.10.2006, 12:00
Цитата(cully @  2.8.2006,  16:16 Найти цитируемый пост)
для полей использую префикс "m_", чтобы с параметрами путаницы не возникало:

public MyObject(string name)
{
  m_name = name;
}

и это единственная причина. иначе приходится извращаться с придумыванием названий вроде nameArg или nameField. 

Есть же более удобный способ, я им пользуюсь:
Код

public MyObject(string name)
{
  this.name = name;
}

Вот и все. И не надо ни придумывать другие слова, ни использовать всякие _, m_ и прочую гадость. ИМХО она только VBшникам нужна, поскольку у них регистронезависимый код.

Автор: mr.DUDA 1.10.2006, 12:30
Цитата($tatic @  1.10.2006,  12:00 Найти цитируемый пост)
this.name = name;

Чревато тем, что когда-нибудь забудешь написать this и будешь долго искать почему поле не заполняется smile

Автор: $tatic 1.10.2006, 15:15
Ну в принципе можно так же "забыть" и public для метода/конструктора поставить. А в студии this видно, поскольку он синий. Лично у меня написание this.name = name; уже рефлексивно.

Автор: ivashkanet 2.10.2006, 08:21
Цитата($tatic @  1.10.2006,  12:00 Найти цитируемый пост)
 И не надо ни придумывать другие слова, ни использовать всякие _, m_ и прочую гадость. ИМХО она только VBшникам нужна, поскольку у них регистронезависимый код.

А я не согласен  smile 
Очень даже удобно, когда все внутренние члены класса находятся в одном месте. Нажал "_", Ctrl + J (или Ctrl + Пробел) и выбирай нужный тебе  smile 

Автор: Goganchic 2.10.2006, 22:17
По мне, так это все дело привычки. Одним людям удобнее использовать венгерскую нотацию, а другим нет, причем бывает так, что и у тех и у других код очень даже читаемый, а если они меняются местами, то все... пиши пропало...

Автор: Exception 3.10.2006, 16:28
Цитата(cully @  2.8.2006,  16:16 Найти цитируемый пост)
для полей использую префикс "m_", чтобы с параметрами путаницы не возникало:


А мне это не нравится по идеологическим соображениям. Целиком за

Код

class SomeClass
{
    private SomeType _something;

    public SomeType Something
    {
        get { return _something; }
        set { _something = value; }
    }

    public SomeClass(SomeType something)
    {
        _something = something;
    }
}

Автор: mr.DUDA 3.10.2006, 23:16
кстати, вроде, это Кэмел-нотация называется

Автор: Medved 5.10.2006, 01:59
Microsoft рекомендует использовать смесь вингерской и кэмел-нотации. Где-то на винчестере лежит руководство по оформлению кода в .NET, если найду, выложу.

Автор: Marvel 9.10.2006, 16:16
Для именования используются нотации: Паскаль (каждое логическое слово должно начинаться с заглавной буквы. (TestCounter)) и Камел (первый символ первого логического слова начинается с маленькой буквы, остальные логические слова - с большой. (testCounter)).

Элемент    Нотация    Примечания
класс / структура    Паскаль    
интерфейс    Паскаль    Начинается с “I”
перечисление    Паскаль    
элементы перечисления    Паскаль    
делегаты    Паскаль    заканчивается “EventHandler”
класс исключения    Паскаль    заканчивается “Exception”
методы    Паскаль    
пространство имен    Паскаль    
свойство    Паскаль    
константы    Паскаль    
аргументы    Камел    
переменные внутри методов    Камел    

Поля именуются, используя конвенцию Камел, добавляя символ подчеркивания вначале. (_testCounter) 
Запрещается использовать венгерскую нотацию (в имени присутствуют префиксы для обозначения типа: string strName). Запрещается использовать постфиксы для этих же целей (enum ColorsEnum).

Автор: $tatic 10.10.2006, 19:49
Интересно, что в Майкрософте символ подчеркивания вроде бы не пишут. По крайней мере в их примерах я такого не встречал.

Автор: mr.DUDA 10.10.2006, 22:53
Цитата($tatic @  10.10.2006,  19:49 Найти цитируемый пост)
Интересно, что в Майкрософте символ подчеркивания вроде бы не пишут. По крайней мере в их примерах я такого не встречал.

Хы, у них там вообще чёрт знает что творится. В старых классах юзается m_, в новых - подчёркивание. Есть смешанные примеры:

Код
[Serializable]
public class HttpWebRequest : WebRequest, ISerializable
{

// ...

      // Fields
      private HttpAbortDelegate _AbortDelegate;
      private ICredentials _AuthInfo;
      private int _AutoRedirects;
      private Booleans _Booleans;
      private DateTime _CachedIfModifedSince;
      private X509CertificateCollection _ClientCertificates;
      private LazyAsyncResult _ConnectionAResult;
      private string _ConnectionGroupName;
      private LazyAsyncResult _ConnectionReaderAResult;
      private long _ContentLength;
      private HttpContinueDelegate _ContinueDelegate;
      private CookieContainer _CookieContainer;
      private object _CoreResponse;
      private WebHeaderCollection _HttpRequestHeaders;
      internal HttpWebResponse _HttpResponse;
      private HttpWriteMode _HttpWriteMode;
      private int _MaximumAllowedRedirections;
      private int _MaximumResponseHeadersLength;
      private string _MediaType;
      private int _NestedWriteSideCheck;
      private ConnectStream _OldSubmitWriteStream;
      private Uri _OriginUri;
      private KnownHttpVerb _OriginVerb;
      private IWebProxy _Proxy;
      private AuthenticationState _ProxyAuthenticationState;
      private ProxyChain _ProxyChain;
      private LazyAsyncResult _ReadAResult;
      private int _ReadWriteTimeout;
      private int _RequestContinueCount;
      private TriState _RequestIsAsync;
      private int _RerequestCount;
      private AuthenticationState _ServerAuthenticationState;
      internal ServicePoint _ServicePoint;
      private ConnectStream _SubmitWriteStream;
      private int _Timeout;
      private TimerThread.Timer _Timer;
      private TimerThread.Queue _TimerQueue;
      private UnlockConnectionDelegate _UnlockDelegate;
      private Uri _Uri;
      private KnownHttpVerb _Verb;
      private LazyAsyncResult _WriteAResult;
      private byte[] _WriteBuffer;
      internal const string ChunkedHeader = "chunked";
      private const string ContinueHeader = "100-continue";
      internal const int DefaultContinueTimeout = 350;
      private const int DefaultReadWriteTimeout = 0x493e0;
      internal const string DeflateHeader = "deflate";
      internal const string GZipHeader = "gzip";
      private static readonly byte[] HttpBytes;
      private int m_Aborted;
      private DecompressionMethods m_AutomaticDecompression;
      private bool m_BodyStarted;
      private InterlockedGate m_ContinueGate;
      private TimerThread.Timer m_ContinueTimer;
      private bool m_Extra401Retry;
      private bool m_HeadersCompleted;
      private bool m_InternalConnectionGroup;
      private bool m_IsCurrentAuthenticationStateProxy;
      private bool m_KeepAlive;
      private bool m_LockConnection;
      private bool m_NtlmKeepAlive;
      private bool m_OnceFailed;
      private bool m_OriginallyBuffered;
      private object m_PendingReturnResult;
      private bool m_Pipelined;
      private bool m_PreAuthenticate;
      private bool m_RequestSubmitted;
      private bool m_Retry;
      private bool m_Saw100Continue;
      private bool m_SawInitialResponse;
      internal const HttpStatusCode MaxOkStatus = ((HttpStatusCode) 0x12b);
      private const HttpStatusCode MaxRedirectionStatus = ((HttpStatusCode) 0x18f);
      private const int RequestLineConstantSize = 12;
      private static readonly WaitCallback s_AbortWrapper;
      private static readonly TimerThread.Callback s_ContinueTimeoutCallback;
      private static readonly TimerThread.Queue s_ContinueTimerQueue;
      private static readonly WaitCallback s_EndWriteHeaders_Part2Callback;
      private static readonly TimerThread.Callback s_TimeoutCallback;
      private static int s_UniqueGroupId;

// ...

}

Автор: Exception 11.10.2006, 17:44
mr.DUDA, а когда M$ следовали собственным guidelines smile ?

Автор: mr.DUDA 11.10.2006, 18:06
Exception, у них слишком много индусов-программеров, индусов-манагеров, индусов-лидов, за всеми не уследишь smile

Автор: $tatic 11.10.2006, 18:14
т.е. это даже не венгерская, а индийская нотация уже  smile 

Автор: mr.DUDA 11.10.2006, 21:20
$tatic,  smile 

Венгерка устарела. Об этом и тема. А про индусов мы не говорим, у них свои "шахматные" правила smile

Автор: ivashkanet 12.10.2006, 07:57
Цитата(mr.DUDA @  10.10.2006,  22:53 Найти цитируемый пост)
      private static int s_UniqueGroupId;

Гы, еще одна интересность: private static идет с префиксом s_

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