А.В. Столяров - Оформление программного кода (1108519), страница 3
Текст из файла (страница 3)
Äîïóñòèì, íàì ïîòðåáîâàëîñü íàïèñàòü ôóíêöèþ, êîòîðàÿ îïðàøèâàåò äàò÷èê òåìïåðàòóðû è âîçâðàùàåò ïîëó÷åííîå çíà÷åíèå; åñëèìû íàçîâ¼ì å¼ get_temperature, òî ôîðìàëüíî âðîäå áû âñ¼ â ïîðÿäêå,íà ñàìîì æå äåëå ñ î÷åíü õîðîøåé âåðîÿòíîñòüþ íàì â äðóãîé ïîäñèñòåìå ïîòðåáóåòñÿ óçíàòü òåìïåðàòóðó, ðàíåå çàïèñàííóþ â ôàéë èëèïðîñòî çàïîìíåííóþ ãäå-òî â ïàìÿòè ïðîãðàììû, è äëÿ òàêîãî äåéñòâèÿòîæå âïîëíå ïîäîéä¼ò èäåíòèôèêàòîð get_temperature. Ê ñîæàëåíèþ,íå ñóùåñòâóåò óíèâåðñàëüíîãî ðåöåïòà, êàê èçáåæàòü òàêèõ êîíôëèêòîâ, íî êîå-÷òî ïîñîâåòîâàòü âñ¼ æå ìîæíî:âûáèðàÿ èìÿ äëÿ ãëîáàëüíî âèäèìîãî îáúåêòà, ïîäóìàéòå, íå ìîãëî áû òàêîå èìÿîáîçíà÷àòü ÷òî-òî äðóãîå.  ðàññìàòðèâàåìîì ïðèìåðå äëÿ èäåíòè-ôèêàòîðà get_temperature ìîæíî ñõîäó ïðåäëîæèòü äâå-òðè àëüòåðíàòèâíûå ðîëè, òàê ÷òî åãî ñëåäóåò ïðèçíàòü íåóäà÷íûì.
Áîëåå óäà÷íûììîã áû áûòü, íàïðèìåð, èäåíòèôèêàòîð scan_temperature_sensor, íîëèøü â òîì ñëó÷àå, åñëè îí èñïîëüçóåòñÿ äëÿ ðàáîòû ñî âñåìè òåìïåðàòóðíûìè äàò÷èêàìè, ñ êîòîðûìè èìååò äåëî âàøà ïðîãðàììà íàïðèìåð, åñëè òàêîé äàò÷èê çàâåäîìî åäèíñòâåííûé, ëèáî åñëè ôóíêöèÿscan_temperature_sensor ïîëó÷àåò íà âõîä íîìåð èëè äðóãîé èäåíòè8ôèêàòîð äàò÷èêà. Åñëè æå âàøà ôóíêöèÿ ïðåäíàçíà÷åíà äëÿ èçìåðåíèÿ, ê ïðèìåðó, òåìïåðàòóðû â ñàëîíå àâòîìîáèëÿ, ïðè÷¼ì ñóùåñòâóåòåù¼ è äàò÷èê, ñêàæåì, òåìïåðàòóðû îõëàæäàþùåé æèäêîñòè â äâèãàòåëå, òî â èìÿ ôóíêöèè ñëåäóåò äîáàâèòü åù¼ îäíî ñëîâî, ÷òîáû ïîëó÷åííîå èìÿ èäåíòèôèöèðîâàëî ïðîèñõîäÿùåå îäíîçíà÷íî, íàïðèìåð:scan_cabin_temperature_sensor.Îòìåòèì åù¼ îäèí ìîìåíò, ñâÿçàííûé ñ ãëîáàëüíûìè èäåíòèôèêàòîðàìè.
Åñëè â ÿçûêå îòñóòñòâóþò îáîñîáëåííûå ïðîñòðàíñòâà èì¼í (òàêèåêàê namespace â Ñè++), âî èçáåæàíèå âîçìîæíûõ êîíôëèêòîâ èì¼í âñåãëîáàëüíî-âèäèìûå èäåíòèôèêàòîðû, îòíîñÿùèåñÿ ê îäíîé ïîäñèñòåìå(íàïðèìåð, áèáëèîòåêå) îáû÷íî ñíàáæàþò îáùèì ïðåôèêñîì, îáîçíà÷àþùèì ýòó ïîäñèñòåìó. Íàïðèìåð, âñå âèäèìûå èäåíòèôèêàòîðû áèáëèîòåêè GNU Readline íà÷èíàþòñÿ ñ ñèìâîëîâ ¾rl_¿: rl_gets, rl_completeè ò. ï.Íåêîòîðîå âðåìÿ íàçàä áûëà äîñòàòî÷íî ïîïóëÿðíà òàê íàçûâàåìàÿ âåíãåðñêàÿ íîòàöèÿ äëÿ èäåíòèôèêàòîðîâ ïåðåìåííûõ; ýòà íîòàöèÿ òðåáóåò, ÷òîáû ëþáîé èäåíòèôèêàòîð ïåðåìåííîé íà÷èíàëñÿ ñ èíôîðìàöèè î òèïå ýòîé ïåðåìåííîé.Òàê, öåëî÷èñëåííûå ïåðåìåííûå òðåáóåòñÿ âñåãäà íà÷èíàòü ñ áóêâû i, à ïàðàìåòðôóíêöèè, ïðåäñòàâëÿþùèé ñîáîé êîíñòàíòíóþ ñòðîêó, îôîðìëåííóþ â ñîîòâåòñòâèè ñ ñîãëàøåíèÿìè Ñè (òî åñòü ñ íóë¼ì íà êîíöå), çàäàþùóþ, íàïðèìåð, èìÿôàéëà, ïðèä¼òñÿ íàçâàòü ïðèìåðíî òàê: lpczsFileName.
Óðîäëèâîå lpczs ðàñøèôðîâûâàåòñÿ êàê Long Pointer to Constant Zero-terminated String. äåéñòâèòåëüíîñòè âåíãåðñêàÿ íîòàöèÿ ïðåâðàùàåò òåêñòû ïðîãðàìì â íåóäîáî÷èòàåìûé øèôð. Ê ñ÷àñòüþ, îíà ïîñòåïåííî ïîòåðÿëà ïîïóëÿðíîñòü äàæå â ìèðå Windows, à çà åãî ïðåäåëàìè è âîâñå íèêîãäà íå èñïîëüçîâàëàñü, åñëè íå ñ÷èòàòü íåñêîëüêèõ ïðîåêòîâ 1970-õ ãîäîâ (ïðîåêòîâ äîñòàòî÷íî êðóïíûõ äëÿ ñâîåãîâðåìåíè, íî íûíå ïðåäñòàâëÿþùèõ ðàçâå ÷òî èñòîðè÷åñêèé èíòåðåñ). Òåì íå ìåíåå, ìû ñ÷èòàåì óìåñòíûì ïðåäîñòåðå÷ü ÷èòàòåëÿ îò èñïîëüçîâàíèÿ âåíãåðñêîéíîòàöèè.
Âîçìîæíî, âàì ïîïàäóòñÿ å¼ ñòîðîííèêè, êîòîðûå íà÷íóò âåñüìà óáåäèòåëüíî ðàñïèñûâàòü äîñòîèíñòâà èìåííî òàêîãî èìåíîâàíèÿ èäåíòèôèêàòîðîâ; íåîáðàùàéòå íà íèõ âíèìàíèÿ.1.2.2. Ñòðóêòóðíûå îòñòóïû: îáùèå ïðèíöèïûÑòðóêòóðà ëþáîãî ôðàãìåíòà ïðîãðàììû äîëæíà áûòü âèäíà ñ ïåðâîãî âçãëÿäà, äëÿ ÷åãî ïðèíÿòî èñïîëüçîâàòü ñòðóêòóðíûåîòñòóïû. Ïðàêòè÷åñêè âñå ñîâðåìåííûå ÿçûêè ïðîãðàììèðîâàíèÿ ïîçâîëÿþò ïîìåñòèòü â íà÷àëå ëþáîé ñòðîêè òåêñòà ïðîèçâîëüíîå êîëè÷åñòâî 1 ïðîáåëüíûõ ñèìâîëîâ ïðîáåëîâ èëè òàáóëÿöèé, ÷òî ïîçâîëÿåò1 Ëþáîïûòíûì èñêëþ÷åíèåì èç ýòîãî óòâåðæäåíèÿ îêàçûâàåòñÿ ÿçûê Python, êîòîðûé êàê ðàç íå äîïóñêàåò ïðîèçâîëüíîãî êîëè÷åñòâà ïðîáåëîâ â íà÷àëå ñòðîêè íàïðîòèâ, â í¼ì íà óðîâíå ñèíòàêñèñà èìååòñÿ æåñòêîå òðåáîâàíèå ê êîëè÷åñòâó òàêèõïðîáåëîâ, ñîîòâåòñòâóþùåå ïðèíöèïàì îôîðìëåíèÿ ñòðóêòóðíûõ îòñòóïîâ. Èíà÷å ãîâîðÿ, áîëüøèíñòâî ÿçûêîâ ïðîãðàììèðîâàíèÿ äîïóñêàþò ñîáëþäåíèå ñòðóêòóðíûõîòñòóïîâ, òîãäà êàê Python òàêîãî ñîáëþäåíèÿ òðåáóåò.9îôîðìèòü ïðîãðàììó òàê, ÷òîáû å¼ ñòðóêòóðó ìîæíî áûëî ¾ñõâàòèòü¿äàæå ðàñôîêóñèðîâàííûì âçãëÿäîì, íå â÷èòûâàÿñü.
Ñòðóêòóðà ïðîãðàììû ôîðìèðóåòñÿ ïî ïðèíöèïó âëîæåíèÿ îäíîãî â äðóãîå (íàïðèìåð, îäíèõ îïåðàòîðîâ â äðóãèå îïåðàòîðû); òåõíèêà ñòðóêòóðíûõ îòñòóïîâ ïîçâîëÿåò âûñâåòèòü ñòðóêòóðó ïðîãðàììû, ïîïðîñòó ñäâèãàÿ âïðàâî ëþáûå âëîæåííûå êîíñòðóêöèè îòíîñèòåëüíî òîãî, âî ÷òî îíè âëîæåíû. Êïðèìåðó, íà Ïàñêàëå çàãîëîâîê ïðîãðàììû, ñåêöèè îïèñàíèé êîíñòàíò,òèïîâ, ïåðåìåííûõ è ìåòîê, ïîäïðîãðàììû (ïðîöåäóðû è ôóíêöèè), àòàêæå ãëàâíàÿ ïðîãðàììà íå âëîæåíû íè âî ÷òî, òàê ÷òî èõ âñå ñëåäóåò ïèñàòü, íà÷èíàÿ ñ ïåðâîé ïîçèöèè ñòðîêè, íå îñòàâëÿÿ ïåðåä íèìèíèêàêèõ ïðîáåëüíûõ ñèìâîëîâ.
Ñ äðóãîé ñòîðîíû, êàæäîå îïèñàíèå ïåðåìåííîé âëîæåíî â ñåêöèþ îïèñàíèé, à êàæäûé îïåðàòîð ãëàâíîé ïðîãðàììû âëîæåí â ñàìó ãëàâíóþ ïðîãðàììó, è ò. ä.; ïîýòîìó èõ ñëåäóåòñäâèíóòü âïðàâî. Íà ÿçûêå Ñè âñ¼ íåñêîëüêî ïðîùå: íè âî ÷òî íå âëîæåíû îáû÷íî äèðåêòèâû ìàêðîïðîöåññîðà (#include, #define è ò. ï.),îïèñàíèÿ ôóíêöèé (NB: â ÿçûêå Ñè íåò âëîæåííûõ ôóíêöèé), îïèñàíèÿãëîáàëüíûõ ïåðåìåííûõ (âîîáùå-òî ëó÷øå íå èñïîëüçîâàòü ãëîáàëüíûåïåðåìåííûå, íî åñëè îíè âñ¼ æå ïîÿâèëèñü, òî èõ îïèñàíèÿ, ðàçóìååòñÿ,íè âî ÷òî íå âëîæåíû), è, êàê ïðàâèëî, îïèñàíèÿ òèïîâ òî÷íåå, òå èçíèõ, êîòîðûå ïðèâîäÿòñÿ âíå òåë ôóíêöèé. Âñ¼ ýòî ìû ïèøåì, íà÷èíàÿ ñïåðâîé ïîçèöèè ñòðîêè.
 òî æå âðåìÿ, ëîêàëüíûå îïèñàíèÿ ïåðåìåííûõ(à èíîãäà è òèïîâ), à òàêæå ëþáûå îïåðàòîðû, åñòåñòâåííî, âëîæåíû âôóíêöèè è äîëæíû áûòü, ñîîòâåòñòâåííî, ñäâèíóòû.Ïóñòü òåïåðü â ïðîãðàììå âñòðå÷àåòñÿ òîò èëè èíîé ñëîæíûé îïåðàòîð, òî åñòü òàêîé, â êîòîðûé â êà÷åñòâå ñîñòàâíîé ÷àñòè ìîãóò âõîäèòüäðóãèå îïåðàòîðû.
Ìîæíî íå ñîìíåâàòüñÿ, ÷òî òàêèå âñòðåòÿòñÿ: òîëüêî ñàìûå ïðîñòåíüêèå ó÷åáíûå ïðîãðàììû îáõîäÿòñÿ áåç âåòâëåíèé èöèêëîâ, íó à â âåòâëåíèÿõ è öèêëàõ òåëàìè âûñòóïàþò, â ñâîþ î÷åðåäü,îïåðàòîðû.  ýòîé ñèòóàöèè, êàê íåòðóäíî âèäåòü, îïåðàòîðû, ïðåäñòàâëÿþùèå ñîáîþ òåëà äðóãèõ îïåðàòîðîâ, äîëæíû áûòü ñäâèíóòû âïðàâîîòíîñèòåëüíî òîãî, âî ÷òî îíè âëîæåíû.Ïîÿñíèì ñêàçàííîå íà ïðèìåðå; äëÿ ýòîãî ðàññìîòðèì ïðîãðàììó,îòûñêèâàþùóþ êîðåíü ëèíåéíîãî óðàâíåíèÿ âèäà ax + b = 0. Íà Ïàñêàëå òàêàÿ ïðîãðàììà ìîæåò âûãëÿäåòü, íàïðèìåð, òàê:program linear_equation;vara, b: real;beginwriteln('This program solves a*x+b=0');write('Please type a and b: ');read(a, b);if a = 0 then beginif b = 0 then10writeln('True for any x')elsewriteln('No roots');endelsewriteln('x = ', -b / a : 5:5);end.Îáðàòèòå âíèìàíèå, ÷òî ñ êðàéíåé ëåâîé ïîçèöèè ñòðîêè ìû íà÷àëè ïèñàòü çàãîëîâîê (ñòðîêó ñî ñëîâîì program), ñåêöèþ îïèñàíèé (ñëîâî var)è ãëàâíóþ ïðîãðàììó.
Îïèñàíèÿ ïåðåìåííûõ âëîæåíû â ñåêöèþ îïèñàíèé è, ñîîòâåòñòâåííî, äîëæíû áûòü ñäâèíóòû âïðàâî; ìû ñäâèíóëè èõíà ÷åòûðå ïðîáåëà. Îïåðàòîðû ãëàâíîé ïðîãðàììû, íà÷èíàÿ ñ ïåðâîãî writeln, âëîæåíû â íå¼ è òàêæå äîëæíû áûòü ñäâèíóòû, ÷òî ìû èñäåëàëè. Íàêîíåö, òåëà îáåèõ âåòîê îïåðàòîðà if âëîæåíû â ýòîò if è,ñîîòâåòñòâåííî, ñäâèíóòû åù¼ ïðàâåå (óæå íà âîñåìü ïðîáåëîâ îò íà÷àëàñòðîêè).  îäíîé èç âåòîê ó íàñ îêàçàëñÿ åù¼ îäèí îïåðàòîð if, â êîòîðûé, â ñâîþ î÷åðåäü, âëîæåíû äâà writeln'à; èõ ðàíã âëîæåííîñòèñîñòàâëÿåò 3, è äëÿ èõ ñäâèãà ïðèìåíÿåòñÿ óæå 12 ïðîáåëîâ.Ñëåäóåò îáðàòèòü âíèìàíèå íà òî, ÷òî çíàê, çàêðûâàþùèé ñëîæíóþêîíñòðóêöèþ (â äàííîì ñëó÷àå ýòî êëþ÷åâîå ñëîâî end) äîëæåí áûòüíàïèñàí â òî÷íîñòè ñ òàêîé æå ïîçèöèè ïî ãîðèçîíòàëè, ñ êîòîðîé íà÷èíàåòñÿ ñàìà âëîæåííàÿ êîíñòðóêöèÿ.
Ïåðâûé end â íàøåé ïðîãðàììåçàêðûâàåò îïåðàòîð if, òàê ÷òî ìû ðàçìåñòèëè áóêâó e â ñëîâå end òî÷íî ïîä áóêâîé i â ñëîâå if. Âòîðîé end çàêðûâàåò ãëàâíóþ ïðîãðàììó èíàïèñàí â êðàéíåé ëåâîé ïîçèöèè ñòðîêè òî÷íî òàê æå, êàê è îòêðûâàþùèé ãëàâíóþ ïðîãðàììó begin.À òåïåðü ïîñìîòðèì, êàê ìîãëà áû âûãëÿäåòü âûøåïðèâåä¼ííàÿ ïðîãðàììà, åñëè áû ìû íå ñîáëþäàëè ñòðóêòóðíûå îòñòóïû:program linear_equation; var a, b: real; begin writeln('This program solves a*x+b=0'); write('Please type a and b: ');read(a, b); if a = 0 then begin if b = 0 then writeln('True for any x') else writeln('No roots'); end else writeln('x = ', -b / a :5:5); end.Ïîä÷åðêí¼ì, ÷òî ìû íå èçìåíèëè â ïðîãðàììå íè îäíîãî ñëîâà.
Áîëåå òîãî, êîìïèëÿòîðó àáñîëþòíî âñ¼ ðàâíî, êàêîé èç ýòèõ äâóõ òåêñòîâîáðàáàòûâàòü ðåçóëüòàò ïîëó÷èòñÿ ñîâåðøåííî îäèíàêîâûé. Èíòåðåñíî, ÷òî íàõîäÿòñÿ äàæå ëþäè, óòâåðæäàþùèå, ÷òî ïðîãðàììà íå ñòàëàíè÷óòü ñëîæíåå äëÿ ïîíèìàíèÿ íî òàêèå ëþäè, êàê ïðàâèëî, íèêîãäà íå ðàáîòàëè ñ ïðîãðàììàìè áîëåå ÷åì íà ñîòíþ ñòðîê. Ïðîãðàììó âíåîòôîðìàòèðîâàííîì âèäå, áåçóñëîâíî, òîæå ìîæíî ïðî÷èòàòü, íî ýòîçàíèìàåò â íåñêîëüêî ðàç áîëüøå âðåìåíè è îòíèìàåò ñóùåñòâåííî áîëüøå ñèë.11Àíàëîãè÷íàÿ ïðîãðàììà íà Ñè áóäåò ïðèìåðíî òàêîé:#include <stdio.h>int main(){double a, b;printf("This program solves a*x+b=0.\n");printf("Please type a and b: ");scanf("%lf %lf", &a, &b);if (a == 0) {if (b == 0)printf("True for any x.\n");elseprintf("No roots.\n");}elseprintf("x = %5.5lf\n", -b / a);return 0;}Ïðèíöèïû å¼ îôîðìëåíèÿ àáñîëþòíî òàêèå æå.Ïîäðîáíûé ðàçãîâîð îá îòñòóïàõ ó íàñ âïåðåäè, è âîîáùå èì áóäåòóäåëåíî ñàìîå ïðèñòàëüíîå âíèìàíèå, ïîñêîëüêó èìåííî ñòðóêòóðíûå îòñòóïû îêàçûâàþòñÿ ìîùíåéøèì èíñòðóìåíòîì ïîâûøåíèÿ ÷èòàåìîñòèòåêñòà ïðîãðàììû.