Это все соглашения C #.
Корпус с переменным именем
Дело указывает на объем. Переменные в Паскале - это поля класса-владельца. Переменные в верблюде являются локальными для текущего метода.
У меня есть только одно префиксное соглашение. Вспомогательные поля для свойств класса в Pascal-регистре и с префиксом подчеркивания:
private int _Foo;
public int Foo { get { return _Foo; } set { _Foo = value; } }
Существует какое-то соглашение о присвоении имен C #, которое я видел - я почти уверен, что это был документ Microsoft - которое противоречит использованию префикса подчеркивания. Это кажется мне безумным. Если я посмотрю в своем коде и увижу что-то вроде
_Foo = GetResult();
самое первое, что я спрашиваю себя: «У меня была веская причина не использовать средство доступа к свойству для обновления этого поля?» Ответ часто звучит так: «Да, и вам лучше узнать, что это такое, прежде чем начинать манипулировать этим кодом».
Однобуквенные (и короткие) имена переменных
Хотя я склонен согласиться с изречением о том, что имена переменных должны быть значимыми, на практике существует множество обстоятельств, при которых их значимость ничего не добавляет к удобочитаемости или удобству обслуживания кода.
Итераторы цикла и индексы массива являются очевидными местами для использования коротких и произвольных имен переменных. Менее очевидными, но не менее уместными в моей книге, являются nonce употребления, например ::
XmlWriterSettings xws = new XmlWriterSettings();
xws.Indent = true;
XmlWriter xw = XmlWriter.Create(outputStream, xws);
Это из кода C # 2.0; конечно, если бы я написал сегодня, мне бы не понадобилась переменная nonce:
XmlWriter xw = XmlWriter.Create(
outputStream,
new XmlWriterSettings() { Indent=true; });
Но в коде C # все еще есть множество мест, где мне нужно создать объект, который вы просто собираетесь передать в другом месте, а затем выбросить.
Многие разработчики будут использовать имя, такое как xwsTemp
в этих обстоятельствах. Я считаю, что суффикс Temp
является избыточным. Тот факт, что я назвал переменную xws
в ее объявлении (и я использую ее только в пределах визуального диапазона этого объявления; это важно), говорит мне, что это временная переменная.
Еще одно место, где я буду использовать короткие имена переменных, - это метод, который интенсивно использует один объект. Вот код производственного кода:
internal void WriteXml(XmlWriter xw)
{
if (!Active)
{
return;
}
xw.WriteStartElement(Row.Table.TableName);
xw.WriteAttributeString("ID", Row["ID"].ToString());
xw.WriteAttributeString("RowState", Row.RowState.ToString());
for (int i = 0; i < ColumnManagers.Length; i++)
{
ColumnManagers[i].Value = Row.ItemArray[i];
xw.WriteElementString(ColumnManagers[i].ColumnName, ColumnManagers[i].ToXmlString());
}
...
В мире нет способа, чтобы код был бы легче читать (или безопаснее изменять), если бы я дал XmlWriter более длинное имя.
О, откуда мне знать, что xw
не является временной переменной? Потому что я не вижу его декларации. Я использую только временные переменные в пределах 4 или 5 строк их объявления. Если мне понадобится один код для большего количества кода, я даю ему значимое имя или реорганизую код, используя его в метод, который - эй, какое совпадение - принимает короткую переменную в качестве аргумента.
Сколько информации вы указали в названии?
Достаточно.
Это оказывается чем-то вроде черного искусства. Есть много информации, которую я не должен вставить в название. Я знаю, когда переменная является вспомогательным полем средства доступа к свойству, или временным, или аргументом для текущего метода, потому что мои соглашения об именах говорят мне об этом. Так что мои имена не.
Вот почему это не так важно.
На практике мне не нужно тратить много энергии на выяснение имен переменных. Я приложил все эти когнитивные усилия к именам типов, свойств и методов. Это на 1056 * намного больше, чем именование переменных, потому что эти имена очень часто являются общедоступными (или, по крайней мере, видимыми во всем пространстве имен). Имена в пространстве имен должны передавать значение таким же образом .
В этом блоке кода есть только одна переменная:
RowManager r = (RowManager)sender;
// if the settings allow adding a new row, add one if the context row
// is the last sibling, and it is now active.
if (Settings.AllowAdds && r.IsLastSibling && r.Active)
{
r.ParentRowManager.AddNewChildRow(r.RecordTypeRow, false);
}
Имена свойств почти делают комментарий излишним. (Почти. На самом деле есть причина, по которой свойство называется AllowAdds
, а не AllowAddingNewRows
, о котором много думалось, но оно не относится к этому конкретному коду, поэтому есть комментарий.) имя переменной? Кого это волнует?