Я полностью за префиксы сделаны хорошо.
Я думаю, что (Системная) венгерская нотация ответственна за большую часть «плохой репутации», которую получают приставки.
Эта нотация в значительной степени бессмысленна в строго типизированных языках, например. в C ++ "lpsz", чтобы сообщить вам, что ваша строка является длинным указателем на строку с завершающим нулем, когда: сегментированная архитектура - это древняя история, строки C ++ являются указателями общего соглашения на массивы char с завершающим нулем, и на самом деле это не так уж сложно чтобы знать, что «customerName» - это строка!
Тем не менее, я использую префиксы для указания использования переменной (по сути, «Венгерские приложения», хотя я предпочитаю избегать термина венгерский, поскольку он имеет плохую и несправедливую связь с Венгерской системой), и это очень удобный подход, экономящий время и сокращающий количество ошибок.
Я использую:
- м для членов
- c для констант / только для чтения
- p для указателя (и pp для указателя на указатель)
- v для летучих
- s для статического
- i для индексов и итераторов
- е для мероприятий
Если я хочу сделать тип ясным, я использую стандартные суффиксы (например, List, ComboBox и т. Д.).
Благодаря этому программист узнает о использовании переменной всякий раз, когда он ее видит / использует. Возможно, наиболее важным случаем является "p" для указателя (поскольку использование меняется с var. На var->, и вы должны быть намного осторожнее с указателями - NULL, арифметика указателей и т. Д.), Но все остальные очень удобны.
Например, вы можете использовать одно и то же имя переменной несколькими способами в одной функции: (здесь пример C ++, но он одинаково применяется ко многим языкам)
MyClass::MyClass(int numItems)
{
mNumItems = numItems;
for (int iItem = 0; iItem < mNumItems; iItem++)
{
Item *pItem = new Item();
itemList[iItem] = pItem;
}
}
Вы можете увидеть здесь:
- Нет путаницы между членом и параметром
- Нет путаницы между индексом / итератором и элементами
- Использование набора четко связанных переменных (список элементов, указатель и индекс), что позволяет избежать многих ошибок общих (расплывчатых) имен, таких как «счетчик», «индекс».
- Префиксы сокращают ввод текста (короче и лучше работают с автозаполнением), чем такие альтернативы, как «itemIndex» и «itemPtr».
Еще одна замечательная особенность итераторов iName заключается в том, что я никогда не индексирую массив с неправильным индексом, и если я копирую цикл внутри другого цикла, мне не нужно реорганизовывать одну из переменных индекса цикла.
Сравните этот нереально простой пример:
for (int i = 0; i < 100; i++)
for (int j = 0; j < 5; j++)
list[i].score += other[j].score;
(что трудно читать и часто приводит к использованию "i" вместо "j")
с участием:
for (int iCompany = 0; iCompany < numCompanies; iCompany++)
for (int iUser = 0; iUser < numUsers; iUser++)
companyList[iCompany].score += userList[iUser].score;
(который гораздо более читабелен и устраняет всю путаницу при индексировании. Благодаря автозаполнению в современных IDE это также быстро и легко набирать)
Следующее преимущество состоит в том, что фрагменты кода не требуют никакого контекста для понимания. Я могу скопировать две строки кода в электронное письмо или документ, и любой, кто прочитает этот фрагмент, сможет определить разницу между всеми членами, константами, указателями, индексами и т. Д. Мне не нужно добавлять «о, и будьте осторожны, потому что «данные» - это указатель на указатель », потому что он называется« ppData ».
И по той же причине мне не нужно отрывать глаза от строчки кода, чтобы понять ее. Мне не нужно искать в коде, чтобы определить, являются ли «данные» локальными, параметрами, членами или константами. Мне не нужно перемещать руку к мыши, чтобы я мог навести указатель на «данные», а затем дождаться всплывающей подсказки (которая иногда никогда не появляется). Таким образом, программисты могут читать и понимать код значительно быстрее, потому что они не тратят время на поиски вверх и вниз или на ожидание.
(Если вы не думаете, что тратите время на поиски работы, найдите код, который вы написали год назад и с тех пор не просматривали. Откройте файл и прыгните примерно на полпути вниз, не читая его. . Посмотрите, как далеко вы сможете читать с этого момента, прежде чем вы не узнаете, является ли что-то членом, параметром или локальным. Теперь перейдите в другое случайное место ... Это то, что мы все делаем в течение всего дня, когда проходим одиночный шаг чужой код или пытаясь понять, как вызвать их функцию)
Префикс 'm' также позволяет избежать (ИМХО) уродливой и многословной нотации "this->" и несогласованности, которую она гарантирует (даже если вы будете осторожны, вы обычно получите смесь 'this-> data' и 'data' в том же классе, потому что ничто не требует последовательного написания имени).
Обозначение this предназначено для устранения двусмысленности - но зачем кому-то намеренно писать код, который может быть неоднозначным? Неопределенность рано или поздно приведет к ошибке. А в некоторых языках «this» нельзя использовать для статических членов, поэтому вы должны ввести «особые случаи» в свой стиль кодирования. Я предпочитаю иметь одно простое правило кодирования, которое применяется везде - явное, недвусмысленное и последовательное.
Последнее важное преимущество - это Intellisense и автозаполнение. Попробуйте использовать Intellisense в Windows Form, чтобы найти событие - вам нужно прокрутить сотни загадочных методов базового класса, которые вам никогда не нужно будет вызывать для поиска событий. Но если бы каждое событие имело префикс «e», они автоматически попадали бы в группу под «e». Таким образом, префикс позволяет группировать элементы, константы, события и т. Д. В списке intellisense, что значительно ускоряет и упрощает поиск нужных имен. (Обычно метод может иметь около 20-50 значений (locals, params, members, consts, events), доступных в его области действия. Но после ввода префикса (сейчас я хочу использовать индекс, поэтому я набираю 'i. .. '), мне представлены только 2-5 вариантов автозаполнения. Люди, которые «лишний набор» приписывают префиксы и значимые имена, резко сокращают пространство поиска и заметно ускоряют скорость разработки)
Я ленивый программист, и приведенное выше соглашение экономит мне много работы. Я могу кодировать быстрее и делаю гораздо меньше ошибок, потому что знаю, как следует использовать каждую переменную.
Аргументы против
Итак, каковы минусы? Типичные аргументы против префиксов:
«Схемы префиксов - это плохо / плохо». Я согласен с тем, что "m_lpsz" и ему подобные плохо продуманы и совершенно бесполезны. Вот почему я бы посоветовал использовать хорошо продуманную нотацию, разработанную для поддержки ваших требований, а не копировать что-то, не подходящее для вашего контекста. (Используйте подходящий инструмент для работы).
«Если я изменю использование чего-либо, мне придется переименовать это». Да, конечно, да, именно в этом суть рефакторинга и почему в IDE есть инструменты рефакторинга, позволяющие выполнять эту работу быстро и безболезненно. Даже без префиксов изменение использования переменной почти наверняка означает, что ее имя следует изменить.
«Префиксы меня просто сбивают с толку». Как и любой другой инструмент, пока вы не научитесь им пользоваться. Как только ваш мозг привыкнет к шаблонам именования, он автоматически отфильтрует информацию, и вы действительно не будете возражать, что префиксы там больше не будут. Но вы должны твердо использовать такую схему в течение недели или двух, прежде чем вы действительно станете "бегло". И тогда многие люди смотрят на старый код и начинают задаваться вопросом, как им вообще удалось справиться без хорошей схемы префиксов.
«Я могу просто взглянуть на код, чтобы решить эту проблему». Да, но вам не нужно тратить время на поиск в другом месте кода или запоминание каждой мелочи в нем, когда ответ находится прямо там, где ваш глаз уже сфокусирован.
(Некоторая часть) этой информации можно найти, просто дождавшись всплывающей подсказки для моей переменной. да. Там, где это поддерживается, для некоторых типов префиксов, когда ваш код компилируется чисто, после ожидания вы можете прочитать описание и мгновенно найти информацию, которую префикс мог бы передать. Я считаю, что префикс - это более простой, надежный и эффективный подход.
"Больше печатать". Действительно? Еще на один персонаж? Или это - с инструментами автозаполнения IDE, это часто сокращает набор текста, потому что каждый символ префикса значительно сужает пространство поиска. Нажмите «e», и в intellisense появятся три события в вашем классе. Нажмите «c», и отобразятся пять констант.
"Я могу использовать this->
вместо m
". Ну да, можно. Но это просто более уродливая и многословная приставка! Только он несет гораздо больший риск (особенно в командах), потому что для компилятора он необязателен, и поэтому его использование часто непоследовательно. m
с другой стороны, является кратким, ясным, явным и необязательным, поэтому при его использовании гораздо сложнее ошибиться.
person
Community
schedule
04.08.2009
self._something = 1
). - person Nathan Osman   schedule 02.04.2013this->member
в коде Python. В Python это обычноself.member
, и это не только соглашение, это требуется языком. - person matec   schedule 14.05.2016