А.В. Столяров - Оформление программного кода (1108519), страница 17
Текст из файла (страница 17)
Èòàê,, îñòàâüòå òàêîå èìåíîâàíèå ñèñòåìíûìçàãîëîâî÷íûì ôàéëàì.72íå íà÷èíàéòå èìåíà âàøèõ èäåíòèôèêàòîðîâ ñ ñèìâîëà ïîä÷¼ðêèâàíèÿÎòäåëüíîãî ðàññìîòðåíèÿ çàñëóæèâàþò èäåíòèôèêàòîðû ýëåìåíòîâïåðå÷èñëèìîãî òèïà (enum). Íà ïåðâûé âçãëÿä â íèõ íåò ðîâíûì ñ÷¼òîìíè÷åãî îñîáåííîãî, ýòî îáûêíîâåííûå èäåíòèôèêàòîðû.
Îòìåòèì, ÷òî èíà âòîðîé âçãëÿä îíè òîæå ÿâëÿþòñÿ îáû÷íûìè èäåíòèôèêàòîðàìè, òàê÷òî, åñëè âû èñïîëüçóåòå enum'û ïî íàçíà÷åíèþ äëÿ îáîçíà÷åíèÿ îäíîéñèòóàöèè èç ïðåäîïðåäåë¼ííîãî ìíîæåñòâà òî èäåíòèôèêàòîðû ìîæíî (è, ïîæàëóé, íóæíî) ïèñàòü, êàê îáû÷íî, íà íèæíåì ðåãèñòðå ñ èñïîëüçîâàíèåì ïîä÷¼ðêèâàíèÿ. Åñòü, îäíàêî, îäèí ñïîñîá èñïîëüçîâàíèÿenum'îâ, âíîñÿùèé â ïðîèñõîäÿùåå îïðåäåë¼ííûå êîððåêòèâû: â êàêîéòî ìîìåíò ïðîãðàììèñòû ñîîáðàçèëè, ÷òî ïåðå÷èñëèìûé òèï (à òî÷íåå,ââîäèìûå èì èäåíòèôèêàòîðû-çíà÷åíèÿ) ìîæíî èñïîëüçîâàòü â êà÷åñòâåîáû÷íûõ öåëî÷èñëåííûõ êîíñòàíò. Íàïðèìåð, âìåñòî ïðèâåä¼ííîãî âûøå VERY_DANGEROUS_MACRO ìîæíî áûëî áû ââåñòè ñîâåðøåííî íè÷åì íåîïàñíóþ êîíñòàíòó:enum { absolutely_safe_constant = 756 };Êîíå÷íî, enum çäåñü èñïîëüçóåòñÿ íå ïî íàçíà÷åíèþ, íî äëÿ ÿçûêà Ñèòàêàÿ ñèòóàöèÿ âïîëíå òèïè÷íà, ìîæíî ïðèâåñòè è äðóãèå ïðèìåðû õàêîâ ïîäîáíîãî ðîäà.
Òàê èëè èíà÷å, èäåíòèôèêàòîð, ïîä÷èíÿþùèéñÿ îáëàñòÿì âèäèìîñòè, â ëþáîì ñëó÷àå ëó÷øå, íåæåëè òàêîé èäåíòèôèêàòîð,êîòîðûé âåä¼ò ñåáÿ êàê ñëîí â ïîñóäíîé ëàâêå (à èìåííî òàêîâû ìàêðîñûâ Ñè), ïîýòîìó ìåòîä ââåäåíèÿ êîíñòàíò êàê èäåíòèôèêàòîðîâ äëÿ ïåðå÷èñëèìûõ òèïîâ ïîëó÷èë øèðîêîå ðàñïðîñòðàíåíèå. Çäåñü âñ¼ åù¼ êàêáóäòî áû íåò ïîâîäà äëÿ áåñïîêîéñòâà, íî îí ïîÿâèòñÿ, êàê òîëüêî ìûñäåëàåì ñëåäóþùèé âïîëíå ëîãè÷íûé øàã: ðåøèì ïåðåäåëàòü òàêèìñïîñîáîì âñå óæå èìåþùèåñÿ êîíñòàíòû, êîòîðûå áûëè ðàíåå îáúÿâëåíûñ ïîìîùüþ #define è â ñîîòâåòñòâèè ñ âûøåîïèñàííûìè ñîãëàøåíèÿìèíàçâàíû èìåíàìè, ñîñòîÿùèìè èç çàãëàâíûõ áóêâ.
Âîçìîæíî, íåêîòîðûå èç íèõ ìû äàæå ïåðåèìåíóåì. Íî ðàíî èëè ïîçäíî ìû ñòîëêí¼ìñÿ ñîñëó÷àåì, êîãäà ïåðåèìåíîâàíèå êîíñòàíòû íåäîïóñòèìî: íàïðèìåð, êîíñòàíòà ÿâëÿåòñÿ ÷àñòüþ èíòåðôåéñà ïîïóëÿðíîé áèáëèîòåêè, âêëþ÷åíàâ äîêóìåíòàöèþ è èñïîëüçóåòñÿ â ïàðå äåñÿòêîâ (à òî è â ïàðå äåñÿòêîâòûñÿ÷) ïðîãðàìì. Èòàê, ìû îáíàðóæèëè êîíñòàíòó, êîòîðóþ íåëüçÿ ïåðåèìåíîâàòü; ÷òî æå òåïåðü, òàê è îñòàâèòü å¼ â âèäå ìàêðîñà? Èíîãäà,÷òî õàðàêòåðíî, èìåííî òàê è ïîñòóïàþò, â ñîâðåìåííûõ ïðîãðàììàõ íàÑè êîíñòàíòû, ââåä¼ííûå #define'îì, âñ¼ åù¼ âñòðå÷àþòñÿ ÷àùå, íåæåëè enum'îâûå. Íî, åñëè ïîäóìàòü, âàëèäíûõ ïðè÷èí äëÿ òàêîãî ðåøåíèÿïîïðîñòó íåò: â ñàìîì äåëå, íó ÷åì õóæå ñòàíåò êîä, åñëè î÷åðåäíîéìàêðîñ çàìåíèòü íà áåçîïàñíóþ êîíñòàíòó ñ òåì æå èìåíåì? Ðåçóëüòàòîì ñòàíîâèòñÿ ìàññîâîå èñïîëüçîâàíèå â êà÷åñòâå èì¼í êîíñòàíò ïåðå÷èñëèìîãî òèïà èäåíòèôèêàòîðîâ, áîëåå ïðèâû÷íûõ â ðîëè ìàêðîèì¼í,òî åñòü ñîñòîÿùèõ èç çàãëàâíûõ ëàòèíñêèõ áóêâ:enum { VERY_DANGEROUS_MACRO = 756 };73Çäåñü íàøà êîíñòàíòà óæå è íå dangerous, è íå macro, íî åñëè ïåðåèìåíîâàòü å¼ ìû íå ñìîãëè, òî ÷òî æå òåïåðü ïîäåëàòü?Ê ñîæàëåíèþ, ïðè ýòîì íåñêîëüêî íàðóøàåòñÿ åäèíîîáðàçèå èì¼íèäåíòèôèêàòîðîâ: îäíè êîíñòàíòû èìåíóþòñÿ íà íèæíåì ðåãèñòðå, àäðóãèå íà âåðõíåì.
Ïîýòîìó â íåêîòîðûõ ñòèëÿõ îôîðìëåíèÿ êîäà íàÑè ïðèñóòñòâóåò òðåáîâàíèå èìåíîâàòü ñ èñïîëüçîâàíèåì áóêâ âåðõíåãî ðåãèñòðà ëþáûå êîíñòàíòû, â òîì ÷èñëå è òàêèå, êîòîðûå íèêîãäà íåáûëè ìàêðîñàìè:enum { ABSOLUTELY_SAFE_CONSTANT = 756 };Êàê ýòî ÷àñòî áûâàåò, îêîí÷àòåëüíîãî îòâåòà íà âîïðîñ, ïðàâèëüíîýòî èëè íåò, ìû äàòü íå ñìîæåì. Åñëè âàñ ïðèãëàñèëè â ñóùåñòâóþùèéïðîåêò, ñëåäóéòå èìåþùèìñÿ ñîãëàøåíèÿì; åñëè âû íà÷èíàåòå ïðîåêò ñíóëÿ, ïîäóìàéòå ñàìè, êàê âàì áóäåò óäîáíåå èìåíîâàòü êîíñòàíòû.2.8.2.
Îïèñàíèÿ è èíèöèàëèçàòîðû ÿçûêå Ñè ÷àñòî âñòðå÷àþòñÿ îïèñàíèÿ òèïîâ è ïåðåìåííûõ, èìåþùèå äîñòàòî÷íî ñëîæíóþ ñèíòàêñè÷åñêóþ ñòðóêòóðó.Íà÷í¼ì ñ êëàññè÷åñêîé ðåêîìåíäàöèè:typedefÒàê, ïðîôèëü ñèñòåìíîãî âûçîâà signal ñ èñïîëüçîâàíèåì typedef âûãëÿäèò äîñòàòî÷íî ïðîñòî:çîâàíèåì äèðåêòèâûíå ïðåíåáðåãàéòå èñïîëüäëÿ îñîáåííî ñëîæíûõ îïèñàíèé!typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);Òî æå ñàìîå ìîæíî íàïèñàòü è áåç typedef, è âûãëÿäåòü ýòî áóäåò âîòòàê:void (*signal(int signum, void (*handler)(int)))(int);Åñëè êòî-íèáóäü ñêàæåò âàì, ÷òî ýòî îïèñàíèå-äå âïîëíå ïîíÿòíî ëþáîìó âìåíÿåìîìó ïðîãðàììèñòó, íå âåðüòå: äàæå ñàìûå îïûòíûå ïðîãðàììèñòû âûíóæäåíû ðàçáèðàòü òàêèå îïèñàíèÿ, õîòÿ íåêîòîðûå (íå âñå!)äåëàþò ýòî äîâîëüíî áûñòðî. Îòìåòèì, ÷òî âûçîâ signal ïðåäñòàâëÿåò ñîáîé ñëó÷àé äîâîëüíî ïðîñòîé; â êà÷åñòâå óïðàæíåíèÿ ïîïðîáóéòåíàïèñàòü ôóíêöèþ, êîòîðàÿ ïðèíèìàåò íà âõîä îäíèì èç ïàðàìåòðîâôóíêöèþ, èìåþùóþ òàêîé æå ïðîôèëü, êàê ó signal.Ñ îïèñàíèåì òèïà, ïðåäïîëàãàþùèì èñïîëüçîâàíèå ôèãóðíûõ ñêîáîê(struct, union, enum) âñ¼ äîâîëüíî ïðîñòî: åäèíñòâåííàÿ ñòåïåíü ñâîáîäû ïîëîæåíèå îòêðûâàþùåé ôèãóðíîé ñêîáêè (å¼, êàê âîäèòñÿ, ìîæíîîñòàâèòü íà îäíîé ñòðîêå ñ èìåíåì ñòðóêòóðû, à ìîæíî ñíåñòè íà ñëåäóþùóþ ñòðîêó).
×åãî òî÷íî íå ñëåäóåò äåëàòü ýòî ñäâèãàòü ôèãóðíûå74ñêîáêè îòíîñèòåëüíî íà÷àëà îïèñàíèÿ òèïà, òî åñòü âîò òàê ïèñàòü ìîæíî:struct item{const char *str;item *next;};struct item {const char *str;item *next;};à âîò òàê óæå íå ñòîèò:struct item{const char *str;item *next;};Ñèòóàöèÿ çäåñü ïîäîáíà ñèòóàöèè ñ íà÷àëîì è êîíöîì òåëà ôóíêöèè:âñ¼ òåëî öåëèêîì íå ñäâèãàþò äàæå ïðè èñïîëüçîâàíèè ñòèëÿ, ïðåäïîëàãàþùåãî ñäâèã ñîñòàâíîãî îïåðàòîðà îòíîñèòåëüíî çàãîëîâêà ñëîæíîãîîïåðàòîðà.Îòìåòèì, ÷òî íå ñòîèò òàêæå è ¾âûòÿãèâàòü¿ îïèñàíèå ñòðóêòóðû âîäíó ñòðîêó:struct item { const char *str; item *next; };À âîò îïèñàíèå ïåðå÷èñëèìîãî òèïà ¾âûòÿíóòü¿ ìîæíî, è ñìîòðåòüñÿýòî áóäåò âïîëíå ëîãè÷íî, íî òîëüêî â ñëó÷àå, åñëè îíî óìåùàåòñÿ â îäíóñòðîêó è íå ñîäåðæèò ÿâíî çàäàííûõ çíà÷åíèé êîíñòàíò:enum state { home, whitespace, stringconst, ident, end };Åñëè â îäíó ñòðîêó îïèñàíèå íå ïîìåñòèëîñü, èëè åñëè èìååòñÿ ïîòðåáíîñòü â ÿâíîì çàäàíèè öåëî÷èñëåííûõ çíà÷åíèé8 , òî ëó÷øå áóäåòêàæäóþ êîíñòàíòó îïèñûâàòü íà îòäåëüíîé ñòðîêå.
Îáðàòèòå âíèìàíèå,÷òî äëÿ ëó÷øåé ÷èòàåìîñòè çíàêè ðàâåíñòâà ðåêîìåíäóåòñÿ ðàñïîëîæèòüâ îäíó êîëîíêó (èñïîëüçóéòå ïðîáåëû, åñëè ïîëüçóåòåñü èìè äëÿ ñòðóêòóðíûõ îòñòóïîâ; åñëè â êà÷åñòâå îòñòóïà ó âàñ òàáóëÿöèÿ, èñïîëüçóéòåå¼ æå äëÿ âûðàâíèâàíèÿ çíàêîâ ðàâåíñòâà):enum state {st_home,st_whitespace,st_stringconst,st_ident,st_end};enum state {st_homest_whitespacest_stringconstst_identst_end};=====0,32,12,77,-18 Êðîìå ñëó÷àÿ îïèñàíèÿ àíîíèìíîãî ïñåâäîòèïà ñ öåëüþ ââåäåíèÿ îäíîé êîíñòàíòû; ýòîò ñëó÷àé ðàññìîòðåí â ïðåäûäóùåì ïàðàãðàôå.75Êàê îáû÷íî, ïîëîæåíèå îòêðûâàþùåé ôèãóðíîé ñêîáêè îïðåäåëÿåòñÿèçáðàííûì ñòèëåì.
Åñëè âû ñíîñèòå å¼ â îïèñàíèÿõ ñòðóêòóð, ñäåëàéòåòî æå ñàìîå è ïðè îïèñàíèè enum'îâ:enum state{st_home,enum state{st_home= 0,Àíàëîãè÷íî îáñòîÿò äåëà ñ äëèííûìè èíèöèàëèçàòîðàìè (íàïðèìåð,ïðè îïèñàíèè èíèöèàëèçèðîâàííûõ ìàññèâîâ). Åñëè èíèöèàëèçàòîð ïîëíîñòüþ óìåùàåòñÿ â îäíó ñòðîêó, ëó÷øå åãî òàê è çàïèñàòü:const int some_primes[] = { 11, 17, 37, 67, 131, 257, 521 };Åñëè èíèöèàëèçàòîð â îäíó ñòðîêó íå ïîìåñòèëñÿ, èëè åñëè ê çíà÷åíèÿìòðåáóþòñÿ êîììåíòàðèè, èëè ïî êàêèì-ëèáî äðóãèì ïðè÷èíàì, ìîæíîçàïèñàòü êàæäûé ýëåìåíò èíèöèàëèçàòîðà íà îòäåëüíîé ñòðîêå:const unsigned11,/*17,/*37,/*67,/*131,/*257,/*521,/*1031, /*2053/*};long hash_sizes[] = {> 8 */> 16 */> 32 */> 64 */> 128 */> 256 */> 512 */> 1024 */> 2048 */Áîëåå òîãî, íåò íè÷åãî ñòðàøíîãî â ðàçáèåíèè èíèöèàëèçàòîðà íàíåñêîëüêî ñòðîê èç ñîîáðàæåíèé ðàâíîìåðíîñòè:const unsigned long hash_sizes[] = {11,17,37,67,521,1031,2053,4099,32771,65537,131101,262147,2097169, 4194319, 8388617, 16777259,};131,257,8209,16411,524309, 1048583,33554467Ïîëîæåíèå îòêðûâàþùåé ôèãóðíîé ñêîáêè â ýòèõ ñëó÷àÿõ òàêæå çàâèñèò îò èçáðàííîãî ñòèëÿ, ïðè÷¼ì, êàê íè ñòðàííî, ÷àñòî å¼ ñäâèãàþò, òîåñòü ñëåäóþùèé âàðèàíò íå òîëüêî äîïóñòèì, íî è äîâîëüíî ïîïóëÿðåí:const unsigned long hash_sizes[] ={11,/* > 8 */17,/* > 16 */76};37,67,131,257,5211031,2053/*/*/*/*/*/*/*>>>>>>>32 */64 */128 */256 */512 */1024 */2048 */Ïðè èíèöèàëèçàöèè äâóìåðíîãî ìàññèâà îáû÷íî êàæäûé ýëåìåíò (òîåñòü îäíîìåðíûé ìàññèâ) ñòàðàþòñÿ çàïèñàòü â îäíó ñòðîêó, íàïðèìåð:const{{{{{};int change_level_table[5][5] = {4, 4, 2, 1, 1 },3, 4, 3, 1, 1 },1, 3, 4, 3, 1 },1, 1, 3, 4, 3 },1, 1, 2, 4, 4 }Åñëè æå â îäíó ñòðî÷êó êîäà êàæäàÿ ñòðîêà âàøåé ìàòðèöû íå ïîìåùàåòñÿ (ñëó÷àé ñàì ïî ñåáå äîâîëüíî ðåäêèé), ïðèä¼òñÿ èõ ðàâíîìåðíîðàçáèòü íà íåñêîëüêî ñòðî÷åê.2.8.3.
Îïåðàòîð ïîñòóñëîâèÿ ÿçûêå Ñè êëþ÷åâîå ñëîâî while èñïîëüçóåòñÿ â äâóõ ðîëÿõ: â çàãîëîâêå öèêëà ñ ïðåäóñëîâèåì è â ýïèëîãå öèêëà ñ ïîñòóñëîâèåì (do-while). îáîèõ ñëó÷àÿõ ñðàçó ïîñëå ñëîâà while ñëåäóåò óñëîâíîå âûðàæåíèå âêðóãëûõ ñêîáêàõ; êîíå÷íî, â ñëó÷àå do-while ñëåäîì çà ýòèì âûðàæåíèåì èä¼ò òî÷êà ñ çàïÿòîé, íî äëÿ ñëó÷àÿ öèêëà ñ ïóñòûì òåëîì òàêàÿ æåòî÷êà ñ çàïÿòîé ìîæåò áûòü è â ñëó÷àå îáû÷íîãî while. Èòàê, ãëÿäÿ íàêîíåö öèêëà do-while, ìîæíî (è î÷åíü ëåãêî) ïåðåïóòàòü åãî ñ öèêëîìwhile, èìåþùèì ïóñòîå òåëî.Ðåøåíèå ýòîé ïðîáëåìû äîâîëüíî î÷åâèäíî äëÿ ñòèëÿ ðàññòàíîâêèôèãóðíûõ ñêîáîê, ïðè êîòîðîì îòêðûâàþùàÿ ñêîáêà íå ñíîñèòñÿ íà ñëåäóþùóþ ñòðîêó.
Ïðåæäå âñåãî îòìåòèì, ÷òîdo while9 . Ïðîáëåìà ñîñìûñëîì while òåïåðü ðåøàåòñÿ òåì, ÷òî ñëîâî while ïîïðîñòó îñòà¼òñÿ íà òîé æå ñòðîêå, ÷òî è ïðåäøåñòâóþùàÿ åìó çàêðûâàþùàÿ ñêîáêà,ïðèìåðíî òàê, êàê ìû äëÿ ýòîãî æå ñòèëÿ ïîñòóïàëè ñî ñëîâîì else:èñïîëüçîâàíèå ôèãóðíûõ ñêîáîê â öèêëå ñòðîãî îáÿçàòåëüíî âíå âñÿêîé çàâèñèìîñòè îò êîëè÷åñòâà îïåðàòîðîâ â ýòîì òåëå9 Íåêîòîðûå ïðîãðàììèñòû äàæå ïðåáûâàþò â óâåðåííîñòè, ÷òî ýòî òðåáîâàíèåÿçûêà Ñè; íà ñàìîì äåëå ýòî íå òàê, òåëîì do-while ìîæåò áûòü ëþáîé îïåðàòîð, íåòîëüêî ñîñòàâíîé; íî ýòà âîçìîæíîñòü Ñè íèêîãäà íå èñïîëüçóåòñÿ.77do {get_event(&event);res = handle_event(&event);} while (res != EV_QUIT_NOW);Òàêîå æå ðåøåíèå ìû ìîæåì ïðèìåíèòü è äëÿ ñòèëÿ, ïðè êîòîðîì îòêðûâàþùàÿ ôèãóðíàÿ ñêîáêà ñíîñèòñÿ íà ñëåäóþùóþ ñòðîêó, íî íå ñäâèãàåòñÿ:do{get_event(&event);res = handle_event(&event);} while (res != EV_QUIT_NOW);Êîíå÷íî, òàêîå ðåøåíèå íå ñëèøêîì èçÿùíî, ïîñêîëüêó âûíóæäàåò íàñââîäèòü èñêëþ÷åíèå èç îáùåãî ïðàâèëà, îäíàêî òàê âñ¼ æå ëó÷øå, ÷åìïóòàòü êîíåö öèêëà ñ íà÷àëîì íîâîãî öèêëà.