А.В. Столяров - Оформление программного кода (1108519), страница 19
Текст из файла (страница 19)
Íî âîò åñëè ýòîò ñïèñîê åñòü, âîçíèêàåò, âî-ïåðâûõ, âîïðîñ,êóäà åãî ïîìåñòèòü, è, âî-âòîðûõ, ÷òî äåëàòü, åñëè îí íå âëåç íà îäíóñòðîêó.Ïðåæäå âñåãî îòìåòèì, ÷òî îáû÷íî ñïèñîê èíèöèàëèçàòîðîâ ñíîñÿò íàîòäåëüíóþ ñòðîêó (êðîìå ñëó÷àÿ, êîãäà êîíñòðóêòîð îïèñûâàåòñÿ íåïîñðåäñòâåííî â çàãîëîâêå êëàññà, íî îá ýòîì ïîçæå). Êàê ïîêàçûâàåò ïðàêòèêà, ýñòåòè÷íåå ñìîòðèòñÿ âàðèàíò ñî ñäâèãîì ýòîé ñòðîêè íà ðàçìåðîòñòóïà, íàïðèìåð:MyGoodClass::MyGoodClass(int x, const char *s): MyBaseClass(s), int_field(x){// here the body comes}Íî ìîæíî, â ïðèíöèïå, íàïèñàòü è âîò òàê:MyGoodClass::MyGoodClass(int x, const char *s): MyBaseClass(s), int_field(x){// here the body comes}Èíîãäà âñòðå÷àåòñÿ è âîò òàêîå ôîðìàòèðîâàíèå:83MyGoodClass::MyGoodClass(int x, const char *s) :MyBaseClass(s),int_field(x){Íàäî îòìåòèòü, ÷òî ñ ðàçìåùåíèåì äâîåòî÷èÿ âîçíèêàþò íàèáîëåå íåîäíîçíà÷íûå âàðèàöèè. Ìîæíî âñòðåòèòü è âîò òàêîå:MyGoodClass::MyGoodClass(int x, const char *s): MyBaseClass(s),int_field(x){è âîò òàêîå:MyGoodClass::MyGoodClass(int x, const char *s):MyBaseClass(s),int_field(x){è âîò òàêîå:MyGoodClass::MyGoodClass(int x, const char *s):MyBaseClass(s),int_field(x){Ñðàçó õîòåëîñü áû ïðåäîñòåðå÷ü ÷èòàòåëÿ îò îäíîãî âàðèàíòà, êîòîðûé,õîòÿ è äîïóñòèì (êðîìå ñëó÷àÿ èñïîëüçîâàíèÿ òàáóëÿöèè äëÿ îòñòóïîâ),íî âñ¼ æå íå ñëèøêîì ïðàâèëåí, ïîòîìó ÷òî î÷åðåäíàÿ ñòðîêà îêàçûâàåòñÿ ñäâèíóòà íà íåïîíÿòíî êàêîé óðîâåíü îòñòóïà:MyGoodClass::MyGoodClass(int x, const char *s): MyBaseClass(s),int_field(x){Äîâîëüíî óäà÷íûì îêàçûâàåòñÿ ðåøåíèå, ñòðàííîâàòî âûãëÿäÿùåå íàïåðâûé âçãëÿä, êîãäà çàïÿòóþ çàïèñûâàþò íå ïîñëå èíèöèàëèçàòîðà, àïåðåä ñëåäóþùèì, ÷òî ïîçâîëÿåò ïðåäñòàâèòü äâîåòî÷èå è çàïÿòûå êàêñâîåãî ðîäà ¾ñèìâîë íà÷àëà èíèöèàëèçàòîðà¿ è ðàññòàâèòü èõ â ñòîëáèê:MyGoodClass::MyGoodClass(int x, const char *s): MyBaseClass(s), int_field(x), another_field(s){84Îòäåëüíîãî ðàññìîòðåíèÿ çàñëóæèâàåò ñëó÷àé, êîãäà ðåøåíî èíèöèàëèçàòîðû çàïèñûâàòü â ñòðî÷êó, íî ïðè ýòîì ñïèñîê èíèöèàëèçàòîðîâíå óìåùàåòñÿ íà îäíîé ñòðîêå.
Äëÿ ýòîãî ñëó÷àÿ ìîæíî ïîðåêîìåíäîâàòü ðàçîðâàòü ýòó ñòðîêó, ïî íåîáõîäèìîñòè â íåñêîëüêèõ ìåñòàõ; âûáðàòü êîíêðåòíûå ìåñòà ðàçðûâà ìîæíî ëèáî èç ñîîáðàæåíèé ðàâíîìåðíîñòè, ëèáî èñõîäÿ èç íåêîé ¾ãðóïïèðîâî÷íîé¿ ëîãèêè (íàïðèìåð, â ïåðâîé ñòðîêå çàïèñàòü èíèöèàëèçàòîðû áàçîâûõ êëàññîâ, à èíèöèàëèçàòîðû ïîëåé ñíåñòè íà ñëåäóþùóþ ñðîêó). Íåîáõîäèìî òîëüêî ïîìíèòü, ÷òîèíèöèàëèçàòîðû îáÿçàíû ïåðå÷èñëÿòüñÿ â òîì æå ïîðÿäêå, â êîòîðîì âêëàññå îáúÿâëåíû ñîîòâåòñòâóþùèå ïîëÿ.
Ðàñïîëîæèòü òàêèå ñòðîêè, àòàêæå çíàê äâîåòî÷èÿ ìîæíî ëþáûì èç ñïîñîáîâ, ïîêàçàííûõ âûøå äëÿ¾ñòîëáèêà¿ èíèöèàëèçàòîðîâ. Íàïðèìåð:MyGoodClass::MyGoodClass(int x, const char *s): MyBaseClass(s), int_field(x), first(0), last(0),sequence_counter(1), the_collection(0),helper(new MyHelperClass(*this)){2.9.5. Òåëà ôóíêöèé â çàãîëîâêå êëàññàÒåëî ôóíêöèè-÷ëåíà êëàññà ìîæíî âûíåñòè çà ïðåäåëû çàãîëîâêàêëàññà, íî ìîæíî íàïèñàòü è â ñàìîì çàãîëîâêå; êîìïèëÿòîð ïîïûòàåòñÿ(íî íå îáÿçàí) îáðàáîòàòü òàêèå ôóíêöèè êàê èíëàéíîâûå.Ïðåæäå âñåãî îòìåòèì, ÷òî ïîëüçîâàòüñÿ ýòîé âîçìîæíîñòüþ ñëåäóåò î÷åíü îñòîðîæíî.
Âàæíåéøàÿ ðîëü îïèñàíèÿ êëàññà ñîñòîèò â òîì,÷òîáû ïðè âçãëÿäå íà íåãî ìîæíî áûëî ïîíÿòü, êàê ñëåäóåò ðàáîòàòü ñîáúåêòàìè òàêîãî êëàññà, òî åñòü êàêîâ åãî íàáîð ìåòîäîâ è êàê èìè ñëåäóåò ïîëüçîâàòüñÿ. Äëÿ ýòîãî æåëàòåëüíî (åñëè íå ñêàçàòü íåîáõîäèìî),÷òîáû îïèñàíèå êëàññà îñòàâàëîñü êîìïàêòíûì, òàêèì, ÷òîáû îõâàòèòüåãî ìîæíî áûëî îäíèì âçãëÿäîì.
ßñíî, ÷òî íàëè÷èå òåë ôóíêöèé-÷ëåíîâîòíþäü íå ñïîñîáñòâóåò ëàêîíè÷íîñòè îïèñàíèÿ êëàññà. Êðîìå òîãî, åñëèêëàññ íå ÿâëÿåòñÿ âíóòðåííèì äëÿ îòäåëüíî âçÿòîãî ìîäóëÿ, òî åãî çàãîëîâîê íåîáõîäèìî âûíåñòè â çàãîëîâî÷íûé ôàéë, êîòîðûé ñ ïîìîùüþäèðåêòèâû #include (òî åñòü òåêñòóàëüíî) áóäåò âêëþ÷àòüñÿ â äðóãèåìîäóëè; êàê ñëåäñòâèå, îáúåêòíûé êîä âñåõ ôóíêöèé-÷ëåíîâ, òåëà êîòîðûõ ïðèñóòñòâóþò â çàãîëîâêå êëàññà, áóäåò ïðèñóòñòâîâàòü â êàæäîìèç òàêèõ ìîäóëåé, ÷òî äàëåêî íå ëó÷øèì îáðàçîì ñêàçûâàåòñÿ êàê íàðàçìåðå èñïîëíÿåìîãî ôàéëà, òàê è íà ñêîðîñòè êîìïèëÿöèè ïðîåêòà.Âñ¼ ýòî ïîçâîëÿåò ñôîðìóëèðîâàòü äîâîëüíî ïðîñòîå ïðàâèëî:â çàãîëîâêå êëàññà ìîãóò ïðèñóòñòâîâàòü òåëà ôóíêöèé-÷ëåíîâ, âåñüêîä êîòîðûõ ñîñòîèò èç îäíîé ñòðîêè, ðåæå èç äâóõ, â èñêëþ÷èòåëüíûõ ñëó÷àÿõ èç òð¼õ ñòðîê; îïèñàíèÿ ôóíêöèé-÷ëåíîâáîëüøåãî îáú¼ìà ñëåäóåò âûíîñèòü çà ïðåäåëû îïèñàíèÿ êëàññà.85Îñòà¼òñÿ âîïðîñ, êàê îôîðìèòü òåëî ôóíêöèè-÷ëåíà, åñëè òàêîâîå âñ¼æå ðåøåíî îñòàâèòü â çàãîëîâêå êëàññà, è çäåñü íåîáõîäèìî çàìåòèòü, ÷òîëàêîíè÷íîñòü îïèñàíèÿ êëàññà êàê öåëîãî ýòî ñàìîñòîÿòåëüíàÿ öåëü,ðàäè äîñòèæåíèÿ êîòîðîé èìååò ñìûñë ïîæåðòâîâàòü íåêîòîðûì äðóãèìè ïðèíöèïàìè.
Òàê, åñëè òåëî ôóíêöèè ñîñòîèò èç îäíîé ñòðîêè, òî÷àñòî òàêîå òåëî çàïèñûâàþò íà îäíîé ñòðîêå ñ å¼ çàãîëîâêîì (îñîáåííî÷àñòî òàêîå âñòðå÷àåòñÿ äëÿ òàê íàçûâàåìûõ àêñåññîðîâ):class Picture {// ...int color;public:// ...int GetColor() const { return color; }void SetColor(int col) { color = col; }// ...};Áîëåå òîãî, åñëè ôóíêöèÿ-÷ëåí ñîñòîèò èç áîëåå ÷åì îäíîãî îïåðàòîðà, íîâñå ýòè îïåðàòîðû ñïîñîáíû óìåñòèòüñÿ íà îäíîé ñòðîêå, ïðîãðàììèñòû÷àñòî èäóò è íà ýòî (õîòÿ â îáû÷íûõ óñëîâèÿõ òàê ïèñàòü íè â êîåìñëó÷àå íå ñëåäóåò):class FileStream {// ...void SetFd(int f) { if (fd != -1) close(fd); fd = f; }// ...};Åñëè òåëî íèêàê íå æåëàåò ïîìåùàòüñÿ â îäíó ñòðîêó ñ çàãîëîâêîì, åãîìîæíî (öåëèêîì) ñíåñòè íà ñëåäóþùóþ ñòðîêó, ïî-ïðåæíåìó çàïèñàâ îäíîé ñòðî÷êîé.  ýòîì ñëó÷àå îòêðûâàþùóþ ôèãóðíóþ ñêîáêó îáû÷íîñäâèãàþò íà ðàçìåð îòñòóïà (õîòÿ ýòî, ñòðîãî ãîâîðÿ, íå îáÿçàòåëüíî):class Table {// ...const char *GetNameById(int id) const{ return ProvideRecordById(id)->GetName(); }// ...};Åñëè âñ¼-òàêè âû ðåøèëè, ÷òî òåëî âàøåé ôóíêöèè áóäåò ëó÷øå ñìîòðåòüñÿ, áóäó÷è ðàñïèñàííûì íà íåñêîëüêî ñòðîê, òî îñòà¼òñÿ åù¼ âîçìîæíîñòü ñýêîíîìèòü îäíó ñòðîêó, ðàçìåñòèâ îòêðûâàþùóþ ôèãóðíóþñêîáêó íà îäíîé ñòðîêå ñ çàãîëîâêîì ôóíêöèè (îòìåòèì, ÷òî ýòî òîæåñïåöèôèêà ñèòóàöèè òåëà ôóíêöèè â çàãîëîâêå êëàññà; â èíûõ ñëó÷àÿõòàê íå äåëàþò):86class FileStream {// ...void SetFd(int f) {if (fd != -1)close(fd);fd = f;}// ...};×åãî òî÷íî íå ñëåäóåò äåëàòü, òàê ýòî ïðèíîñèòü ëàêîíè÷íîñòü çàãîëîâêà êëàññà â æåðòâó íåïîíÿòíûì ñòèëèñòè÷åñêèì êàíîíàì.
 ÷àñòíîñòè, åñëè âû íå íàøëè íè÷åãî ëó÷øåãî, íåæåëè íàïèñàòü âîò òàê:class FileStream {// ...void SetFd(int f){if (fd != -1)close(fd);fd = f;}// ...};òî áóäåò ãîðàçäî ïðàâèëüíåå âñ¼-òàêè óáðàòü òåëî ôóíêöèè èç çàãîëîâêàêëàññà. Îòìåòèì, ÷òî âû ïðè ýòîì âñ¼ åù¼ ìîæåòå îáúÿñíèòü êîìïèëÿòîðó, ÷òî ôóíêöèþ æåëàòåëüíî ñäåëàòü èíëàéíîâîé:class FileStream {// ...void SetFd(int f);// ...};inline void FileStream::SetFd(int f){if (fd != -1)close(fd);fd = f;}87Ãëàâà 3Î íåêîòîðûõ ÿçûêàõ ¾ñîñîáåííîñòÿìè¿3.1. ßçûê àññåìáëåðàßçûêè ïðîãðàììèðîâàíèÿ, â êîòîðûõ ñòðîêà èñõîäíîãî êîäà ïðåäñòàâëÿåò ñîáîé îñíîâíóþ ñèíòàêñè÷åñêóþ åäèíèöó, â íàøå âðåìÿ âñòðå÷àþòñÿ ðåäêî; áîëüøèíñòâî ÿçûêîâ ðàññìàòðèâàåò êîíåö ñòðîêè êàê îäèíèç ïðîáåëüíûõ ñèìâîëîâ, íè÷åì ïðèíöèïèàëüíûì íå îòëè÷àþùèéñÿ îòïðîáåëà è òàáóëÿöèè.
Îáû÷íî èìåþò ïîñòðî÷íûé ñèíòàêñèñ ÿçûêè àññåìáëåðà; ÷òî êàñàåòñÿ ÿçûêîâ âûñîêîãî óðîâíÿ, òî èç èñïîëüçóåìûõ íûíåìîæíî íàçâàòü ðàçâå ÷òî Ôîðòðàí. Èíòåðåñíî, ÷òî èìåííî Ôîðòðàí (òî÷íåå, åãî ðàííèå âåðñèè) çàëîæèë îïðåäåë¼ííóþ òðàäèöèþ îôîðìëåíèÿêîäà, êîòîðàÿ ñåé÷àñ èñïîëüçóåòñÿ äëÿ ÿçûêà àññåìáëåðà; ÷òî êàñàåòñÿñàìîãî Ôîðòðàíà, òî äëÿ íåãî â ïîñëåäíèå ãîäû ïîïóëÿðåí òàê íàçûâàåìûé ñâîáîäíûé ñèíòàêñèñ, ïîçâîëÿþùèé èñïîëüçîâàòü òðàäèöèîííûåñòðóêòóðíûå îòñòóïû; âñòðå÷àþòñÿ, âïðî÷åì, è òàêèå ïðîãðàììèñòû, êîòîðûå ïðåäïî÷èòàþò ïèñàòü íà Ôîðòðàíå ¾ïî-ñòàðèíêå¿.Òðàäèöèÿ ¾ôèêñèðîâàííîãî ñèíòàêñèñà¿ âîñõîäèò ê òåì âðåìåíàì,êîãäà ïðîãðàììà íà Ôîðòðàíå ïðåäñòàâëÿëà ñîáîé êîëîäó ïåðôîêàðò.Ðàííèå âåðñèè Ôîðòðàíà òðåáîâàëè, ÷òîáû ìåòêà, êîòîðàÿ â Ôîðòðàíåïðåäñòàâëÿåò ñîáîé öåëîå ÷èñëî, çàïèñûâàëàñü â ñòîëáöàõ ñ 1-ãî ïî 5-é,ïðè÷¼ì ÷àñòî ìåòêó êîðî÷å ïÿòè öèôð ñäâèãàëè âïðàâî, îñòàâëÿÿ ïåðâûå ïîçèöèè ïóñòûìè.  ïåðâîé ïîçèöèè ìîæíî áûëî òàêæå ïîìåñòèòüñèìâîë C, îáîçíà÷àþùèé êîììåíòàðèé; ïîçæå êîììåíòàðèé ñòàëî ìîæíîîáîçíà÷àòü ñèìâîëàìè * èëè !.
Òåêñò îïåðàòîðà äîëæåí áûë íà÷èíàòüñÿ ñòðîãî ñ 7-é ïîçèöèè, à ïåðåä íèì â 6-é ïîçèöèè íåîáõîäèìî áûëîïîìåñòèòü ïðîáåë; íåïðîáåëüíûé ñèìâîë â 6-é ïîçèöèè îçíà÷àë, ÷òî ýòà88ñòðîêà (òî÷íåå, ïåðôîêàðòà) ÿâëÿåòñÿ ïðîäîëæåíèåì ïðåäûäóùåé, ïðèýòîì ïóñòûìè äîëæíû áûëè îñòàòüñÿ ïåðâûå ïÿòü ïîçèöèé.Ñîâðåìåííûé òåêñò íà ÿçûêå àññåìáëåðà îáû÷íî íåñêîëüêî íàïîìèíàåò ïðîãðàììû íà ðàííèõ âåðñèÿõ Ôîðòðàíà.