А.В. Столяров - Оформление программного кода (1108519), страница 18
Текст из файла (страница 18)
Íî âîò ÷òî äåëàòü ïðè èñïîëüçîâàíèè ñòèëÿ, ãäå ñêîáêè íå òîëüêî ñíîñÿòñÿ, íî è ñäâèãàþòñÿ, îêàçûâàåòñÿ íåïîíÿòíî. Ðè÷àðä Ñòîëëìàí â GNU Coding Style Guide ïðåäëàãàåò îôîðìëÿòü do-while òàê:do{get_event(&event);res = handle_event(&event);}while (res != EV_QUIT_NOW);Ïðè âñ¼ì óâàæåíèè ê Ñòîëëìàíó, ýòà èäåÿ êðàéíå íåóäà÷íà. Åñëè öèêëçàíèìàåò õîòÿ áû äåñÿòîê ñòðîê, ïðè âçãëÿäå íà ñëîâî while ìû ñîâåðøåííî îäíîçíà÷íî íå çàìåòèì ñîîòâåòñòâóþùåå åìó do, ÷åìó ñïîñîáñòâóåò â íåìàëîé ñòåïåíè òî îáñòîÿòåëüñòâî, ÷òî öèêëû ñ ïðåäóñëîâèåì âñòðå÷àþòñÿ ãîðàçäî ÷àùå, íåæåëè öèêëû ñ ïîñòóñëîâèåì. Ïîñëå ýòîãî ìûïðèìåì while çà çàãîëîâîê öèêëà, äàëüøå, âîçìîæíî, íå çàìåòèì òî÷êóñ çàïÿòîé, à âîçìîæíî, íàîáîðîò, çàìåòèì, ðåøèì, ÷òî ýòî îøèáêà, ¾ñïîòêí¼ìñÿ¿, ïîñëå ÷åãî, ïðîñìàòðèâàÿ ôðàãìåíò óæå áîëåå âíèìàòåëüíûìâçãëÿäîì, íàéä¼ì, íàêîíåö, ïðåñëîâóòîå do, ïðè ýòîì ïîòðàòèâ íå ìåíüøå ñåêóíäû íà ðàçìûøëåíèÿ â íåïðàâèëüíîì íàïðàâëåíèè è åù¼ ïàðóñåêóíä íà òî, ÷òîáû âåðíóòüñÿ ê òåì ìûñëÿì, èç êîòîðûõ íàñ âûáèë ïðîêëÿòûé while.
Ìîæíî îïðåäåë¼ííî ñêàçàòü, ÷òî òàêèå while'û îáõîäÿòñÿ÷èòàòåëþ ïðîãðàììû ñëèøêîì äîðîãî. Ïîýòîìó, ñêîëü áû ïðîòèâíî ñèåíè âûãëÿäåëî, ìû âîçüì¼ì íà ñåáÿ ñìåëîñòü ðåêîìåíäîâàòü ÷òî-òî âðîäåñëåäóþùåãî:78do{get_event(&event);res = handle_event(&event);} while (res != EV_QUIT_NOW);Îòìåòèì, ÷òî îäíîé ýòîé ñëîæíîñòè ìîæåò áûòü âïîëíå äîñòàòî÷íî, ÷òîáû îòêàçàòüñÿ îò òàêîãî ñòèëÿ ðàññòàíîâêè îïåðàòîðíûõ ñêîáîê, ïî êðàéíåé ìåðå, äëÿ ÿçûêà Ñè (äëÿ Ïàñêàëÿ ýòîò àðãóìåíò íå äåéñòâóåò, òàìòàêîé ïðîáëåìû íåò).2.8.4. Î ìîäóëÿõ è ñëîâå staticßçûê Ñè ìîæíî íàçâàòü ìîäóëüíûì òîëüêî ñ áîëüøîé íàòÿæêîé; ðàçäåëèòü ïðîãðàììó íà Ñè íà îòäåëüíûå åäèíèöû òðàíñëÿöèè, êîíå÷íî,ìîæíî, íî â ñàìîì ÿçûêå ñðåäñòâà ïîääåðæêè ìîäóëüíîñòè ïðàêòè÷åñêèîòñóòñòâóþò.
Ïðèìåíÿåìàÿ òåõíèêà çàãîëîâî÷íûõ ôàéëîâ ñ çàùèòîé îòïîâòîðíîãî âêëþ÷åíèÿ íå ÿâëÿåòñÿ ÷àñòüþ ÿçûêà Ñè, ýòî ñêîðåå îäèíèç óäà÷íûõ õàêîâ. Ðàçäåëåíèå ïî ìîäóëÿì åù¼ íå îçíà÷àåò ëîêàëèçàöèè èì¼í; ïî óìîë÷àíèþ âñå íåëîêàëüíûå èìåíà â ìîäóëÿõ äîñòóïíû èçäðóãèõ ìîäóëåé: äàæå åñëè íå âêëþ÷èòü, íàïðèìåð, íåêóþ ãëîáàëüíóþïåðåìåííóþ â çàãîëîâî÷íèê, íà óðîâíå ðåäàêòîðà ñâÿçåé îíà âñ¼ ðàâíîáóäåò âèäíà, è ãäå-òî â äðóãîì ìåñòå âïîëíå ìîæåò îêàçàòüñÿ äèðåêòèâàextern. Ñ ôóíêöèÿìè ñèòóàöèÿ åù¼ õóæå: âèäÿ âûçîâ ôóíêöèè ñ íåçíàêîìûì èìåíåì, êîìïèëÿòîð âûäà¼ò ëèøü ïðåäóïðåæäåíèå, ïðîäîëæàÿêîìïèëÿöèþ.
Ýòî îçíà÷àåò, ÷òî, íå âûíåñÿ çàãîëîâîê ôóíêöèè â çàãîëîâî÷íûé ôàéë, ìû íà ñàìîì äåëå íè÷åãî íå äîáèëèñü.Êàê îáû÷íî, åñëè ñóùåñòâóåò òðóäíîñòü, òî íàõîäèòñÿ è ñïîñîá å¼óñòðàíåíèÿ. Ïðîãðàììèñòû îáû÷íî ñëåäóþò îïðåäåë¼ííîé òðàäèöèè âîòíîøåíèè èäåíòèôèêàòîðîâ, îïèñàííûõ â ãëîáàëüíîé îáëàñòè âèäèìîñòè (ôóíêöèé è ãëîáàëüíûõ ïåðåìåííûõ):äëÿ êàæäîãî ìîäóëÿ, êðîìå ìîäóëÿ, ñîäåðæàùåãî ôóíêöèþ main, ñëåäóåò ïðåäóñìîòðåòü îäíîèì¼ííûé çàãîëîâî÷íûé ôàéë, ïðè÷¼ì ýòîò ôàéë â îáÿçàòåëüíîì ïîðÿäêå ïîäêëþ÷àåòñÿ ê ìîäóëþ;• äëÿ êàæäîé ôóíêöèè, à ðàâíî äëÿ êàæäîé íåëîêàëüíîéïåðåìåííîé, åñòü ëèøü äâå âîçìîæíîñòè: ëèáî å¼ çàãîëîâîê (äëÿ ïåðåìåííûõ îáúÿâëåíèå ñî ñëîâîì extern) äîëæåí áûòü âûíåñåí â çàãîëîâî÷íûé ôàéë, ëèáî îïèñàíèå òàêîé ïåðåìåííîé èëè ôóíêöèè äîëæíî íà÷èíàòüñÿ ñî ñëîâà•static.79Åäèíñòâåííûì èñêëþ÷åíèåì èç ýòîãî ïðàâèëà ÿâëÿåòñÿ ôóíêöèÿ main;çàãîëîâî÷íîãî ôàéëà äëÿ å¼ ìîäóëÿ îáû÷íî íåò, à îáúÿâëÿòü å¼ êàêstatic íåëüçÿ.2.8.5.
Õàðàêòåðíûå îøèáêè â îôîðìëåíèè ôóíêöèèÄîñòàòî÷íî ÷àñòî ìîæíî âèäåòü ïðîãðàììû, â êîòîðûõ îïèñàíèÿ ëîêàëüíûõ ïåðåìåííûõ â ôóíêöèÿõ, à òàêæå çàêëþ÷èòåëüíûé îïåðàòîðreturn ïî÷åìó-òî íå ñäâèíóòû íà ðàçìåð îòñòóïà, à íàïèñàíû ñ êðàéíåéëåâîé ïîçèöèè ýêðàíà, ïðèìåðíî òàê:int main(){int i;const char *hello = "Hello";const char *goodbye = "Good Bye";for (i = 0; i < 10; i++) {printf("%s\n", hello);}for (i = 0; i < 10; i++) {printf("%s\n", goodbye);}return 0;}Òàêîé ñòèëü, ðàçóìååòñÿ, íåäîïóñòèì.
Ïðåæäå âñåãî, îïåðàòîð return ýòî îáû÷íûé îïåðàòîð, âñòðå÷àòüñÿ îí ìîæåò íå òîëüêî â ñàìîì êîíöåôóíêöèè, íî è â å¼ ñåðåäèíå, áóäó÷è ïðè ýòîì âëîæåííûì â öèêëû èâåòâëåíèÿ; íåò ñîâåðøåííî íèêàêèõ îñíîâàíèé ñ÷èòàòü, ÷òî ñëó÷àé âîçâðàòà çíà÷åíèÿ â ïîñëåäíåé ñòðî÷êå ôóíêöèè ÷åì-òî ïðèíöèïèàëüíûìîòëè÷àåòñÿ îò äðóãèõ ñèòóàöèé, êîãäà return âñòðå÷àåòñÿ â êîäå.×òî êàñàåòñÿ ïåðåìåííûõ, òî, êîíå÷íî, èõ îïèñàíèÿ îïåðàòîðàìè íåÿâëÿþòñÿ10 , íî ïðè òàêîì ñòèëå ôîðìàòèðîâàíèÿ ôèãóðíàÿ ñêîáêà, îòêðûâàþùàÿ ôóíêöèþ, íà÷èíàåò ñëèâàòüñÿ ñ îêðóæàþùèì êîäîì; ñîâåðøåííî íåÿñíî, êàêîãî ïðåèìóùåñòâà õîòÿò äîáèòüñÿ ñòîðîííèêè òàêîãîñòðàííîãî ôîðìàòèðîâàíèÿ.2.9.
Îñîáåííîñòè Ñè++2.9.1. Ñîãëàøåíèÿ îá èìåíàõÏåðâîíà÷àëüíî â Ñè++ äåéñòâîâàëè òå æå ñîãëàøåíèÿ îá èìåíàõ,êîòîðûå ïðèâû÷íû ïðîãðàììèñòàì íà ÷èñòîì Ñè: ìàêðîñû èìåíîâàëèñü10Ðå÷ü èä¼ò î ÷èñòîì Ñè; â ÿçûêå Ñè++ îïèñàíèå ïåðåìåííîé ÿâëÿåòñÿ îïåðàòîðîì.80áîëüøèìè áóêâàìè, âñ¼ îñòàëüíîå ìàëåíüêèìè. Ñëåäû ýòîãî âðåìåíèâñ¼ åù¼ ñîõðàíèëèñü â èìåíîâàíèè òèïîâ è ïðî÷èõ ñóùíîñòåé ñòàíäàðòíîé áèáëèîòåêè: âñå ñòàíäàðòíûå êëàññû, øàáëîíû è ò. ï. ïîèìåíîâàíûñ èñïîëüçîâàíèåì áóêâ íèæíåãî ðåãèñòðà.
Ñî âðåìåíåì, îäíàêî, òðàäèöèè íåñêîëüêî èçìåíèëèñü. Òå ñóùíîñòè, êîòîðûå íå çàòðàãèâàþò îòëè÷èé Ñè++ îò ÷èñòîãî Ñè îáû÷íûå ïåðåìåííûå, ôóíêöèè, êîòîðûåíå ÿâëÿþòñÿ ÷ëåíàìè êëàññîâ è ò. ï. ïî-ïðåæíåìó íàçûâàþò, êàê è â÷èñòîì Ñè, èäåíòèôèêàòîðàìè, ñîñòîÿùèìè èç ìàëåíüêèõ áóêâ è ïîä÷¼ðêèâàíèé, â íåêîòîðûõ ñëó÷àÿõ äîáàâëÿþò öèôðû, íó à ìàêðîñû ðîâíî ïî òåì æå ïðè÷èíàì, ÷òî è â Ñè íàçûâàþò ïîëíîñòüþ áîëüøèìè áóêâàìè, ÷òîáû èõ áûëî õîðîøî âèäíî. Íàäî ñêàçàòü, ÷òî ìàêðîñû âÑè++ ñèëüíî íå â ïî÷¼òå; åäèíñòâåííîå èõ èñïîëüçîâàíèå, îò êîòîðîãîíåâîçìîæíî îòîéòè ýòî çàùèòà îò ïîâòîðíîãî âêëþ÷åíèÿ çàãîëîâî÷íûõ ôàéëîâ, è âîîáùå óñëîâíàÿ êîìïèëÿöèÿ â øèðîêîì ñìûñëå, âî âñåõæå îñòàëüíûõ ñëó÷àÿõ ìîæíî (è íóæíî!) èñïîëüçîâàòü øàáëîíû, êîíñòàíòû, inline-ôóíêöèè è ïðî÷èå âîçìîæíîñòè, íå çàâÿçàííûå íà ìàêðîïðîöåññîð.
Äàæå äëÿ îáîçíà÷åíèÿ íóëåâîãî óêàçàòåëÿ ðåêîìåíäóåòñÿèñïîëüçîâàòü àðèôìåòè÷åñêèé 0, à íå ìàêðîñ NULL, êàê â ÷èñòîì Ñè.×òî æå êàñàåòñÿ èì¼í, ñâÿçàííûõ ñ íîâîââåäåíèÿìè Ñè++ êëàññàìè è èõ ìåòîäàìè (ôóíêöèÿìè-÷ëåíàìè), òî äëÿ íèõ ÷àùå âñåãî èñïîëüçóþò ¾ñìåøàííûé ðåãèñòð¿, òî åñòü â èìåíè ñî÷åòàþòñÿ òåì èëèèíûì ñïîñîáîì áóêâû âåðõíåãî è íèæíåãî ðåãèñòðà. Òàê, â èçâåñòíîéêíèãå Ãðàäè Áó÷à â èìåíàõ êëàññîâ êàæäîå ñëîâî íà÷èíàåòñÿ ñ áîëüøîéáóêâû, à äàëüøå èäóò ìàëåíüêèå, íàïðèìåð MyGoodClass, StrangeThing,Complex è ò.
ï., òîãäà êàê äëÿ èìåíîâàíèÿ ìåòîäîâ (ôóíêöèé-÷ëåíîâ) èñïîëüçóåòñÿ ÷óòü áîëåå ñëîæíàÿ íîòàöèÿ: èìÿ ìåòîäà äîëæíî ñîñòîÿòüíå ìåíåå ÷åì èç äâóõ ñëîâ, ïðè÷¼ì ïåðâîå ñëîâî ïèøóò ïîëíîñòüþ ìàëåíüêèìè áóêâàìè, à âñå îñòàëüíûå êàæäîå ñ áîëüøîé áóêâû, ïðèìåðíî òàê: closeFile, isReady, doSomethingUseful, gameScore, getXCoord,setColor... Ïîëÿ êëàññîâ è ñòðóêòóð (÷ëåíû-äàííûå) ïî-ïðåæíåìó íàçûâàþò ìàëåíüêèìè áóêâàìè ñ èñïîëüçîâàíèåì ïîä÷¼ðêèâàíèÿ äëÿ ðàçäåëåíèÿ ñëîâ, òîãäà êàê â èìåíàõ êëàññîâ è ìåòîäîâ ïîä÷¼ðêèâàíèå íåèñïîëüçóåòñÿ âîîáùå.Åñòåñòâåííî, òàêîé ñòèëü íå åäèíñòâåííûé âîçìîæíûé, ê òîìó æåìîæíî ñõîäó íàçâàòü îïðåäåë¼ííûå íåäîñòàòêè, ñâÿçàííûå ñ íèì: êîíñòðóêòîðû è äåñòðóêòîðû êëàññà òîæå ÿâëÿþòñÿ ìåòîäàìè, íî íàçûâàòüñÿ îíè îáÿçàíû òàê æå, êàê è êëàññ, â ðåçóëüòàòå ïîëó÷àåòñÿ, ÷òî íå âñåìåòîäû íàçûâàþòñÿ åäèíîîáðàçíî. Êðîìå òîãî, íå âñåãäà óäîáíî íèæíååîãðàíè÷åíèå íà êîëè÷åñòâî ñëîâ â èìåíè: ÷àñòî âîçíèêàåò æåëàíèå íàçâàòü ìåòîä îäíèì ñëîâîì, íî ñäåëàòü ýòîãî íåëüçÿ, ïîñêîëüêó õîòÿ áûîäíà çàãëàâíàÿ áóêâà â èìåíè äîëæíà ïðèñóòñòâîâàòü.
Ïîýòîìó ÷àñòîìîæíî âñòðåòèòü ïðîãðàììû íà Ñè++, ãäå ñîãëàøåíèå ¾êàæäîå ñëîâî ñáîëüøîé áóêâû¿ èñïîëüçóåòñÿ êàê äëÿ êëàññîâ, òàê è äëÿ ìåòîäîâ.812.9.2. Êëàññ èëè ñòðóêòóðà?Êàê èçâåñòíî, ôîðìàëüíî êëàññû â Ñè++ îòëè÷àþòñÿ òîëüêî ìîäåëüþ çàùèòû ïî óìîë÷àíèþ: ñòðóêòóðû èñõîäíî îòêðûòû, òîãäà êàê êëàññû èñõîäíî çàêðûòû.  îñòàëüíîì êëàññû è ñòðóêòóðû àáñîëþòíî ðàâíîïðàâíû: è òå, è äðóãèå ìîãóò èìåòü ôóíêöèè-÷ëåíû (â òîì ÷èñëå èâèðòóàëüíûå), à ìîãóò èõ íå èìåòü, è òå, è äðóãèå ìîãóò ó÷àñòâîâàòü âíàñëåäîâàíèè êàê â êà÷åñòâå ïðåäêîâ, òàê è â êà÷åñòâå ïîòîìêîâ, è èõ äàæå ìîæíî íàñëåäîâàòü äðóã îò äðóãà (êëàññ îò ñòðóêòóðû è ñòðóêòóðó îòêëàññà).
Òåì íå ìåíåå, ïðîãðàììèñòû îáû÷íî ñëåäóþò îïðåäåë¼ííîé òðàäèöèè: äëÿ ñîçäàíèÿ ¾îáúåêòîâ¿ â ñìûñëå îáúåêòíî-îðèåíòèðîâàííîãîïðîãðàììèðîâàíèÿ èñïîëüçóþòñÿ êëàññû, òîãäà êàê äëÿ ñîçäàíèÿ ñòðóêòóð äàííûõ, íàõîäÿùèõñÿ ïîä óïðàâëåíèåì ÷åãî-òî ïî îòíîøåíèþ ê íèìâíåøíåãî, èñïîëüçóþò ñòðóêòóðû.
Íàïðèìåð, ïðè ïîñòðîåíèè ñïèñêà èëèäåðåâà ñëåäóåò èñïîëüçîâàòü ñòðóêòóðû â êà÷åñòâå ýëåìåíòîâ ýòîãî ñïèñêà èëè äåðåâà, à âåñü ñïèñîê èëè äåðåâî (êàê åäèíîå öåëîå) ìîæíî ¾îáåðíóòü¿ â îáúåêò, îïèñàííûé ñ ïîìîùüþ êëàññà.Ñêàçàííîå íå îçíà÷àåò, ÷òî â ñòðóêòóðàõ íåëüçÿ îïèñûâàòü ìåòîäû;íàïðîòèâ, ïðè ðàáîòå ñ äèíàìè÷åñêèìè äàííûìè ìîæåò îêàçàòüñÿ î÷åíüóäîáíî ñíàáäèòü ñòðóêòóðó êîíñòðóêòîðîì è äåñòðóêòîðîì, à â íåêîòîðûõ ñëó÷àÿõ è äðóãèìè ìåòîäàìè.Îòìåòèì, ÷òî äëÿ èìåíîâàíèÿ ñòðóêòóð ÷àùå âñåãî ïðèìåíÿþò èäåíòèôèêàòîðû, òðàäèöèîííûå äëÿ ÷èñòîãî Ñè (âñå ñëîâà ìàëåíüêèìè áóêâàìè, ÷åðåç ïîä÷¼ðêèâàíèÿ).2.9.3. Ôîðìàòèðîâàíèå çàãîëîâêîâ êëàññîâÏîêà ðå÷ü èä¼ò î ñòðóêòóðàõ â ñìûñëå ÿçûêà Ñè, èõ îôîðìëåíèåîêàçûâàåòñÿ äîâîëüíî ïðîñòî è íè÷åì íå îòëè÷àåòñÿ îò îáñóæäàâøåãîñÿâûøå äëÿ ÷èñòîãî Ñè (ñì.
2.8.2). Íî âîò êîãäà äåëî äîõîäèò äî êëàññîâ(èëè äî ñòðóêòóð, èìåþùèõ çàêðûòóþ ÷àñòü, åñëè ó âàñ òàêèå ïðåäóñìîòðåíû), ìû ñòàëêèâàåìñÿ ñ äîïîëíèòåëüíîé ñëîæíîñòüþ èç-çà äèðåêòèâ public:, private: è protected:. Âàðèàíòîâ ñ íèìè ðîâíî äâà: ëèáîñäâèãàòü èõ íà äîïîëíèòåëüíûé ðàçìåð îòñòóïà, ëèáî íå ñäâèãàòü. Âîîáùå ãîâîðÿ, îáà ñëåäóþùèõ ôðàãìåíòà âïîëíå êîððåêòíû è äîïóñòèìû:class MyInteger {int x;public:MyInteger(int ax = 0);operator int() const;};class MyInteger {int x;public:MyInteger(int ax = 0);operator int() const;};Òåì íå ìåíåå, ïåðâûé âàðèàíò îáû÷íî âñòðå÷àåòñÿ òîëüêî â ïðîãðàììàõ íà÷èíàþùèõ, à ïðîãðàììèñòû áîëåå îïûòíûå èñïîëüçóþò âòîðîéâàðèàíò, íå ïðåäïîëàãàþùèé äîïîëíèòåëüíîãî ñäâèãà.  êà÷åñòâå îäíîé82èç ïðîáëåì ïåðâîãî âàðèàíòà ìîæíî íàçâàòü òî, ÷òî îïèñàíèÿ, èäóùèå âíà÷àëå çàãîëîâêà êëàññà, ò.
å. ñðàçó ïîñëå îòêðûâàþùåé ôèãóðíîé ñêîáêè, îêàçûâàþòñÿ ñäâèíóòû íà äâà ðàçìåðà îòñòóïà. Íà÷èíàþùèå èíîãäàïûòàþòñÿ áîðîòüñÿ ñ ýòèì ïðèìåðíî òàê:class MyInteger {int x;public:MyInteger(int ax = 0);operator int() const;};íî âîò ýòî óæå ñîâñåì íèêóäà íå ãîäèòñÿ, ïîòîìó ÷òî îïèñàíèÿ ÷ëåíîâêëàññà, êîòîðûå èìåþò, î÷åâèäíî, îäèíàêîâûé ðàíã âëîæåííîñòè (âåäüîíè âëîæåíû â êëàññ, è áîëåå íè âî ÷òî), îêàçûâàþòñÿ ñäâèíóòû íà ðàçíûé ðàçìåð ñäâèãà.2.9.4. Ôîðìàòèðîâàíèå çàãîëîâêà êîíñòðóêòîðàÇàãîëîâîê êîíñòðóêòîðà îòëè÷àåòñÿ îò çàãîëîâêà îáû÷íîé ôóíêöèèíàëè÷èåì ñïèñêà èíèöèàëèçàòîðîâ; åñëè ñïèñêà èíèöèàëèçàòîðîâ íåò, òîíèêàêèõ îñîáåííîñòåé êîíñòðóêòîð ïî ñðàâíåíèþ ñ äðóãèìè ôóíêöèÿìèíå èìååò.