А.В. Столяров - Оформление программного кода (1108519), страница 11
Текст из файла (страница 11)
Åñëè ïðèíÿòî ðåøåíèå ñíîñèòüîòêðûâàþùóþ îïåðàòîðíóþ ñêîáêó íà ñëåäóþùóþ ñòðîêó (íå âàæíî, ñîñäâèãîì èëè áåç ñäâèãà), òî ýòîò ñëó÷àé íå ÿâëÿåòñÿ îñîáûì è íå òðåáóåò îòäåëüíîãî ðàññìîòðåíèÿ.  ïðèíöèïå, ìîæíî áûëî áû âîîáùå íåðàññìàòðèâàòü ýòîò ñëó÷àé â êà÷åñòâå ñïåöèàëüíîãî, íî, êàê ÷èòàòåëü ìîæåò áåç òðóäà óáåäèòüñÿ ñàìîñòîÿòåëüíî, ðåçóëüòàòû ìîãóò ïîëó÷èòüñÿíåñêîëüêî íåýñòåòè÷íûå.  ñâÿçè ñ ýòèì ìîæíî äàòü ñëåäóþùóþ ðåêîìåíäàöèþ:if-elseåñëè îäíà èç âåòâåé êîíñòðóêöèèïðåäñòàâëÿåòñîáîé ñîñòàâíîé îïåðàòîð, òî äëÿ âòîðîé âåòâè ñëåäóåò òàêæåèñïîëüçîâàòü ñîñòàâíîé îïåðàòîð, äàæå åñëè îíà ñîñòîèò èç îäíîãî ïðîñòîãî îïåðàòîðà.
Îòìåòèì, ÷òî ñëåäîâàíèå ýòîé ðåêîìåíäà-öèè, âîîáùå ãîâîðÿ, ôàêóëüòàòèâíî, õîòÿ ïðàâèëà, ïðèíÿòûå â êîíêðåòíîé ãðóïïå ðàçðàáîò÷èêîâ, ìîãóò ïðåâðàòèòü ýòó ðåêîìåíäàöèþ â òðåáîâàíèå, êàê ýòî ñäåëàíî â óæå íåîäíîêðàòíî óïîìÿíóòîì âûøå ñîîáùåñòâåðàçðàáîò÷èêîâ ÿäðà ÎÑ Linux.2.1.3.
Åñëè çàãîëîâîê ñëèøêîì äëèííûéÂñ¼ ñêàçàííîå âûøå îòíîñèòåëüíî çàãîëîâêà îïåðàòîðà è åãî òåëàñôîðìóëèðîâàíî â ïðåäïîëîæåíèè, ÷òî çàãîëîâîê ñàì ïî ñåáå (è ñ ó÷¼43òîì åãî îòñòóïà) óìåùàåòñÿ â îäíó ñòðîêó. Íî ÷òî äåëàòü, åñëè óñëîâíîåâûðàæåíèå â çàãîëîâêå îïåðàòîðà if èëè öèêëà ïîëó÷èëîñü òàêèì äëèííûì, ÷òî ïðåñëîâóòûõ 80 çíàêîìåñò íå õâàòàåò?Ïåðâîå, ÷òî íåîáõîäèìî ñäåëàòü â òàêîé ñèòóàöèè ïîäóìàòü, íåëüçÿ ëè ýòî âûðàæåíèå ïîäñîêðàòèòü. Âî ìíîãèõ ñëó÷àÿõ äëèííûå óñëîâíûå âûðàæåíèÿ âîçíèêàþò â ñèëó íåäîñòàòêà îïûòà ïðîãðàììèñòà; òàê,àâòîð ÷àñòî âèäåë â ñòóäåí÷åñêèõ ïðîãðàììàõ ïðîâåðêó ïðèíàäëåæíîñòè ñèìâîëà ê òîìó èëè èíîìó ìíîæåñòâó (íàïðèìåð, ìíîæåñòâó çíàêîâïðåïèíàíèÿ) ÷åðåç ïîñëåäîâàòåëüíîñòü ÿâíî ïðîïèñàííûõ ñðàâíåíèé ñêàæäûì èç ýëåìåíòîâ ìíîæåñòâà, ÷òî-òî âðîäå:if (a == ',' || a == '.' || a == ';' || a == ':' || a ...Ðàçóìååòñÿ, â òàêîé ñèòóàöèè íèêàêîé ïðîáëåìû ñ íåäîñòàòêîì ìåñòàâ ñòðîêå íà ñàìîì äåëå íåò, åñòü ëèøü ïðîáëåìà íåäîñòàòî÷íîñòè âîîáðàæåíèÿ.
Ïðîãðàììèñò, ìèíîâàâøèé ñòàäèþ íîâè÷êà, â òàêîé ñèòóàöèèîïèøåò ôóíêöèþ, ïðîâåðÿþùóþ íà ïðèíàäëåæíîñòü çàäàííîãî ñèìâîëàïðåäîïðåäåë¼ííîìó ìíîæåñòâó, à çàãîëîâîê if'à áóäåò ñîäåðæàòü âûçîâýòîé ôóíêöèè:if (is_punctuation(a)) {Áîëåå îïûòíûé ïðîãðàììèñò âîñïîëüçóåòñÿ ãîòîâîé ôóíêöèåé ispunctèç ñòàíäàðòíîé áèáëèîòåêè, à åù¼ áîëåå îïûòíûé, âîçìîæíî, çàÿâèò, ÷òîñòàíäàðòíàÿ ôóíêöèÿ ispunct ÷ðåçìåðíî ñëîæíà, ïîñêîëüêó çàâèñèò îòíàñòðîåê ëîêàëè â îêðóæåíèè, è âåðí¼òñÿ ê âàðèàíòó ñî ñâîåé ñîáñòâåííîé ôóíêöèåé.  ëþáîì ñëó÷àå, íèêàêîé ïðîáëåìû ñ äëèíîé çàãîëîâêàòóò íåò.Ê ñîæàëåíèþ, íå âñåãäà âñå ïðîáëåìû ðåøàþòñÿ òàê ïðîñòî.
Ìíîãîñòðî÷íûå çàãîëîâêè, êàê áû ìû íè ïûòàëèñü èõ ïîáîðîòü, âñ¼ ðàâíîèíîãäà â ïðîãðàììå âîçíèêàþò. Îäíîçíà÷íîãî îòâåòà, êàê ñ íèìè ïîñòóïèòü, ê ñîæàëåíèþ, íåò; ìû ðàññìîòðèì îäèí èç âîçìîæíûõ âàðèàíòîâ,êîòîðûé íàì ïðåäñòàâëÿåòñÿ íàèáîëåå ïðàêòè÷íûì è îòâå÷àþùèì ïîñòàâëåííîé çàäà÷è ÷èòàåìîñòè ïðîãðàììû.Èòàê,åñëè çàãîëîâîê ñëîæíîãî îïåðàòîðà ïðèõîäèòñÿ ðàçíåñòè íà íåñêîëüêî ñòðîê, òî:1. ðàçáåéòå âûðàæåíèå â çàãîëîâêå íà íåñêîëüêî ñòðîê; ïðåäïî÷òèòåëüíî ðàçðûâàòü ñòðîêó ïî ¾îïåðàöèè âåðõíåãîóðîâíÿ¿, ýòî îáû÷íî ëîãè÷åñêàÿ ñâÿçêà ¾è¿ ëèáî ¾èëè¿;2. êàæäóþ ïîñëåäóþùóþ ñòðîêó çàãîëîâêà ñäâèíüòå îòíîñèòåëüíî ïåðâîé ñòðîêè çàãîëîâêà íà îáû÷íûé ðàçìåð îòñòóïà;443.
âíå çàâèñèìîñòè îò êîëè÷åñòâà ïðîñòûõ îïåðàòîðîâ â òåëå,îáÿçàòåëüíî âîçüìèòå òåëî âàøåãî îïåðàòîðà â îïåðàòîðíûå ñêîáêè, òî åñòü ñäåëàéòå åãî ñîñòàâíûì îïåðàòîðîì;4. âíå çàâèñèìîñòè îò èñïîëüçóåìîãî ñòèëÿ, ñíåñèòå îòêðûâàþùóþ îïåðàòîðíóþ ñêîáêó íà ñëåäóþùóþ ñòðîêó, ÷òîáûîíà ïîñëóæèëà çðèòåëüíûì ðàçäåëèòåëåì ìåæäó ñòðîêàìè çàãîëîâêà è ñòðîêàìè òåëà âàøåãî îïåðàòîðà.Âñ¼ âìåñòå áóäåò âûãëÿäåòü ïðèìåðíî òàê:while (TheCollection^.KnownSet^.First = nil) and(TheCollection^.ToParse^.First <> nil) and(TheCollection^.ToParse^.First^.s = ' ') dobeginSkipSpace(TheCollection)end;while (!the_collection->known_set->first &&the_collection->to_parse->first &&the_collection->to_parse->first->s == ' '){skip_space(the_collection);}Òàêîé âàðèàíò íîðìàëüíî ñðàáîòàåò, åñëè âû íå ñäâèãàåòå ñîñòàâíîé îïåðàòîð îòíîñèòåëüíî çàãîëîâêà; åñëè æå âû ïðåäïî÷ëè èìåííî ýòîò (¾òðåòèé¿) ñòèëü îôîðìëåíèÿ, ìîæíî ïîñîâåòîâàòü ñíåñòè íà ñëåäóþùóþñòðîêó ïîñëåäíþþ ëåêñåìó çàãîëîâêà (êðóãëóþ ñêîáêó äëÿ Ñè/Ñè++,êëþ÷åâîå ñëîâî do äëÿ Ïàñêàëÿ), ïðèìåðíî òàê:while (TheCollection^.KnownSet^.First = nil) and(TheCollection^.ToParse^.First <> nil) and(TheCollection^.ToParse^.First^.s = ' ')dobeginSkipSpace(TheCollection)end;while (!the_collection->known_set->first &&the_collection->to_parse->first &&the_collection->to_parse->first->s == ' '){skip_space(the_collection);}45Ðîëü çðèòåëüíîãî ðàçäåëèòåëÿ â ýòîì ñëó÷àå èãðàåò êàê ðàç ýòîò âîòçàâåðøàþùèé ñèìâîë çàãîëîâêà.Åñëè âû èñïîëüçóåòå ñòèëü, ïðè êîòîðîì îòêðûâàþùàÿ îïåðàòîðíàÿñêîáêà îñòàâëÿåòñÿ íà îäíîé ñòðîêå ñ çàãîëîâêîì, âû ìîæåòå âîñïîëüçîâàòüñÿ åù¼ îäíèì âàðèàíòîì ôîðìàòèðîâàíèÿ: êàê â ïðåäûäóùåì ïðèìåðå, ñíåñèòå ïîñëåäíþþ ëåêñåìó çàãîëîâêà íà îòäåëüíóþ ñòðîêó, è íàýòîé æå ñòðîêå îñòàâüòå îòêðûâàþùóþ îïåðàòîðíóþ ñêîáêó:while (TheCollection^.KnownSet^.First = nil) and(TheCollection^.ToParse^.First <> nil) and(TheCollection^.ToParse^.First^.s = ' ')do beginSkipSpace(TheCollection)end;while (!the_collection->known_set->first &&the_collection->to_parse->first &&the_collection->to_parse->first->s == ' ') {skip_space(the_collection);}Òàêîé ñòèëü íðàâèòñÿ íå âñåì, íî âû è íå îáÿçàíû åìó ñëåäîâàòü; äàæååñëè âåçäå âû îñòàâëÿåòå îïåðàòîðíóþ ñêîáêó íà ñòðîêå çàãîëîâêà, äëÿñëó÷àÿ ìíîãîñòðî÷íîãî çàãîëîâêà âû âïîëíå ìîæåòå ñäåëàòü èñêëþ÷åíèåè îôîðìëÿòü åãî òàê, êàê ïîêàçàíî â ïåðâîì ïðèìåðå ýòîãî ïàðàãðàôà.2.1.4.
Çàãîëîâîê è òåëî ïîäïðîãðàììûÏðè âñåé êàæóùåéñÿ ñõîæåñòè ñèòóàöèé çàãîëîâîê ïîäïðîãðàììû(ôóíêöèè èëè ïàñêàëåâñêîé ïðîöåäóðû) ïðåäñòàâëÿåò ñîáîé ÿâëåíèå ñîâåðøåííî èíîå, íåæåëè çàãîëîâîê ñëîæíîãî îïåðàòîðà.  Ïàñêàëå â êà÷åñòâå òåëà èñïîëüçóåòñÿ íå ïðîñòî ñîñòàâíîé îïåðàòîð, à òàê íàçûâàåìûé áëîê, âêëþ÷àþùèé â ñåáÿ ñåêöèþ ëîêàëüíûõ îïèñàíèé.  Ñè/Ñè++áëîêîì ÿâëÿåòñÿ ëþáîé ñîñòàâíîé îïåðàòîð (âåäü îïèñàòü ëîêàëüíóþ ïåðåìåííóþ ìîæíî â íà÷àëå ëþáîãî òàêîãî îïåðàòîðà), íî ïðè ýòîì â êà÷åñòâå òåëà ôóíêöèè èñïîëüçóåòñÿ èìåííî áëîê ñ îïåðàòîðíûìè ñêîáêàìè,çàìåíèòü åãî îäíèì ïðîñòûì îïåðàòîðîì íåëüçÿ.
Îòìåòèì, ÷òî ðàííèåâåðñèè Ñè3 òàêæå ïðåäóñìàòðèâàëè èíôîðìàöèþ, ïîìåùàåìóþ ìåæäóçàãîëîâêîì è òåëîì ôóíêöèè èìåííî òàì ðàçìåùàëàñü èíôîðìàöèÿ3 Èìååòñÿ â âèäó òàê íàçûâàåìûé ¾K&R C¿, òî åñòü ñèíòàêñèñ, èçíà÷àëüíî ïðåäëîæåííûé Êåðíèãàíîì è Ðèò÷è. Ìíîãèå ñîâðåìåííûå êîìïèëÿòîðû äî ñèõ ïîð èìåþòðåæèì ïîääåðæêè ýòîãî âàðèàíòà ñèíòàêñèñà, íåñìîòðÿ íà òî, ÷òî äàëåêî íå âñå ïðîãðàììèñòû çíàþò î åãî ñóùåñòâîâàíèè.46î òèïàõ ôîðìàëüíûõ ïàðàìåòðîâ.  Ñè++ ñíîâà ïîÿâèëàñü ñèòóàöèÿ,êîãäà íåêóþ èíôîðìàöèþ ïðèõîäèòñÿ ïîìåñòèòü ìåæäó çàãîëîâêîì èòåëîì ýòî ñïèñîê èíèöèàëèçàòîðîâ â êîíñòðóêòîðå. îòëè÷èå îò ñëîæíîãî îïåðàòîðà, ïîäïðîãðàììà ýòî íå ôðàãìåíòðåàëèçàöèè òîãî èëè èíîãî àëãîðèòìà, à ñòðóêòóðíàÿ åäèíèöà ïðîãðàììû êàê öåëîãî, è äëÿ ïîäïðîãðàìì ïðèìåíÿþòñÿ íåñêîëüêî èíûå ñîãëàøåíèÿ îá îôîðìëåíèè.
Ïðåæäå âñåãî, âíå çàâèñèìîñòè îò èçáðàííîãîñòèëÿ äëÿ ñëîæíûõ îïåðàòîðîâ,îïåðàòîðíàÿ ñêîáêà, ñ êîòîðîé íà÷èíàåòñÿ âíåøíèé áëîê ïîäïðîãðàììû, âñåãäà ðàñïîëàãàåòñÿ íàîòäåëüíîé ñòðîêå. Äëÿ Ïàñêàëÿ ýòî òðåáîâàíèå î÷åâèäíî, äîñòàòî÷íîâñïîìíèòü î ñåêöèÿõ ëîêàëüíûõ îïèñàíèé. Äëÿ ñëó÷àÿ ÷èñòîãî Ñè, âîçìîæíî, ýòî òðåáîâàíèå ïîêàæåòñÿ íå ñòîëü î÷åâèäíûì, íî îáúÿñíåíèåìîæíî íàéòè è çäåñü.
Äåëî â òîì, ÷òî, â îòëè÷èå îò çàãîëîâêà ñëîæíîãîîïåðàòîðà,, òî åñòü ÷àñòî âñòðå÷àåòñÿ îòäåëüíî îò òåëà ïîäïðîãðàììû ïðèýòîì îí ñëóæèò îáúÿâëåíèåì ñîîòâåòñòâóþùåé ïîäïðîãðàììû, â îòëè÷èåîò îïèñàíèÿ, â êîòîðîì ïðèñóòñòâóåò òåëî.  Ïàñêàëå òåëî çàìåíÿþò äèðåêòèâîé ¾forward;¿, òîãäà êàê â Ñè îáúÿâëåíèå ôóíêöèè ïðîñòî çàâåðøàþò òî÷êîé ñ çàïÿòîé (îïÿòü-òàêè, âìåñòî òåëà). Ðàçíåñåíèå çàãîëîâêàè òåëà íà ðàçíûå ñòðîêè ïîçâîëÿåò ïîä÷åðêíóòü ôàêò ñàìîñòîÿòåëüíîñòèçàãîëîâêà.Âòîðîå ïðàâèëî ñîñòîèò â òîì, ÷òî (îïÿòü-òàêè, âíå çàâèñèìîñòè îòñòèëÿ, èñïîëüçóåìîãî äëÿ ñëîæíûõ îïåðàòîðîâ)÷åíèåçàãîëîâîê ïîäïðîãðàììû èìååò ñàìîñòîÿòåëüíîå çíà-îïåðàòîðíûå ñêîáêè âíåøíåãî áëîêà ïîäïðîãðàììû íèêîãäà íå ñäâèãàþò îòíîñèòåëüíîçàãîëîâêà. Íàïðèìåð, åñëè ïîäïðîãðàììà íè âî ÷òî íå âëîæåíà4 , òî îïåðàòîðíûå ñêîáêè, îáðàìëÿþùèå å¼ áëîê, âñåãäà ðàçìåùàþòñÿâ ïåðâîé (êðàéíåé ëåâîé) ïîçèöèè ñòðîêè.Ïðè ýòîì îñòàþòñÿ â äåéñòâèè îáùèå ïðàâèëà: ïîñëå îòêðûâàþùåéîïåðàòîðíîé ñêîáêè â ñòðîêå áîëüøå íè÷åãî íå ïèøóò, à çàêðûâàþùóþ îïåðàòîðíóþ ñêîáêó ðàçìåùàþò òî÷íî ïîä íà÷àëîì çàêðûâàåìîéåþ ñòðóêòóðû, òî åñòü â äàííîì ñëó÷àå òî÷íî ïîä îòêðûâàþùåé îïåðàòîðíîé ñêîáêîé.Òàêèì îáðàçîì, ñëåäóþùèå âàðèàíòû îêàçûâàþòñÿ íåïðàâèëüíûìè:function cube(a: real): real;begincube := a * a * aend;float cube(float a){return a * a * a;}function cube(a: real): real; begincube := a * a * aend;float cube(float a) {return a * a * a;}4  ÿçûêå Ñè ýòî âåðíî äëÿ ëþáîé ôóíêöèè, ïîñêîëüêó âëîæåííûõ ôóíêöèé â Ñèíåò; â Ïàñêàëå ïðåäóñìîòðåíû âëîæåííûå ïîäïðîãðàììû, à â Ñè++ ïîäïðîãðàììàìîæåò áûòü âëîæåíà â êëàññ èëè ñòðóêòóðó â êà÷åñòâå ìåòîäà.47function cube(a: real): real;begin cube := a * a * a end;float cube(float a){ return a * a * a; }Ïðàâèëüíî áóäåò íàïèñàòü òàê:function cube(a: real): real;begincube := a * a * aend;float cube(float a){return a * a * a;}2.2.