А.В. Столяров - Оформление программного кода (1108519), страница 12
Текст из файла (страница 12)
Îñîáåííîñòè îôîðìëåíèÿ îïåðàòîðîââûáîðàÎáà ðàññìàòðèâàåìûõ íàìè ÿçûêà ïðîãðàììèðîâàíèÿ è Ïàñêàëü, èÑè ïîääåðæèâàþò îïåðàòîðû âûáîðà, ïîçâîëÿþùèå âûïîëíèòü îäèí èçíåñêîëüêèõ èìåþùèõñÿ àëüòåðíàòèâíûõ íàáîðîâ îïåðàòîðîâ.  Ïàñêàëåýòî îïåðàòîð case, â Ñè îïåðàòîð switch-case. Âíå çàâèñèìîñòè îòòîãî, êàêîãî èç òð¼õ îñíîâíûõ ñòèëåé âû ïðèäåðæèâàåòåñü, îïåðàòîð âûáîðà òðåáóåò îòâåòèòü åù¼ íà îäèí âîïðîñ: áóäåòå ëè âû ñäâèãàòü ìåòêè.Âàðèàíòîâ îòâåòà íà ýòîò âîïðîñ ðîâíî äâà: ïîëîæèòåëüíûé è îòðèöàòåëüíûé, è îçíà÷àåò ýòî, ÷òîìåòêè, îáîçíà÷àþùèå íà÷àëî î÷åðåäíîé àëüòåðíàòèâû â îïåðàòîðå âûáîðà, ìîæíî ëèáî îñòàâëÿòü âòîé êîëîíêå, ãäå íà÷èíàåòñÿ çàãîëîâîê îïåðàòîðà âûáîðà, ëèáîñäâèíóòü îòíîñèòåëüíî ïîñëåäíåãî íà ðàçìåð îòñòóïà. Êàê îáû÷-íî â òàêèõ ñëó÷àÿõ, íåîáõîäèìî çàôèêñèðîâàòü ñâîé îòâåò íà ýòîò âîïðîñè îôîðìëÿòü îïåðàòîðû âûáîðà åäèíîîáðàçíî â òåêñòå âñåé ïðîãðàììû,òî åñòü âû ìîæåòå âûáðàòü ëþáîé èç äâóõ âàðèàíòîâ, íî òîëüêî îäèíðàç íà âñþ ïðîãðàììó.Ïîÿñíèì ñêàçàííîå íà ïðèìåðå.
ßçûê Ïàñêàëü íå ïðåäïîëàãàåò â ñîñòàâå îïåðàòîðà âûáîðà èñïîëüçîâàíèå ñëîâà begin (õîòÿ ïðåäïîëàãàåò ñëîâî end), ïîýòîìó îôîðìëåíèå çàãîëîâêà è òåëà îïåðàòîðà âûáîðà, âîîáùå ãîâîðÿ, íå çàâèñèò îò òîãî, îñòàâëÿåì ëè ìû îòêðûâàþùóþîïåðàòîðíóþ ñêîáêó íà îäíîé ñòðîêå ñ çàãîëîâêîì ñëîæíîãî îïåðàòîðà,ñíîñèì ëè ìû å¼ íà ñëåäóþùóþ ñòðîêó è ñíàáæàåì ëè ìû å¼ ñâîèì ñîáñòâåííûì îòñòóïîì; ñ äðóãîé ñòîðîíû, êàæäàÿ âåòêà îïåðàòîðà âûáîðàïðåäïîëàãàåò èñïîëüçîâàíèå òîëüêî îäíîãî îïåðàòîðà, òàê ÷òî â áîëüøèíñòâå ñëó÷àåâ çäåñü ïðèõîäèòñÿ èñïîëüçîâàòü ñîñòàâíûå îïåðàòîðû,è èõ îôîðìëåíèå óæå çàâèñèò îò èçáðàííîãî ñòèëÿ.
Åñëè ìû îñòàâëÿåìîïåðàòîðíóþ ñêîáêó íà îäíîé ñòðîêå ñ çàãîëîâêîì, òî â çàâèñèìîñòè îòíàøåãî ðåøåíèÿ ïî ïîâîäó ìåòîê ìû ìîæåì íàïèñàòü òàê:48case Operation of'+': beginwriteln('Addition');c := a + b;end;'-': beginwriteln('Subtraction');c := a - b;end;else beginwriteln('Error');c := 0;endendcase Operation of'+': beginwriteln('Addition');c := a + b;end;'-': beginwriteln('Subtraction');c := a - b;end;else beginwriteln('Error');c := 0;endendÎòìåòèì, ÷òî, õîòÿ îáà âàðèàíòà ÿâëÿþòñÿ äîïóñòèìûìè, ïåðâûé âûãëÿäèò ñóùåñòâåííî ïðèâëåêàòåëüíåå è ïîíÿòíåå, òàê ÷òî åñëè ìû ïèøåì íàÏàñêàëå è îñòàâëÿåì îïåðàòîðíóþ ñêîáêó íà îäíîé ñòðîêå ñ çàãîëîâêîì,áóäåò ëó÷øå ïðèíÿòü ðåøåíèå â ïîëüçó ñäâèãàíèÿ ìåòîê.Åñëè ìû óñëîâèëèñü ñíîñèòü îïåðàòîðíóþ ñêîáêó íà ñëåäóþùóþ ñòðîêó, íî íå ñäâèãàòü å¼, âûøåïðèâåä¼ííûé ôðàãìåíò êîäà äîëæåí âûãëÿäåòü òàê:case Operation of'+':beginwriteln('Addition');c := a + b;end;'-':beginwriteln('Subtraction');c := a - b;end;elsebeginwriteln('Error');c := 0;endendcase Operation of'+':beginwriteln('Addition');c := a + b;end;'-':beginwriteln('Subtraction');c := a - b;end;elsebeginwriteln('Error');c := 0;endendÄëÿ ýòîãî ñëó÷àÿ ìû òàêæå ïîðåêîìåíäóåì ñäâèãàòü ìåòêè, íî îêîí÷àòåëüíîå ðåøåíèå îñòàâèì çà ÷èòàòåëåì.Íàêîíåö, åñëè ìû íå òîëüêî ñíîñèì îïåðàòîðíóþ ñêîáêó, íî è ñäâèãàåì å¼, òî âûãëÿäåòü ýòî áóäåò ïðèáëèçèòåëüíî òàê:49case Operation of'+':beginwriteln('Addition');c := a + b;end;'-':beginwriteln('Subtraction');c := a - b;end;elsebeginwriteln('Error');c := 0;endendcase Operation of'+':beginwriteln('Addition');c := a + b;end;'-':beginwriteln('Subtraction');c := a - b;end;elsebeginwriteln('Error');c := 0;endendÄëÿ ýòîãî ñëó÷àÿ íàøà ðåêîìåíäàöèÿ áóäåò ïðîòèâîïîëîæíîé: åñëè îïåðàòîðíûå ñêîáêè èìåþò ñâîé ñîáñòâåííûé ñäâèã, òî ìåòêè ëó÷øå íå ñäâèãàòü, ðåçóëüòàò áóäåò ýñòåòè÷íåå. ÿçûêå Ñè îïåðàòîð âûáîðà (switch) óñòðîåí íåñêîëüêî èíà÷å.
Âîïåðâûõ, â ñèíòàêñèñå îïåðàòîðà switch ïðåäóñìîòðåíà îáÿçàòåëüíàÿ îòêðûâàþùàÿ ôèãóðíàÿ ñêîáêà, â ðåçóëüòàòå ÷åãî çàãîëîâîê switch ñòàíîâèòñÿ çàâèñèìûì îò èçáðàííîãî îñíîâíîãî ñòèëÿ. Âî-âòîðûõ, â îòëè÷èåîò Ïàñêàëÿ, â îïåðàòîðå âûáîðà ÿçûêà Ñè ìû èìååì äåëî íå ñ ìíîæåñòâîì âåòâåé, à ñ îäíèì ëèíåéíûì ôðàãìåíòîì êîäà, èìåþùèì íåñêîëüêî òî÷åê âõîäà (ïî ÷èñëó ìåòîê case). Êàæäàÿ ¾âåòêà¿ ìîæåò ñîäåðæàòüïðîèçâîëüíîå êîëè÷åñòâî îïåðàòîðîâ, òàê ÷òî ñîñòàâíûå îïåðàòîðû â êà÷åñòâå âåòâåé îïåðàòîðà switch ïðèìåíÿþòñÿ î÷åíü ðåäêî5 . Óìåñòíî íàïîìíèòü, ÷òî åñëè âåòâè îïåðàòîðà âûáîðà ÿâëÿþòñÿ âçàèìîèñêëþ÷àþùèìè, òî êàæäóþ èç íèõ íóæíî çàêàí÷èâàòü îïåðàòîðîì break;, ÷òîáûíå äîïóñòèòü âûïîëíåíèÿ âåòâè, ñëåäóþùåé íåïîñðåäñòâåííî çà äàííîé.Êàê è â ñëó÷àå Ïàñêàëÿ, ïðè ðàáîòå íà Ñè íàì ïðèä¼òñÿ ïðèíÿòüðåøåíèå î òîì, ñäâèãàòü èëè íå ñäâèãàòü ìåòêè íà ñâîé îòñòóï.
Òàê,åñëè ìû îñòàâëÿåì îòêðûâàþùóþ îïåðàòîðíóþ ñêîáêó íà îäíîé ñòðîêå ñçàãîëîâêîì îïåðàòîðà, ðåçóëüòàò (ñî ñäâèãîì ìåòêè è áåç òàêîâîãî) áóäåòâûãëÿäåòü òàê:5 Åäèíñòâåííàÿ ðàçóìíàÿ ïðè÷èíà äëÿ èõ ïðèìåíåíèÿ â âåòâÿõ îïåðàòîðà switch ýòî íåîáõîäèìîñòü îïèñàíèÿ ëîêàëüíûõ ïåðåìåííûõ.  ýòîì ñëó÷àå èñïîëüçóéòå îáû÷íûå ïðàâèëà äëÿ ðàçìåùåíèÿ îïåðàòîðíûõ ñêîáîê, ñ÷èòàÿ case-ìåòêó îñîáûì ñëó÷àåìçàãîëîâêà ñëîæíîãî îïåðàòîðà.50switch (operation) {case '+':printf("Addition\n");c = a + b;break;case '-':printf("Subtraction\n");c = a - b;break;default:printf("Error\n");c = 0;}switch (operation) {case '+':printf("Addition\n");c = a + b;break;case '-':printf("Subtraction\n");c = a - b;break;default:printf("Error\n");c = 0;}Åñëè ìû ðåøèëè ñíîñèòü îòêðûâàþùóþ îïåðàòîðíóþ ñêîáêó íà ñëåäóþùóþ ñòðîêó, íî íå ñäâèãàòü å¼, âûøåïðèâåä¼ííûé ôðàãìåíò íóæíîáóäåò îôîðìèòü ïî÷òè òàê æå, îòëè÷àòüñÿ áóäåò òîëüêî ïîëîæåíèå ïðåñëîâóòîé ñêîáêè:switch (operation){case '+':printf("Addition\n");/* ...
*/switch (operation){case '+':printf("Addition\n");/* ... */Íàêîíåö, åñëè ìû âñ¼ æå ðåøèëè ñäâèãàòü ñîñòàâíîé îïåðàòîð íà äîïîëíèòåëüíûé îòñòóï, äëÿ îïåðàòîðà switch ïîëó÷èì ïðèìåðíî ñëåäóþùåå:switch (operation){case '+':printf("Addition\n");c = a + b;break;case '-':printf("Subtraction\n");c = a - b;break;default:printf("Error\n");c = 0;}switch (operation){case '+':printf("Addition\n");c = a + b;break;case '-':printf("Subtraction\n");c = a - b;break;default:printf("Error\n");c = 0;}Îäíîçíà÷íî ðåêîìåíäîâàòü òîò èëè èíîé îòâåò íà âîïðîñ î ñäâèãåìåòîê çäåñü ñëîæíî. Îòìåòèì òîëüêî, ÷òî îáû÷íî ñòèëü îôîðìëåíèÿ ìåòîê îñòàâëÿþò îáùèì êàê äëÿ case-ìåòîê, òàê è äëÿ îáû÷íûõ ìåòîê,èñïîëüçóåìûõ â îïåðàòîðå goto, à äëÿ ñëó÷àÿ ÿçûêà Ñè++ ýòî æå ðåøåíèå ðàñïðîñòðàíÿþò íà êëþ÷åâûå ñëîâà public, private è protectedâ çàãîëîâêàõ êëàññîâ; êàê ìû óâèäèì ïîçæå, èõ ëó÷øå íå ñäâèãàòü, è51èìåííî ïî ýòîé ïðè÷èíå ïðîãðàììèñòû, ðàáîòàþùèå íà Ñè++, îáû÷íîíå ñäâèãàþò è case'û.
Âïðî÷åì, ýòî òîæå íå äîãìà: âû âïîëíå ìîæåòåñ÷èòàòü case îòäåëüíûì ñëó÷àåì, äëÿ êîòîðîãî èñïîëüçóåòñÿ ñïåöèàëüíûé ñòèëü.Îáðàòèòå âíèìàíèå, ÷òî â âûøåïðèâåä¼ííûõ ïðèìåðàõ ïî÷òè íèêîãäàíå âñòðå÷àåòñÿ íèêàêîé òåêñò íà îäíîé ñòðî÷êå ñ ìåòêîé; åäèíñòâåííîåèñêëþ÷åíèå îòêðûâàþùàÿ îïåðàòîðíàÿ ñêîáêà äëÿ ñòèëÿ, ïðè êîòîðîì îíà îñòàâëÿåòñÿ íà îäíîé ñòðî÷êå ñ çàãîëîâêîì. Ýòî íå ñëó÷àéíî.Ìåòêà ñàìà ïî ñåáå ìîæåò çàíèìàòü ðàçíîå êîëè÷åñòâî çíàêîìåñò, è åñëè èñïîëüçîâàòü ñòðîêó, ãäå íàïèñàíà ìåòêà, äëÿ ðàçìåùåíèÿ îïåðàòîðà,òî ýòî ïðèâåä¼ò ëèáî ê òîìó, ÷òî îïåðàòîðû îäíîãî ðàíãà âëîæåííîñòèîêàæóòñÿ íà÷èíàþùèìèñÿ ñ ðàçíûõ ïîçèöèé, ëèáî ðàçìåð îòñòóïà âíóòðè îïåðàòîðà âûáîðà îêàæåòñÿ îòëè÷íûì îò òàêîâîãî âî âñåé îñòàëüíîéïðîãðàììå.
È òî, è äðóãîå íåäîïóñòèìî. Ïðèâåä¼ì íåñêîëüêî ïðèìåðîâïîäîáíîãî áåçîáðàçèÿ.switch (mode) {case mode_fully_active: m++;finalize_request();break;case mode_stop: m = 0;drop_request();break;default: m = -1;drop_request();} ýòîì ïðèìåðå îïåðàòîðû ðàçíûõ âåòâåé îäíîãî îïåðàòîðà âûáîðà (òîåñòü èìåþùèå çàâåäîìî îäèíàêîâûé ðàíã âëîæåííîñòè) ñäâèíóòû íà ðàçíîå êîëè÷åñòâî ïîçèöèé.switch (mode) {case mode_fully_active: m++;finalize_request();break;case mode_stop:m = 0;drop_request();break;default:m = -1;drop_request();} ýòîì ïðèìåðå îïåðàòîðû îäíîãî ðàíãà ñäâèíóòû íà îäèíàêîâîå êîëè÷åñòâî ïðîáåëîâ îòíîñèòåëüíî îáúåìëþùåãî îïåðàòîðà, íî ïðè ýòîì ñàìîýòî êîëè÷åñòâî ïðîáåëîâ çàâåäîìî íå ñîîòâåòñòâóåò ðàçìåðó ñäâèãà, ò.
ê.îïðåäåëÿåòñÿ äëèíîé èäåíòèôèêàòîðà mode_fully_active.52switch (mode) {case mode_fully_active: m++;finalize_request();break;case mode_stop: m = 0;drop_request();break;default: m = -1;drop_request();}Çäåñü ïðàâèëüíî ðàñïîëàãàþòñÿ âñå îïåðàòîðû, êðîìå òåõ, ÷òî îêàçàëèñüíà îäíîé ñòðîêå ñ ìåòêîé (îïåðàòîðû m++;, m = 0; è m = -1;); ïîñëåäíèå ðàñïîëîæåíû â ïîçèöèÿõ, îïðåäåëÿåìûõ äëèíîé èäåíòèôèêàòîðîâ âìåòêàõ, è ïðè ÷òåíèè ïðîãðàììû ýòè îïåðàòîðû î÷åíü ëåãêî íå çàìåòèòü.Èòàê, îáùåå ïðàâèëî ñîñòîèò â òîì, ÷òîíà îäíîé ñòðîêå ñ ìåòêîé â îïåðàòîðå âûáîðà ìîæåò ñòîÿòü ðàçâå ÷òî îòêðûâàþùàÿîïåðàòîðíàÿ ñêîáêà, è áîëåå íè÷åãî.