metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2006-09-17 01:38 pm

.NET coding guidelines и потенциальные баги

.NET
По правилам написания кода класс с полем, инициализирующемся в конструкторе и свойством, которое дает доступ для чтения этого поля надо писать так:

public class SomeClass
{
private readonly string configMetaID;
public string ConfigMetaID{get{return configMetaID;}}

public SomeClass(string configMetaID)
{
this.configMetaID = configMetaID;
}
}

Достаточно вместо return configMetaID; написать return ConfigMetaID; и получим Stack overflow. А сделать это очень легко, так как используется автодополнение кода. Кроме того, можно забыть написать this. в конструкторе и поле останется не проинициализированным.
Правила кодирования заимствованны из Java, где свойств нету, а есть геттеры и сеттеры, префиксы get и set которых там не дадут устроить переполнение стека из-за ошибки.
Есть вариант обхода - сделать поле public, а свойство выкинуть. Оно все равно readonly, поэтому испортить снаружи его никто не сможет. Но это в чем-то противоречит правилам кодирования - поля делать public - плохой тон.

[identity profile] vp.livejournal.com 2006-09-17 03:31 pm (UTC)(link)
У меня давно критическое отношение к именованию класса с большой буквы, а экземпляра - тем же словом, только с маленькой буквой в начале.

Оно конечно теоретически очень красиво. Но источник багов еще тот. Особенно в условиях, когда все лабают с автодополнением кода.

[identity profile] orloffm.livejournal.com 2006-09-17 03:35 pm (UTC)(link)
VB.Net же вроде не различает регистр, разве в guidelines не указано, что нельзя делать переменные с отличающимися только регистром символов именами?

[identity profile] metaclass.livejournal.com 2006-09-17 04:08 pm (UTC)(link)
Это C#, он различает. По логике вещей идентификаторы различающиеся только регистром делать не стоило бы, но в данном случае получается противоречие - поле и свойство означают одно и тоже, соответственно делать сильно различающиеся имена нельзя.
В венгерской нотации это бы обходилось префиксом m_ для поля, но ее использовать в .NET не рекомендуется. Как и прочие вариации имен с подчеркиваниями в начале и тому подобное.

[identity profile] axexa.livejournal.com 2006-09-17 05:48 pm (UTC)(link)
признаюсь, за год интенсивного кодописания на сырфкз ни разу не впал в грех подобной описки.

[identity profile] metaclass.livejournal.com 2006-09-17 06:16 pm (UTC)(link)
А я вот сегодня впал :)
Это меня задрала путаница вариантов оформления кода в голове(венгерская нотация, дельфи и явовско-сишарпная) и я удосужился прочесть guidelines и пытаюсь им следовать.
До того было проще - я просто оформлял в венгерской нотации :)

[identity profile] axexa.livejournal.com 2006-09-17 06:55 pm (UTC)(link)
а-а-а, у нас только шарп проекты, поэтому легче. как вспомню приключения в плюсах с вечными пляшушими стилями -- обливаюсь потом.

венгерку, кстати, рекомендуют в этой книжке (есть в pdf) --
http://www.apress.com/book/bookDisplay.html?bID=10029
но болезненно усложненный шизовариант.

[identity profile] axexa.livejournal.com 2006-09-17 06:57 pm (UTC)(link)
в нашей группе мы следуем официальным гайдам, все привыкли и коллизий из-за этого нет (я не помню).

[identity profile] mr-st.livejournal.com 2006-09-18 07:44 am (UTC)(link)
Я тоже пару раз нарывался. Посему приватные поля начинаются с подчёркивания.

[identity profile] metaclass.livejournal.com 2006-09-18 07:46 am (UTC)(link)
Наверно наиболее правильно, хоть и запрещено в guidelines :)