Ключевые слова:gcc, howto, (найти похожие документы)
Date: Thu, 25 Apr 2002 08:24:56 +0000 (UTC)
From: Lev Walkin <vlm@netli.com>
Newsgroups: fido7.ru.unix.prog
Subject: Стиль именования переменных в Си программах.
> подскажешь как лучше давать имена переменным (сейчас пользую такой способ:
> типобъектаИмяОбъекта, так и с функциями, но получается очень длинно,
> избыточно), где-то слышал про другой принцип наименования (unix'овский все
> маленькими буковками с подчеркиваниями в качестве разделителей), может
> ссылку кинет кто? Или прям здесь расскажет?
Первое, на что ты ссылаешься - т.н. венгерский способ. Активно
пропагандируется майкрософтом - иначе в обилии околовиндового API,
насчитывающего несколько тысяч базовых вызовов, не разберешься.
Достоинства: вид лексемы содержит максимум информации о ней
в компактной форме. Пример: hwndMainWindow - хендлер моего
главного окошка.
Недостатки: вид лексемы зело-зело страшен и велик. Часто
избыточек, что побуждает программистов вместо
for(iNumObj = 0; iNumObj < cMaxObjects; iNumObj++)
(черт возьми, чуть клавиатуру не раздолбал набирать эту
строчку) писать нечто вроде
for(i = 0; i < cMaxObjects; i++)
для локальных небольших циклов, тело которых обозримо.
В целом рекомендации по использованию венгерской записи
включают в себя использование длинных мнемоничных
идентификаторов в случае более глобальных объявлений
(чтобы не запутаться и не забыть), и уменьшать их
постепенно до однобуквенных обозначений в случае
более локальных объявлений. (В принципе, если отвлечься
от case distinctions и обозначения типов в лексеме,
то же самое верно и для других нотаций)
Например:
const int cMaxApples = 32;
typedef struct AppleTree_s {
Apple_t **Apples;
int iAppleCount;
} AppleTree_t;
int
FillAppleProperties(AppleTree_t *aTree) {
int tNum;
assert(aTree)
assert(aTree->iAppleCount >= 0
&& aTree->iAppleCount < cMaxApples);
for(tNum = 0; tNum < tMaxApples; tNum++) {
aTree->Apples[tNum] = ...;
}
return 0;
}
[о ужас, это же постоянный Shift, Shift, SHift, ^H^H^H^H).
В общем, с читабельностью получается все более-менее в порядке,
но с написабельностью появляются проблемы. Работать шифтом
может быть удобнее, если шифт вынесен отдельной педалью, но
не у всех есть подобная конструкция.
Есть более старый способ, который элиминирует как раз эти
пляски с шифтами, позволяя более эффективно использовать
слепой метод. Этот метод - просто забыть о различиях
в капитализации символов и использовать знаки подчеркивания,
вспоминать короткие английские слова и внятные сокращения.
В этом случае можно пойти еще дальше - так как кодирование
типа в лексеме во многих случаях избыточен. Тот же
самый код в данной нотации:
const size_t max_apples = 32;
typedef struct apple_tree_s {
apple_t *apples;
size_t apple_count;
} apple_tree_t;
int
fill_apple_props(apple_tree_t *atree) {
size_t t;
assert(atree);
assert(atree->apple_count < max_apples);
for(t = 0; t < max_apples; t++) {
atree->apples[tnum] = ...;
}
return 0;
}
В принципе, читаемость даже повысилась, на предвзятый взгляд.
Из-за того, что не приходится постоянно соскакивать с кейса
на кейс. Да и писать гораздо удобнее и быстрее.
Ну в общем правила, для такого стиля:
1. Чем глобальнее имя, тем но должно быть более самодокументирующимся.
2. Короткие английские слова, сокращения, и их комбинации через
underscore в качестве имен функций.
3. имя_count, или имя_size для указания размера соседнего поля
структуры, если нужно использовать подобные типы данных.
4. Окончания _s для структур, _t для typedefs, _e для enums.
5. Использовать enums вместо кучи #define.
P.S. можно почитать man perlstyle, man style, info gcc про стили.
--
Lev Walkin
vlm@netli.com
Вот вопрос: ты говоришь, Shift нажимать не удобно, а нижний почерк (_) - 2 клавиши надо нажать (Shift + "-"). еужто нажать сочетание клавишь быстрее, чем просто Shift?