А.В. Столяров - Оформление программного кода (1108519), страница 14
Текст из файла (страница 14)
}void good_func(){something_big *p, *q;p = malloc(sizeof(*p));q = malloc(sizeof(*q));/* ... */quit:free(q);free(p);}quit:dispose(q);dispose(p);end;Ìåòêà çäåñü îêàçàëàñü â êðàéíåé ëåâîé ïîçèöèè èñêëþ÷èòåëüíî ïîòîìó, ÷òî èìåííî òàì ðàçìåùàåòñÿ îáúåìëþùàÿ ñòðóêòóðà (â äàííîìñëó÷àå ýòî ïîäïðîãðàììà).
Ìåòêà ìîæåò âñòðåòèòüñÿ è íå íà âåðõíåìóðîâíå, íàïðèìåð:if cond = 1 then beginwhile f <> 0 do beginwhile g <> 0 do beginwhile h <> 0 do beginif t = 0 thengoto eject;endendeject:writeln("go on...");endend58if (cond() == 1) {while (f() != 0) {while (g() != 0) {while (h() != 0) {if (t() == 0)goto eject;}}eject:printf("go on...\n");}}Ïðèâåä¼ííûé âàðèàíò íàèáîëåå ïîïóëÿðåí, íî ýòî íå åäèíñòâåííûéâàðèàíò. Äîâîëüíî ÷àñòî îïåðàòîð, ïîìå÷åííûé ìåòêîé, ïèøóò â òîé æå ñòðîêå, ÷òî è ìåòêà, ïðèìåðíî òàê:äîïóñòèìûé{ ... }quit: dispose(q);dispose(p);end;/* ... */quit: free(q);free(p);}Ýòîò âàðèàíò íåïëîõî ñìîòðèòñÿ, åñëè ìåòêà âìåñòå ñ äâîåòî÷èåìè ïðîáåëîì ïîñëå íåãî çàíèìàåò ïî ãîðèçîíòàëè ìåíüøå ìåñòà, ÷åìâûáðàííûé ðàçìåð îòñòóïà, ÷òî ïîçâîëÿåò âûäåðæàòü ãîðèçîíòàëüíîåâûðàâíèâàíèå äëÿ îïåðàòîðîâ:{ ...
}dispose(q);dispose(p);end;q:q:}/* ... */free(q);free(p);Ïîñêîëüêó èìÿ ìåòêè èç îäíîé áóêâû ñàìî ïî ñåáå ñìîòðèòñÿ íå ñëèøêîì ïðèÿòíî, îáû÷íî òàêîé ñòèëü ïðèìåíÿþò â ñî÷åòàíèè ñ èñïîëüçîâàíèåì òàáóëÿöèè â êà÷åñòâå ðàçìåðà îòñòóïà (ìàêñèìàëüíàÿ äëèíà èìåíèìåòêè ïðè ýòîì ñîñòàâëÿåò 6 ñèìâîëîâ).Íåêîòîðûå ïðîãðàììèñòû ïðåäïî÷èòàþò ðàññìàòðèâàòü ìåòêó ïðîñòîêàê ÷àñòü ïîìå÷åííîãî îïåðàòîðà, íå âûäåëÿÿ å¼ êàê îñîáóþ ñóùíîñòü;îïåðàòîð ñäâèãàþò êàê îáû÷íî, íî íà ýòîò ðàç óæå âìåñòå ñ ìåòêîé.
Êîíöîâêà âûøåïðèâåä¼ííûõ ïîäïðîãðàìì â òàêîì ñòèëå áóäåò âûãëÿäåòüòàê:{ ... }quit: dispose(q);dispose(p);end;}/* ... */quit: free(q);free(p);Èíîãäà ìåòêó ñäâèãàþò, íî ïîìå÷åííûé îïåðàòîð ñíîñÿò íà ñëåäóþùóþ ñòðîêó, ïðèìåðíî òàê:{ ... }quit:dispose(q);dispose(p);end;}/* ... */quit:free(q);free(p);Îñíîâíîé íåäîñòàòîê òàêèõ ðåøåíèé ìåòêà ¾ñëèâàåòñÿ ñ îêðóæàþùèì ïåéçàæåì¿, ïåðåñòà¼ò áûòü çàìåòíà â êà÷åñòâå îñîáîé òî÷êè â ñòðóêòóðå êîäà; âîçüì¼ì íà ñåáÿ ñìåëîñòü ðåêîìåíäîâàòü âîçäåðæàòüñÿ îò òàêîãî ñòèëÿ, íî, òåì íå ìåíåå, ñîõðàíèì ðåøåíèå çà ÷èòàòåëåì.Îñîáî ñëåäóåò ðàññìîòðåòü ñèòóàöèþ, êîãäà ìåòêà íóæíà â ñàìîìêîíöå ñîñòàâíîãî îïåðàòîðà.
Ïîñêîëüêó ïîìåòèòü ìåòêîé ìîæíî òîëüêîîïåðàòîð, â ýòîì ñëó÷àå ïðèõîäèòñÿ âñòàâèòü â ïðîãðàììó ïóñòîé îïåðàòîð, îáû÷íî ýòî òî÷êà ñ çàïÿòîé. Çäåñü ó âàñ åñòü äâà âàðèàíòà: ìîæíî59îñòàâèòü òî÷êó ñ çàïÿòîé ïîñëå ìåòêè íà îäíîé ñ íåé ñòðî÷êå, à ìîæíîñíåñòè íà ñëåäóþùóþ ñî ñäâèãîì:{ ... }quit:;end;{ ... }quit: ;end;2.5. Êàê ðàçáèòü äëèííóþ ñòðîêóÂûøå ìû óæå ñòàëêèâàëèñü ñ ïðîáëåìîé ñëèøêîì äëèííûõ ñòðîê,òî÷íåå ñ å¼ ÷àñòíûì ñëó÷àåì, êîãäà ñëèøêîì äëèííûì îêàçûâàåòñÿçàãîëîâîê ñëîæíîãî îïåðàòîðà (ñì.
2.1.3). Ðàññìîòðèì íåêîòîðûå äðóãèå ñëó÷àè, êîãäà øèðèíû ýêðàíà êàòàñòðîôè÷åñêè íå õâàòàåò.Õîòåëîñü áû ñðàçó çàìåòèòü, ÷òî ëó÷øèé ñïîñîá ñïðàâèòüñÿ ñ ñèòóàöèÿìè, îïèñàííûìè â ýòîì ïàðàãðàôå ýòî ïîïðîñòó íå äîïóñêàòü èõ.×àñòî ðóêîâîäñòâà ïî ñòèëþ îôîðìëåíèÿ êîäà ïèøóòñÿ â ïðåäïîëîæåíèè, ÷òî ïðîãðàììèñò âñåãäà ìîæåò èçáåæàòü íåæåëàòåëüíîé ñèòóàöèè,è òàì ïîïðîñòó íå ãîâîðèòñÿ î òîì, ÷òî æå íóæíî äåëàòü, åñëè ñèòóàöèÿâñ¼-òàêè ñëîæèëàñü; òàêîå ¾óìîë÷àíèå¿ ïðèâîäèò ê òîìó, ÷òî ïðîãðàììèñòû íà÷èíàþò âûõîäèòü èç ïîëîæåíèÿ êàê ïîïàëî, ïðè÷¼ì ÷àñòî äàæå ðàçíûìè ñïîñîáàìè â ðàìêàõ îäíîé ïðîãðàììû.
Âî èçáåæàíèå ýòîãîìû ïðèâåä¼ì íåñêîëüêî ïðèìåðîâ òîãî, êàê âîçìîæíî äåéñòâîâàòü, åñëèäëèííàÿ ñòðîêà íèêàê íå õî÷åò ñòàíîâèòüñÿ êîðî÷å.2.5.1. Ñëèøêîì äëèííîå âûðàæåíèå â ïðèñâàèâàíèèÈòàê, âû ïèøåòå ïðîãðàììó è î÷åðåäíàÿ ñòðîêà, ñîäåðæàùàÿ îáûêíîâåííîå ïðèñâàèâàíèå, íå æåëàåò ïîìåùàòüñÿ â 79 ñèìâîëîâ ïî øèðèíå.Ïåðâîå, ÷òî ìû ïîñîâåòóåì ñäåëàòü â ýòîé ñèòóàöèè ýòî.
Åñëè ñëåâà îò ïðèñâàèâàíèÿñòîèò ÷òî-òî äîñòàòî÷íî äëèííîå, òàêîé âàðèàíò âïîëíå ìîæåò ïîìî÷ü,íàïðèìåð:ðàçáèòü ñòðîêó ïî çíàêó ïðèñâàèâàíèÿïîïûòàòüñÿMyArray[f(x)].ThePtr^.MyField :=StrangeFunction(p, q, r) + AnotherStrangeFunction(z);Îáðàòèòå âíèìàíèå, ÷òî âûðàæåíèå, ñòîÿùåå ñïðàâà îò ïðèñâàèâàíèÿ,ìû íå ïðîñòî ñíåñëè íà ñëåäóþùóþ ñòðîêó, íî è ñäâèíóëè âïðàâî íàðàçìåð îòñòóïà.
Åñëè ïîñëå ýòîãî âûðàæåíèå âñ¼ åù¼ íå ïîìåùàåòñÿ íàýêðàí, ìîæíî íà÷àòü ðàçáèâàòü è åãî, è äåëàòü ýòî ëó÷øå âñåãî ïî çíàêàìîïåðàöèé íàèìåíüøåãî ïðèîðèòåòà, íàïðèìåð:MyArray[f(x)].ThePtr^.MyField :=StrangeFunction(p, q, r) * SillyCoeff +60AnotherStrangeFunction(z) / SecondSillyCoeff +JustAVariable;Ìîæåò ïîëó÷èòüñÿ òàê, ÷òî äàæå ïîñëå ýòîãî ýêðàí âñ¼ åù¼ îñòà¼òñÿñëèøêîì óçêèì äëÿ âàøåãî âûðàæåíèÿ. Òîãäà ìîæíî ïîïûòàòüñÿ íà÷àòüðàçáèâàòü íà íåñêîëüêî ñòðîê ïîäâûðàæåíèÿ, âõîäÿùèå â âàøå âûðàæåíèå; èõ ÷àñòè íóæíî, â ñâîþ î÷åðåäü, ñäâèíóòü åù¼ íà îäèí îòñòóï, ÷òîáûâûðàæåíèå áîëåå-ìåíåå ëåãêî ÷èòàëîñü (íàñêîëüêî âîîáùå âîçìîæíî äëÿòàêîãî ¾ìîíñòðóîçíîãî¿ âûðàæåíèÿ ãîâîðèòü î ë¼ãêîñòè ïðî÷òåíèÿ):MyArray[f(x)].ThePtr^.MyField :=StrangeFunction(p, q, r) +AnotherStrangeFunction(z) *FunctionWhichReturnsCoeff(z) *AnotherSillyFunction(z) +JustAVariable;Åñëè âûðàæåíèå ñîñòîèò èç áîëüøîãî êîëè÷åñòâà ïîäâûðàæåíèé¾âåðõíåãî óðîâíÿ¿ (íàïðèìåð, ñëàãàåìûõ), êîòîðûå ñàìè ïî ñåáå íå î÷åíüäëèííûå, âïîëíå äîïóñòèìî îñòàâëÿòü íåñêîëüêî òàêèõ ïîäâûðàæåíèé âîäíîé ñòðîêå:MyArray[f(x)].ThePtr^.MyField :=a + b + c + d + e + f + g + h + i + j + k + l + m +n + o + p + q + r + s + t + u + v + w + x + y + z;(êîíå÷íî, åñëè â ðåàëüíîñòè âàì ïðèøëîñü âîò òàê âîò ñëîæèòü 26 ïåðåìåííûõ, òî ýòî ïîâîä çàäóìàòüñÿ, ïî÷åìó âû íå èñïîëüçóåòå ìàññèâ;çäåñü ìû ïðèâîäèì ñóììó ïðîñòûõ ïåðåìåííûõ èñêëþ÷èòåëüíî äëÿ èëëþñòðàöèè, â ðåàëüíîé æèçíè âìåñòî ïåðåìåííûõ ó âàñ áóäåò ÷òî-òî áîëåå ñëîæíîå).Îòäåëüíîãî îáñóæäåíèÿ çàñëóæèâàåò ñèòóàöèÿ, êîãäà ñëåâà îò ïðèñâàèâàíèÿ ñòîèò ïðîñòîå èìÿ ïåðåìåííîé èëè äàæå âûðàæåíèå, íî êîðîòêîå, òàê ÷òî ðàçáèâêà ñòðîêè ïî çíàêó ïðèñâàèâàíèÿ íå äà¼ò íèêàêîãî (èëè ïî÷òè íèêàêîãî) âûèãðûøà.
Åñòåñòâåííî, âûðàæåíèå ñïðàâà îòïðèñâàèâàíèÿ ïî-ïðåæíåìó ëó÷øå âñåãî ðàçáèâàòü ïî îïåðàöèÿì íèçøåãî ïðèîðèòåòà; âîïðîñ ëèøü â òîì, ñ êàêîé ïîçèöèè íà÷èíàòü êàæäóþñëåäóþùóþ ñòðîêó. Îòâåòîâ íà ýòîò âîïðîñ ðîâíî äâà: êàæäóþ ñëåäóþùóþ ñòðîêó ìîæíî ëèáî ñäâèãàòü íà îäèí îòñòóï, êàê â ïðèìåðàõ âûøå,ëèáî ðàçìåùàòü å¼ íà÷àëî òî÷íî ïîä íà÷àëîì âûðàæåíèÿ â ïåðâîé ñòðîêåíàøåãî ïðèñâàèâàíèÿ (ðîâíî ïîñëå ñàìîãî çíàêà ïðèñâàèâàíèÿ). Ñðàâíèòå, âîò ïðèìåð ïåðâîãî âàðèàíòà:MyArray[n] := StrangeFunction(p, q, r) * SillyCoeff +AnotherStrangeFunction(z) / AnotherCoeff +JustAVariable;61À âîò òàê òîò æå êîä áóäåò âûãëÿäåòü, åñëè âûáðàòü âòîðîé âàðèàíò:MyArray[n] := StrangeFunction(p, q, r) * SillyCoeff +AnotherStrangeFunction(z) / AnotherCoeff +JustAVariable;Îáà âàðèàíòà äîïóñòèìû, íî ó îáîèõ âàðèàíòîâ èìåþòñÿ ñóùåñòâåííûå íåäîñòàòêè.
Ïåðâûé âàðèàíò çàìåòíî ïðîèãðûâàåò âòîðîìó â ÿñíîñòè, íî ïðè ýòîì âòîðîé âàðèàíò òðåáóåò äëÿ âòîðîé è ïîñëåäóþùèõñòðîê íåñòàíäàðòíîãî ðàçìåðà îòñòóïà, êîòîðûé îêàçûâàåòñÿ çàâèñÿùèìîò äëèíû âûðàæåíèÿ ñëåâà îò ïðèñâàèâàíèÿ. Îòìåòèì, ÷òî ýòîò (âòîðîé)âàðèàíò ñîâåðøåííî íå ãîäèòñÿ, åñëè âû èñïîëüçóåòå â êà÷åñòâå îòñòóïà òàáóëÿöèþ, ïîòîìó ÷òî äîáèòüñÿ òàêîãî âûðàâíèâàíèÿ ìîæíî òîëüêîïðîáåëàìè, à ñìåøèâàòü ïðîáåëû è òàáóëÿöèè íå ñëåäóåò íè â êîåì ñëó÷àå.Åñëè íåäîñòàòêè îáîèõ âàðèàíòîâ êàæóòñÿ âàì ñóùåñòâåííûìè, âûìîæåòå âçÿòü ñåáå çà ïðàâèëî âñåãäà ïåðåâîäèòü ñòðîêó ïîñëå çíàêà ïðèñâàèâàíèÿ, åñëè âåñü îïåðàòîð öåëèêîì íå ïîìåñòèëñÿ íà îäíó ñòðîêó.Òàêîé âàðèàíò (ðàññìîòðåííûé â íà÷àëå ïàðàãðàôà) ñâîáîäåí îò îáîèõíåäîñòàòêîâ, íî òðåáóåò èñïîëüçîâàíèÿ ëèøíåé ñòðîêè; âïðî÷åì, êàê óæåãîâîðèëîñü, çàïàñ ñòðîê âî Âñåëåííîé íåîãðàíè÷åí. Âûãëÿäåòü ýòî áóäåòòàê:MyArray[n] :=StrangeFunction(p, q, r) * SillyCoeff +AnotherStrangeFunction(z) / AnotherCoeff +JustAVariable;2.5.2.
Ñëèøêîì äëèííûé âûçîâ ïîäïðîãðàììûÅñëè ïðè îáðàùåíèè ê ïðîöåäóðå èëè ôóíêöèè ó âàñ íå ïîìåùàþòñÿâ îäíó ñòðîêó ïàðàìåòðû, òî ñòðîêó, åñòåñòâåííî, ïðèä¼òñÿ ðàçîðâàòü,è îáû÷íî ýòî äåëàþò ïîñëå î÷åðåäíîé çàïÿòîé, îòäåëÿþùåé ïàðàìåòðûäðóã îò äðóãà. Êàê è â ñëó÷àå ñ ðàçáðîñàííûì ïî íåñêîëüêèì ñòðîêàìâûðàæåíèåì, âîçíèêàåò âîïðîñ, â êàêîé ïîçèöèè íà÷àòü âòîðóþ è ïîñëåäóþùèå ñòðîêè, è âàðèàíòîâ òàê æå ðîâíî äâà: ñäâèíóòü èõ íà ðàçìåðîòñòóïà, ëèáî ñäâèíóòü èõ òàê, ÷òîáû âñå ïàðàìåòðû îêàçàëèñü çàïèñàíû¾â ñòîëáèê¿. Ïåðâûé âàðèàíò âûãëÿäèò ïðèìåðíî òàê:VeryGoodProcedure("This is the first parameter","Another parameter", YetAnotherParameter,More + Parameters * ToCome);Âòîðîé âàðèàíò äëÿ ïðèâåä¼ííîãî ïðèìåðà áóäåò âûãëÿäåòü òàê:62VeryGoodProcedure("This is the first parameter","Another parameter",YetAnotherParameter,More + Parameters * ToCome);Îòìåòèì, ÷òî ýòî âàðèàíò, êàê è àíàëîãè÷íûé âàðèàíò ôîðìàòèðîâàíèÿâûðàæåíèé, íå ãîäèòñÿ ïðè èñïîëüçîâàíèè òàáóëÿöèè â êà÷åñòâå ðàçìåðà îòñòóïà (äîáèòüñÿ òàêîãî âûðàâíèâàíèÿ ìîæíî òîëüêî ïðîáåëàìè, àñìåøèâàòü ïðîáåëû è òàáóëÿöèè íå ñëåäóåò).Åñëè îáà âàðèàíòà âàì ïî òåì èëè èíûì ïðè÷èíàì íå ïîíðàâèëèñü, ìûìîæåì ïðåäëîæèòü åù¼ îäèí âàðèàíò, êîòîðûé èñïîëüçóåòñÿ î÷åíü ðåäêî,õîòÿ è âûãëÿäèò âïîëíå ëîãè÷íûì: ðàññìàòðèâàòü èìÿ ïîäïðîãðàììû èêðóãëûå ñêîáêè â êà÷åñòâå îáú¼ìëþùåé êîíñòðóêöèè, à ïàðàìåòðû â êà÷åñòâå âëîæåííûõ êîíñòðóêöèé.
 ýòîì ñëó÷àå íàø ïðèìåð áóäåòâûãëÿäåòü òàê:VeryGoodProcedure("This is the first parameter","Another parameter", YetAnotherParameter,More + Parameters * ToCome);2.5.3. Ñëèøêîì äëèííûé çàãîëîâîê ïîäïðîãðàììû ñèòóàöèè, êîãäà íà îäíó ñòðî÷êó íå âëåç çàãîëîâîê ïîäïðîãðàììû(ïðîöåäóðû èëè ôóíêöèè), ñëåäóåò ïðåæäå âñåãî âíèìàòåëüíî ðàññìîòðåòü âîçìîæíîñòè åãî ñîêðàùåíèÿ, ïðè ýòîì äîïóñêàÿ, â ÷èñëå ïðî÷åãî,âàðèàíò ñ èçìåíåíèåì ðàçáèâêè êîäà íà ïîäïðîãðàììû. Êàê óæå ãîâîðèëîñü (ñì. 1.2.4), ïîäïðîãðàììàìè ñ øåñòüþ è áîëåå ïàðàìåòðàìè î÷åíüòÿæåëî ïîëüçîâàòüñÿ, òàê ÷òî, åñëè ïðè÷èíîé ¾ðàñïóõàíèÿ¿ çàãîëîâêàîêàçàëîñü áîëüøîå êîëè÷åñòâî ïàðàìåòðîâ, ñëåäóåò ïîäóìàòü, íåëüçÿ ëèòàê èçìåíèòü âàøó àðõèòåêòóðó, ÷òîáû ýòî êîëè÷åñòâî ñîêðàòèòü (âîçìîæíî, öåíîé ïîÿâëåíèÿ áîëüøåãî êîëè÷åñòâà ïîäïðîãðàìì).Âòîðîé ìîìåíò, íà êîòîðûé ñëåäóåò îáðàòèòü âíèìàíèå ýòî èìåíà (èäåíòèôèêàòîðû) ïàðàìåòðîâ. Ïîñêîëüêó ýòè èìåíà ëîêàëüíû äëÿâàøåé ïîäïðîãðàììû, èõ âïîëíå ìîæíî ñäåëàòü êîðîòêèìè, âïëîòü äîäâóõ-òð¼õ áóêâ.
Êîíå÷íî, ïðè ýòîì ìû ëèøàåì ýòè èìåíà ñàìîïîÿñíÿþùåé ñèëû, íî çàãîëîâîê ïîäïðîãðàììû â ëþáîì ñëó÷àå îáû÷íî ñíàáæàþò êîììåíòàðèåì (õîòÿ áû êîðîòêèì), è ñîîòâåòñòâóþùèå ïîÿñíåíèÿ îñìûñëå êàæäîãî ïàðàìåòðà ìîæíî âûíåñòè â ýòîò êîììåíòàðèé.Ê ñîæàëåíèþ, íåðåäêè ñèòóàöèè, êîãäà äàæå ïîñëå âñåõ ýòèõ óõèùðåíèé çàãîëîâîê ïî-ïðåæíåìó íå ïîìåùàåòñÿ â 79 çíàêîìåñò. Ñêîðåå âñåãî,ïðèä¼òñÿ ðàçíåñòè íà ðàçíûå ñòðîêè ñïèñîê ïàðàìåòðîâ, íî ïðåæäå ÷åìýòî äåëàòü, ñòîèò ïîïûòàòüñÿ óáðàòü íà îòäåëüíûå ñòðîêè íà÷àëî è êîíåö63çàãîëîâêà. Òàê, â Ïàñêàëå çàãîëîâîê ïîäïðîãðàììû íà÷èíàåòñÿ ñî ñëîâàprocedure èëè function; ýòî ñëîâî ìîæíî íàïèñàòü íà îòäåëüíîé ñòðîêå(ñëåäóþùàÿ ñòðîêà ïðè ýòîì íå ñäâèãàåòñÿ !). Êðîìå òîãî, òèï âîçâðàùàåìîãî çíà÷åíèÿ ôóíêöèè, óêàçàííûé â êîíöå çàãîëîâêà, òàêæå ìîæíîñíåñòè íà îòäåëüíóþ ñòðîêó âìåñòå ñ äâîåòî÷èåì, íî ýòó ñòðîêó ñëåäóåò ñäâèíóòü òàê, ÷òîáû òèï âîçâðàùàåìîãî çíà÷åíèÿ îêàçàëñÿ ãäå-òî ïîäêîíöîì ñïèñêà ïàðàìåòðîâ (äàæå åñëè âû èñïîëüçóåòå òàáóëÿöèè).