А.В. Столяров - Оформление программного кода (1108519), страница 15
Текст из файла (страница 15)
Äåëîâ òîì, ÷òî ÷èòàòåëü âàøåé ïðîãðàììû èìåííî òàì (ãäå-òî ñïðàâà) îæèäàåò óâèäåòü òèï âîçâðàùàåìîãî çíà÷åíèÿ, è íà òî, ÷òîáû îòûñêàòü åãîíà ñëåäóþùåé ñòðî÷êå ñëåâà, à íå ñïðàâà, ÷èòàòåëþ ïðèä¼òñÿ ïîòðàòèòüëèøíèå óñèëèÿ. Âñ¼ âìåñòå ìîæåò âûãëÿäåòü ïðèìåðíî òàê:procedureVeryGoodProcedure(fpar: integer; spar: MyBestRecordPtr; str: string);begin{...}end;functionVeryGoodFunction(fpar: integer; spar: MyBestRecordPtr; str: string): ExcellentRecordPtr;begin{...}end;Äëÿ ÿçûêà Ñè ìîæíî ïîñîâåòîâàòü óêàçàòü íà îòäåëüíîé ñòðîêå òèïâîçâðàùàåìîãî çíà÷åíèÿ, à òàêæå âñåâîçìîæíûå ¾õèòðûå¿ àòðèáóòû,êàê-òî static, inline è òîìó ïîäîáíîå.
 Ñè++ âñòðå÷àþòñÿ àòðèáóòûôóíêöèé, çàïèñûâàåìûå ïîñëå ñïèñêà ïàðàìåòðîâ: const äëÿ êîíñòàíòíûõ ìåòîäîâ è àòðèáóò throw(), êîòîðûå òàêæå ìîæíî ðàçìåñòèòü íàîòäåëüíîé ñòðîêå, ñäâèíóâ ìàêñèìàëüíî âïðàâî. Íàêîíåö, åñëè ôóíêöèÿâîçâðàùàåò çíà÷åíèå ñëîæíîãî òèïà, ÷àñòü îïèñàíèÿ ýòîãî òèïà ìîæåòòàêæå îêàçàòüñÿ â êîíöå çàãîëîâêà7 . Ïîñêîëüêó òèï âîçâðàùàåìîãî çíà÷åíèÿ â Ñè ìîæåò çàíèìàòü äîâîëüíî ìíîãî ìåñòà, òàêîå ðàçáèåíèå èíîãäà ïîçâîëÿåò ñïðàâèòüñÿ ñ ÷ðåçìåðíî äëèííûì çàãîëîâêîì:static const char * const *make_commandline_vector(command_database_item *lst, int cmdid, int t){/* ... */}Îòìåòèì, ÷òî òàê âñ¼ æå ëó÷øå íå ïèñàòü; åñëè âîñïîëüçîâàòüñÿ äèðåêòèâîéäëÿ îïèñàíèÿ òèïà âîçâðàùàåìîãî çíà÷åíèÿ, ÿñíîñòü ïðîãðàììû ðåçêî âîçðàñò¼ò.
Ó÷òèòå, ÷òî, íàïðèìåð, îïèñàíèå ôóíêöèè, êîòîðàÿ âîçâðàùàåò óêàçàòåëü íàìàññèâ óêàçàòåëåé íà ôóíêöèè, ïðèíèìàþùèå íà âõîä óêàçàòåëü íà ôóíêöèþ, çàñòàâèò íàäîëãî çàäóìàòüñÿ áîëüøèíñòâî ïðîãðàììèñòîâ, äàæå î÷åíü îïûòíûõ, ÷òî áûîíè òàì íè ãîâîðèëè íà ýòó òåìó.7typedef64Åñëè âñå âûøåïðèâåä¼ííûå ñïîñîáû íå ïîìîãëè è çàãîëîâîê ïîïðåæíåìó íå ïîìåùàåòñÿ ïî øèðèíå â 79 çíàêîìåñò, âàì îñòà¼òñÿ òîëüêîîäèí âàðèàíò ðàçáèòü íà ÷àñòè ñïèñîê ïàðàìåòðîâ. Åñòåñòâåííî, ïåðåâîäû ñòðîê âñòàâëÿþòñÿ ìåæäó îïèñàíèÿìè îòäåëüíûõ ïàðàìåòðîâ.
Äëÿÿçûêà Ñè â ýòîì ïëàíå âñ¼ î÷åâèäíî, ñòðîêó ðàçðûâàþò ñðàçó ïîñëå çàïÿòîé, ñòîÿùåé ïîñëå î÷åðåäíîãî èìåíè ïàðàìåòðà, òîãäà êàê äëÿ Ïàñêàëÿåñòü åù¼ îäíà îñîáåííîñòü: åñëè íåñêîëüêî ïàðàìåòðîâ èìåþò îäèí òèïè ïåðå÷èñëåíû ÷åðåç çàïÿòóþ, æåëàòåëüíî îñòàâèòü èõ íà îäíîé ñòðîêå,à ðàçðûâû ñòðîê ðàçìåùàòü ïîñëå òî÷êè ñ çàïÿòîé, ñòîÿùåé ïîñëå èìåíè òèïà.  ëþáîì ñëó÷àå, îñòà¼òñÿ âîïðîñ îòíîñèòåëüíî ãîðèçîíòàëüíîãîðàçìåùåíèÿ (ñäâèãà) âòîðîé è ïîñëåäóþùèõ ñòðîê.
Êàê è äëÿ ðàññìîòðåííûõ âûøå ñëó÷àåâ äëèííîãî âûðàæåíèÿ è äëèííîãî âûçîâà ïîäïðîãðàììû, çäåñü åñòü òðè âàðèàíòà: (1) íà÷àòü ñïèñîê ïàðàìåòðîâ íà îäíîéñòðîêå ñ èìåíåì ïîäïðîãðàììû, à ïîñëåäóþùèå ñòðîêè ñäâèíóòü íà ðàçìåð îòñòóïà; (2) íà÷àòü ñïèñîê íà îäíîé ñòðîêå ñ èìåíåì ïîäïðîãðàììû,à ïîñëåäóþùèå ñòðîêè ñäâèíóòü òàê, ÷òîáû âñå îïèñàíèÿ ïàðàìåòðîâ íà÷èíàëèñü â îäíîé è òîé æå ïîçèöèè (ýòîò ñëó÷àé íå ãîäèòñÿ, êîãäà äëÿôîðìàòèðîâàíèÿ èñïîëüçóåòñÿ òàáóëÿöèÿ), è (3) ðàññìàòðèâàÿ èìÿ ïîäïðîãðàììû è îòêðûâàþùóþ ñêîáêó êàê çàãîëîâîê ñëîæíîé ñòðóêòóðû,ñíåñòè îïèñàíèå ïåðâîãî ïàðàìåòðà íà ñëåäóþùóþ ñòðîêó, ñäâèíóâ åãîíà ðàçìåð îòñòóïà, îñòàëüíûå ïàðàìåòðû ðàçìåñòèòü ïîä íèì, à êðóãëóþ ñêîáêó, çàêðûâàþùóþ ñïèñîê ïàðàìåòðîâ, ðàçìåñòèòü íà îòäåëüíîéñòðîêå â ïåðâîé ïîçèöèè (ïîä íà÷àëîì çàãîëîâêà).2.5.4.
Äëèííàÿ ñòðîêîâàÿ êîíñòàíòà (ñòðîêîâûéëèòåðàë)Ñëó÷àé, êîãäà â ñòðîêå íå ïîìåùàåòñÿ òåêñòîâàÿ êîíñòàíòà, çàñëóæèâàåò îñîáîãî îáñóæäåíèÿ. Êîíå÷íî, ñàìîå õóäøåå, ÷òî ìîæíî ñäåëàòü ýòî ¾çàýêðàíèðîâàòü¿ ñèìâîë ïåðåâîäà ñòðîêè, ïðîäîëæèâ ñòðîêîâûé ëèòåðàë â íà÷àëå ñëåäóþùåé ñòðî÷êè êîäà.:Íå äåëàéòå òàê íèêîãäàprintf("This is a string which unfortunately is \too long to fit on a single code line\n");ßçûê Ñè++ äëÿ òàêèõ ñëó÷àåâ ïîääåðæèâàåò êîíêàòåíàöèþ ñòðîêîâûõ ëèòåðàëîâ: äâå ñòðîêîâûå êîíñòàíòû, âñòðå÷åííûå â òåêñòå ïðîãðàììû ïîäðÿä (ðàçäåë¼ííûå òîëüêî ïðîáåëüíûìè ñèìâîëàìè, âêëþ÷àÿ,åñòåñòâåííî, ïåðåâîä ñòðîêè), êîìïèëÿòîð ¾ñîëü¼ò¿ â îäíó ñòðîêó, ÷òîïîçâîëÿåò íàïèñàòü òàê:printf("This is a string which unfortunately is ""too long to fit on a single code line\n");65 Ïàñêàëå òàêîé âîçìîæíîñòè íåò, íî åñòü îïåðàöèÿ ñëîæåíèÿ ñòðîê, ÷òîïîçâîëÿåò ñäåëàòü òàê:writeln('This is a string which unfortunately is ' +'too long to fit on a single code line');Îäíàêî â ÷èñòîì Ñè íåò íè îäíîé èç ýòèõ âîçìîæíîñòåé.
Êðîìå òîãî, åäèíîå òåêñòîâîå ñîîáùåíèå, âûäàâàåìîå êàê îäíà ñòðîêà (ò. å. íå ñîäåðæàùåå ñèìâîëîâ ïåðåâîäà ñòðîêè ñðåäè âûäàâàåìîãî òåêñòà), âîîáùå ëó÷øåíå ðàçíîñèòü íà ðàçíûå ñòðîêè êîäà (ñì. çàìå÷àíèå íà ñòð. 24). Îñòà¼òñÿïîïðîáîâàòü åù¼ äâà ñïîñîáà áîðüáû ñ äëèíîé ñòðîêîâîãî ëèòåðàëà.Âî-ïåðâûõ, êàê ýòî íè áàíàëüíî, ñòîèò ïîäóìàòü, íåëüçÿ ëè ñîêðàòèòü ñîäåðæàùóþñÿ â ñòðîêå ôðàçó áåç ïîòåðè ñìûñëà. Êàê èçâåñòíî,êðàòêîñòü ñåñòðà òàëàíòà. Íàïðèìåð, äëÿ ðàññìàòðèâàåìîãî ïðèìåðàâîçìîæåí òàêîé âàðèàíò:printf("String too long to fit on a line\n");Ñìûñë àíãëèéñêîé ôðàçû ìû îñòàâèëè ïðåæíèì, íî òåïåðü îíà, âîïðåêèñîáñòâåííîìó ñìûñëó, âïîëíå íîðìàëüíî ïîìåùàåòñÿ â ñòðîêå êîäà.Âî-âòîðûõ (åñëè ñîêðàùàòü íè÷åãî íå õî÷åòñÿ), ìîæíî çàìåòèòü, ÷òîíåêîòîðûå ñòðîêîâûå êîíñòàíòû óìåñòèëèñü áû â ñòðîêå êîäà, åñëè áûñîäåðæàùèé èõ îïåðàòîð íà÷èíàëñÿ â êðàéíåé ëåâîé ïîçèöèè, ò.
å. åñëèáû íå ñòðóêòóðíûé îòñòóï.  òàêîé ñèòóàöèè ñïðàâèòüñÿ ñ óïðÿìîé êîíñòàíòîé ñîâñåì ëåãêî äîñòàòî÷íî äàòü åé èìÿ. Íàïðèìåð, â ÿçûêå Ñèìîæíî âîñïîëüçîâàòüñÿ ìàêðîñîì:#define THE_LONG_STRING \"This string could be too long if it was placed in the code"/* ... */printf("%s\n", THE_LONG_STRING);Êîíå÷íî, òàêîå ìàêðîîïðåäåëåíèå ñëåäóåò ïîìåñòèòü âíå óïðàâëÿþùèõêîíñòðóêöèé, ÷òîáû íå ïðèøëîñü åãî ñäâèãàòü; ìîæíî âûíåñòè åãî â íà÷àëî ôàéëà èëè æå (÷òî â áîëüøèíñòâå ñëó÷àåâ ïðåäïî÷òèòåëüíî) ðàçìåñòèòü åãî íåïîñðåäñòâåííî ïåðåä îïèñàíèåì ôóíêöèè, â êîòîðîé îíèñïîëüçóåòñÿ.Ê ñîæàëåíèþ, áûâàþò ñèòóàöèè, â êîòîðûõ íå ïîìîãàåò íè îäèí èçïåðå÷èñëåííûõ ñïîñîáîâ.
Òîãäà îñòà¼òñÿ ëèøü ïîñëåäîâàòü ïðàâèëàì èçLinux Kernel Coding Style Guide è îñòàâèòü â êîäå ñòðîêó, äëèíà êîòîðîé ïðåâûøàåò 80 ñèìâîëîâ. Ñëåäèòå òîëüêî, ÷òîáû ýòî ïðåâûøåíèå íåâûõîäèëî çà ãðàíü ðàçóìíîãî. Òàê, åñëè ïîëó÷èâøàÿñÿ ñòðîêà êîäà ¾âûëåçëà¿ çà 100 ñèìâîëîâ, è ïðè ýòîì âàì êàæåòñÿ, ÷òî íè îäíèì èç âûøåïåðå÷èñëåííûõ ñïîñîáîâ ïîáîðîòü çëîâðåäíóþ êîíñòàíòó íåëüçÿ, òî ýòîâàì, ñêîðåå âñåãî, òîëüêî êàæåòñÿ; àâòîð ýòèõ ñòðîê íè ðàçó çà âñþ ñâîþïðàêòèêó íå âèäåë ñèòóàöèè, â êîòîðîé ñòðîêîâóþ êîíñòàíòó íåëüçÿ áûëîáû óìåñòèòü â îáû÷íûå 80 ñèìâîëîâ, íå ãîâîðÿ óæå î ñòà.662.6.
Ðàçäåëèòåëè è ïðîáåëûÇíàêè, êîòîðûå â òåêñòå ïðîãðàììû âûäåëÿþòñÿ â îòäåëüíûå ëåêñåìû íåçàâèñèìî îò íàëè÷èÿ èëè îòñóòñòâèÿ âîêðóã íèõ ïðîáåëüíûõ ñèìâîëîâ, íàçûâàþòñÿ ðàçäåëèòåëÿìè. Îáû÷íî ýòî çíàêè àðèôìåòè÷åñêèõîïåðàöèé, ñêîáêè è çíàêè ïðåïèíàíèÿ, òàêèå êàê çàïÿòàÿ, òî÷êà ñ çàïÿòîé è äâîåòî÷èå. Íàïðèìåð, îïåðàöèè + è - ÿâëÿþòñÿ ðàçäåëèòåëÿìèêàê â Ïàñêàëå, òàê è â Ñè, ò. å. â îáîèõ ÿçûêàõ ìîæíî íàïèñàòü a + b,à ìîæíî è a+b, ñìûñë îò ýòîãî íå èçìåíèòñÿ.
 òî æå âðåìÿ, îïåðàöèÿand â Ïàñêàëå ðàçäåëèòåëåì íå ÿâëÿåòñÿ: a and b ýòî íå òî æå ñàìîå,÷òî aandb; ìåæäó òåì, å¼ àíàëîã èç ÿçûêà Ñè îïåðàöèÿ && ÿâëÿåòñÿðàçäåëèòåëåì, ò. å. ìîæíî íàïèñàòü a&&b áåç óùåðáà äëÿ ñìûñëà. Ìîæíîóêàçàòü è òàêèå ÿçûêè, â êîòîðûõ àðèôìåòè÷åñêèå îïåðàöèè ðàçäåëèòåëÿìè íå ÿâëÿþòñÿ ýòî, íàïðèìåð, Ïðîëîã è Ëèñï, â êîòîðûõ ñèìâîëû+, - è ïðî÷èå ìîãóò âõîäèòü â èäåíòèôèêàòîðû.Íåñìîòðÿ íà òî, ÷òî ïðîáåëüíûå ñèìâîëû âîêðóã ðàçäåëèòåëåé íå îáÿçàòåëüíû, â ðÿäå ñëó÷àåâ èõ äîáàâëåíèå ìîæåò ñäåëàòü òåêñò ïðîãðàììûáîëåå ýñòåòè÷íûì è ÷èòàåìûì íî íå âñåãäà. Ïðè ýòîì, êàê âîäèòñÿ,íåâîçìîæíî ïðåäëîæèòü åäèíûé óíèâåðñàëüíûé ñâîä ïðàâèë ïî ïîâîäóðàññòàíîâêè òàêèõ ïðîáåëîâ; ñóùåñòâóþò ðàçëè÷íûå ïîäõîäû ê ýòîìó,èìåþùèå ñâîè äîñòîèíñòâà è íåäîñòàòêè.Ñ óâåðåííîñòüþ ìîæíî ñêàçàòü, ÷òî ëó÷øå âñåãî ïîäõîäèò îäíîïðîñòîå ïðàâèëî:(ýòî ìîæåò áûòü êàê ñîáñòâåííî ïðîáåë, òàê è ïåðåâîä ñòðîêè).Íåêîòîðûå ïðîãðàììèñòû ñòàâÿò ïðîáåëû ñ âíóòðåííåé ñòîðîíû ñêîáîê (êðóãëûõ, êâàäðàòíûõ, ôèãóðíûõ è óãëîâûõ), ïðèìåðíî òàê:äëÿ çíàêîâ ïðåïèíàíèÿ çàïÿòûõ, òî÷åê ñ çàïÿòîé è äâîåòî÷èéïåðåä íèìè ïðîáåëû íå ñòàâÿòñÿ, à ïîñëå íèõ íàîáîðîò, ñòàâÿòñÿMyProcedure( a, b[ idx + 5 ], c );Ìû íå ðåêîìåíäóåì òàê äåëàòü, õîòÿ ýòî è äîïóñòèìî.
Åäèíñòâåííîå èñêëþ÷åíèå , êîòîðûå âîñïðèíèìàþòñÿñêîðåå íå êàê ñêîáêè, à êàê ñòðóêòóðèðóþùèå ñèìâîëû; èõ. Âî âñåõ îñòàëüíûõ ñëó÷àÿõ ïðîáåëû ñ âíóòðåííåé ñòîðîíû ñêîáîê ñòàâèòü íå ðåêîìåíäóåòñÿ;ëó÷øå íàïèñàòü òàê:ôèãóðíûå ñêîáêè ÿçûêà Ñèåòñÿ âûäåëÿòü ïðîáåëàìè ñ îáåèõ ñòîðîíðåêîìåíäó-MyProcedure(a, b[idx + 5], c);Ïðè îáðàùåíèè ê ïðîöåäóðàì è ôóíêöèÿì ïðîáåë ìåæäó èìåíåìâûçûâàåìîé ïîäïðîãðàììû è îòêðûâàþùåé ñêîáêîé îáû÷íî íåñòàâÿò, òàê æå êàê è ïðîáåë ìåæäó èìåíåì ìàññèâà è îòêðûâàþùåéêâàäðàòíîé ñêîáêîé îïåðàöèè èíäåêñèðîâàíèÿ. Èíòåðåñíî, ÷òî äëÿ ÿçûêà Ñè ÷àñòî ðåêîìåíäóþò ñòàâèòü ïðîáåë â çàãîëîâêå ñëîæíîãî îïåðàòîðà67ìåæäó åãî íàçâàíèåì (êëþ÷åâûì ñëîâîì if, while, for, switch) è îòêðûâàþùåé ñêîáêîé, îáðàìëÿþùåé óñëîâíîå âûðàæåíèå ÷òîáû îòëè÷èòüýòè ñëó÷àè îò ñëó÷àÿ âûçîâà ôóíêöèè. Ñðàâíèòå:for (i = 0; f(i) < g(); i++) {if (!cond(i)) {proceed(i);break;}} ýòîì ôðàãìåíòå ìû ïîñòàâèëè ïðîáåëû ïåðåä îòêðûâàþùèìè ñêîáêàìè â çàãîëîâêàõ îïåðàòîðîâ for è if, íî íå ïîñòàâèëè ïðîáåëîâ ïåðåäñêîáêàìè ïîñëå èì¼í ôóíêöèé f, g, cond è proceed.