А.В. Столяров - Оформление программного кода (1108519), страница 21
Текст из файла (страница 21)
×òîáû â òàêîé ñèòóàöèè ñîáëþñòè ñòèëüñ ôèêñèðîâàííûì ðàçìåðîì îòñòóïà, íóæíî äåéñòâîâàòü ñîâåðøåííî èíà÷å:93(let()(seq (build-sequencer 0))(colset '(red orange yellow green blue violet))(ls nil)) ;;(setq ls (mapcar #'list seq colset the-list))(store ls)(reverse ls)Îáðàòèòå âíèìàíèå íà ñèìâîë êîììåíòàðèÿ â êîíöå ñïèñêà ñâÿçûâàíèé;ïðèìåíÿòü åãî, êîíå÷íî, íå îáÿçàòåëüíî, íî îí ïîçâîëÿåò ÿñíåå îòäåëèòüçàãîëîâîê ôîðìû let îò å¼ òåëà.  ïðèíöèïå, ìîæíî íàéòè è äðóãîéäîïóñòèìûé ñòèëü, íàïðèìåð:(let ((seq (build-sequencer 0))(colset '(red orange yellow green blue violet))(ls nil)) ;;(setq ls (mapcar #'list seq colset the-list))(store ls)(reverse ls))Ê òàêîìó ñòèëþ ïðèä¼òñÿ íåêîòîðîå âðåìÿ ïðèâûêàòü, î÷åíü óæ íåïðèâû÷íî âûãëÿäÿò äâå çàêðûâàþùèå ñêîáêè íà îäíîì óðîâíå â óñëîâèÿõîòñóòñòâèÿ îòêðûâàþùåé ñêîáêè; íî, êàê íè ñòðàííî, ýòî âñ¼ æå ëó÷øå,÷åì ïîêàçàííûé âûøå ¾òðàäèöèîííûé¿ âàðèàíò, â êîòîðîì íå ñîáëþäàåòñÿ ïîñòîÿíñòâî ðàçìåðà îòñòóïà è çàêðûâàþùèå ñêîáêè ñêàïëèâàþòñÿâ êîíöå êîíñòðóêöèè, îáðàçóÿ íå÷òî íåóäîáîâàðèìîå.3.3.
Ïðîëîã, Ýðëàíã è äðóãèåÏðîãðàììà íà Ïðîëîãå ñîñòîèò èç ïðåäëîæåíèé, êàæäîå èç êîòîðûõèìååò çàãîëîâîê (â îðèãèíàëå ïðîñòî head, òî åñòü ¾ãîëîâó¿) è, âîçìîæíî, òåëî, êîòîðîå â áîëüøèíñòâå ñëó÷àåâ ïðåäñòàâëÿåò ñîáîé ñïèñîêòåðìîâ, íî ìîæåò èìåòü è áîëåå ñëîæíóþ ñòðóêòóðó áëàãîäàðÿ íàëè÷èþ ñâÿçêè ¾èëè¿, îáîçíà÷àåìîé òî÷êîé ñ çàïÿòîé (îáû÷íàÿ ñâÿçêà ¾è¿îáîçíà÷àåòñÿ ïðîñòîé çàïÿòîé).
Ïðåäëîæåíèÿ ñ çàãîëîâêàìè, èìåþùèìèîäèíàêîâîå èìÿ è ¾àðíîñòü¿, ñîñòàâëÿþò ïðîöåäóðû. Àíàëîãè÷íûé ñèíòàêñèñ èñïîëüçóåòñÿ â Ýðëàíãå è íåêîòîðûõ äðóãèõ ÿçûêàõ.Âûðàæåíèÿ Ïðîëîãà ñèëüíî íàïîìèíàþò óæå çíàêîìûå íàì S-âûðàæåíèÿ Ëèñïà ñîáñòâåííî ãîâîðÿ, îòëè÷èå òîëüêî â ïîÿâëåíèè ôóíêòîðîâ è ôóíêöèîíàëü94íûõ òåðìîâ, è ïëþñ ê òîìó íåêîòîðûå óíàðíûå è áèíàðíûå òåðìû ìîæíî çàïèñûâàòü â èíôèêñíîé íîòàöèè.
Íà ïåðâûé âçãëÿä ìîæåò ïîêàçàòüñÿ, ÷òî ñèíòàêñèñ ïðèýòîì ñòàíîâèòñÿ ñëîæíåå; îäíàêî â êîíòåêñòå ðàññóæäåíèé îá îôîðìëåíèè êîäàñèòóàöèÿ îêàçûâàåòñÿ ïðÿìî ïðîòèâîïîëîæíîé: â áîëüøèíñòâå ñëó÷àåâ îôîðìëÿòü êîä íà Ïðîëîãå ãîðàçäî ïðîùå. Äåëî â òîì, ÷òî ïðîãðàììû íà Ïðîëîãå, âîòëè÷èå îò ïðîãðàìì íà Ëèñïå, î÷åíü ðåäêî òðåáóþò ìíîãîóðîâíåâîé âëîæåííîñòèêîíñòðóêöèé.Ïîêà ïðåäëîæåíèå óìåùàåòñÿ â îäíîé ñòðîêå, åãî ÷àñòî òàê â îäíóñòðîêó è çàïèñûâàþò:no_attack(_, []).no_attack(Q, [X|L]) :- not(attacks(Q, X)), no_attack(Q, L).õîòÿ â íåêîòîðûõ ðóêîâîäñòâàõ è ïðèìåðàõ ïðèìåíÿåòñÿ äðóãîé ñòèëü,ïðåäïîëàãàþùèé, ÷òî íà îäíîé ñòðîêå ñ çàãîëîâêîì ïðåäëîæåíèÿ íå ïèøåòñÿ áîëüøå íè÷åãî, äàæå åñëè ïðàâàÿ ÷àñòü ïðåäëîæåíèÿ ñîñòîèò âñåãîèç îäíîé ¾öåëè¿; ïðàâàÿ ÷àñòü âñåãäà çàïèñûâàåòñÿ, íà÷èíàÿ ñî ñëåäóþùåé ñòðîêè, ñî ñäâèãîì âïðàâî, ïðè÷¼ì îáû÷íî òàêîé ñäâèã âûáèðàþòðàâíûì òàáóëÿöèè:queens(N, Result) :do_queens(N, 0, [], Result). ýòîì ñëó÷àå îñòà¼òñÿ âîïðîñ, êàê ðàñïîëîæèòü öåëè ïðàâîé ÷àñòè, åñëèèõ áîëüøå îäíîé, íî îíè, â ïðèíöèïå, óìåùàþòñÿ â îäíó ñòðîêó.
Äîïóñòèìà êàê çàïèñü ¾â ñòîëáèê¿:no_attack(Q, [X|L]) :not(attacks(Q, X)),no_attack(Q, L).òàê è çàïèñü ¾â ëèíåéêó¿:no_attack(Q, [X|L]) :not(attacks(Q, X)), no_attack(Q, L).Êàêóþ èç íèõ ïðåäïî÷åñòü, ðåøàéòå ñàìè; êàê îáû÷íî, åäèíñòâåííîé ðåêîìåíäàöèåé çäåñü áóäåò ïðèäåðæèâàòüñÿ êàêîãî-òî îäíîãî ñòèëÿ âî âñåéïðîãðàììå.Åñëè æå ïðåäëîæåíèå â îäíó ñòðîêó íå óìåùàåòñÿ òî îñòà¼òñÿ ôàêòè÷åñêè òîëüêî îäèí âàðèàíò, à èìåííî çàïèñàòü åãî ¾ñòîëáèêîì¿:sameset([], []).sameset([X|L], M) :member(X, M),delete_all(X, M, M1),delete_all(X, L, L1),sameset(L1, M1).95Íàäî îòìåòèòü, ÷òî ìíîãèå àâòîðû ïðîãðàìì íà Ïðîëîãå äåëàþò îäíó è òó æå õàðàêòåðíóþ îøèáêó ïðè îôîðìëåíèè òàêèõ ìíîãîñòðî÷íûõïðåäëîæåíèé, à èìåííî çàïèñûâàþò ïåðâóþ öåëü ïðàâîé ÷àñòè â îäíîéñòðîêå ñ çàãîëîâêîì, à ïîñëåäóþùèå öåëè ðàçìåùàþò òî÷íî ïîä ïåðâîé.Ïîëó÷àåòñÿ ïðèìåðíî òàê:sameset([], []).sameset([X|L], M) :- member(X, M),delete_all(X, M, M1),delete_all(X, L, L1),sameset(L1, M1).Íåäîñòàòîê òàêîãî ðåøåíèÿ ìû óæå íåîäíîêðàòíî îáñóæäàëè: ðàçìåð îòñòóïà îêàçûâàåòñÿ çàâèñÿùèì îò íåêèõ îáñòîÿòåëüñòâ, â äàííîìñëó÷àå îò äëèíû çàãîëîâêà ïðåäëîæåíèÿ.Ñèòóàöèþ ìîæåò ñèëüíî îñëîæíèòü ïîÿâëåíèå â ïðåäëîæåíèÿõ òî÷êèñ çàïÿòîé (íàïîìíèì, îíà èçîáðàæàåò â Ïðîëîãå äèçúþíêöèþ).
 ñèòóàöèè, êîãäà ïðåäëîæåíèå ñîñòîèò èç íåñêîëüêèõ àëüòåðíàòèâ, ðàçäåë¼ííûõ òî÷êîé ñ çàïÿòîé, è êàæäàÿ àëüòåðíàòèâà óìåùàåòñÿ â ñòðîêó, ïðîùåâñåãî òàê è ïèñàòü ïî îäíîé àëüòåðíàòèâå â ñòðîêå:lexic_process_char(Ch, Line, Newstate, Sofar, R) :isspace(Ch), !, R = Sofar, Newstate = home;[Ch] = ",", !, R = [comma|Sofar], Newstate = home;[Ch] = ":", !, R = [colon|Sofar], Newstate = home;[Ch] = ";", !, R = [semicolon|Sofar], Newstate = home;[Ch] = ".", !, R = Sofar, Newstate = stop;isalnum(Ch), !, R = [[Ch] | Sofar], Newstate = id;!, write('lexical error at line '), write(Line), nl, fail.Åñëè â àíàëîãè÷íîé ñèòóàöèè íåêîòîðûå àëüòåðíàòèâû â ñòðîêó íåïîìåùàþòñÿ, ìîæíî ïîñîâåòîâàòü ÷òî-òî âðîäå ñëåäóþùåãî:lexic_process_char(Ch, Line, Newstate, Sofar, R) :isspace(Ch), !,R = Sofar,Newstate = home;[Ch] = ",", !,R = [comma|Sofar],Newstate = home;[Ch] = ":", !,R = [colon|Sofar],Newstate = home;% .
. .96Çäåñü ìû âîñïîëüçîâàëèñü òåì ôàêòîì, ÷òî â äàííîì ïðèìåðå ñîïîñòàâëåíèå âìåñòå ñ îòñå÷åíèåì ïðåäñòàâëÿåò ñîáîé ÷òî-òî âðîäå ¾çàãîëîâêà¿äëÿ àëüòåðíàòèâû, ïîñêîëüêó çàäà¼ò óñëîâèå, ïðè êîòîðîì äàííàÿ àëüòåðíàòèâà áóäåò èñïîëíåíà, à îñòàëüíûå èñïîëíåíû íå áóäóò.Íó à äëÿ áîëåå ñëîæíûõ ñëó÷àåâ, â îñîáåííîñòè ïðè èñïîëüçîâàíèèñêîáîê äëÿ ãðóïïèðîâêè öåëåé, ìîæíî ïðåäëîæèòü ñëåäîâàòü îáùèìïðèíöèïàì îôîðìëåíèÿ âëîæåííûõ êîíñòðóêöèé: íà÷àëî è êîíåö êîíñòðóêöèè ðàçìåùàòü ñòðîãî äðóã íàä äðóãîì, à âñ¼ âëîæåííîå ñäâèãàòüâïðàâî íà ïîñòîÿííûé ðàçìåð ñäâèãà.97Âìåñòî çàêëþ÷åíèÿÊîíå÷íî, â ýòîé ñðàâíèòåëüíî íåáîëüøîé êíèæêå íåâîçìîæíî áûëîó÷åñòü âñåãî ìíîãîîáðàçèÿ îñîáåííîñòåé ðàçëè÷íûõ ÿçûêîâ ïðîãðàììèðîâàíèÿ, îõâàòèòü âñå ñèòóàöèè, êîòîðûå ìîãóò âîçíèêíóòü ïðè íàïèñàíèè ïðîãðàìì, èëè ïåðå÷èñëèòü âñå ñóùåñòâóþùèå (è äîïóñòèìûå) ïîäõîäû ê ðåøåíèþ ïðîáëåì, ñâÿçàííûõ ñ ãðàìîòíûì îôîðìëåíèåì êîäà.Êàê ìû âèäåëè, âî ìíîãèõ (åñëè íå âî âñåõ) ñëó÷àÿõ âîçìîæíû è äîïóñòèìû ðàçëè÷íûå ðåøåíèÿ îäíîé è òîé æå ïðîáëåìû, ïðè÷¼ì óêàçàòüñðåäè íèõ îäèí ¾îäíîçíà÷íî ëó÷øèé¿ íå ïðåäñòàâëÿåòñÿ âîçìîæíûì. òàêèõ óñëîâèÿõ ïðîöåññ îôîðìëåíèÿ ïðîãðàììíîãî êîäà ñòàíîâèòñÿäåëîì âïîëíå òâîð÷åñêèì; âïðî÷åì, ïðîãðàììèðîâàíèå âñåãäà áûëî ñêîðåå èñêóññòâîì, íåæåëè ÷åì-òî åù¼.Íàäåþñü, ìíå óäàëîñü ïîêàçàòü, ÷òî ïðåäñòàâëÿåò ñîáîé îôîðìëåíèå ïðîãðàììíîãî êîäà êàê ïðåäìåòíàÿ îáëàñòü, è ïðîäåìîíñòðèðîâàòüâîçìîæíûå îòâåòû íà íåêîòîðûå (íî íå âñå!) âîçíèêàþùèå â ýòîé îáëàñòè âîïðîñû.
 ëþáîì ñëó÷àå, óâàæàåìûå ÷èòàòåëè, äàëüíåéøåå çàâèñèò òîëüêî îò âàñ.  ïðîöåññå ïðàêòè÷åñêîãî ïðîãðàììèðîâàíèÿ âàììîãóò âñòðåòèòüñÿ ñèòóàöèè, íå îõâà÷åííûå íàñòîÿùèì ïîñîáèåì, âû ìîæåòå ñòîëêíóòüñÿ ñ ÿçûêàìè ïðîãðàììèðîâàíèÿ, òðàäèöèè èëè ñèíòàêñè÷åñêèå îñîáåííîñòè êîòîðûõ âûíóæäàþò èçîáðåòàòü ÷òî-òî íîâîå. Èñïîëüçóéòå ñâîé îïûò, èñïîëüçóéòå çäðàâûé ñìûñë, èñïîëüçóéòå, íàêîíåö,ñîáñòâåííûå îùóùåíèÿ èç îáëàñòè ýñòåòèêè. Ïîñîáèå, êîòîðîå âû ïðî÷èòàëè, ñïîñîáíî ëèøü óêàçàòü áîëåå-ìåíåå ïðàâèëüíîå íàïðàâëåíèå, íîïîñëåäîâàòü ïî ýòîìó ïóòè âàì ïðèä¼òñÿ ñàìîñòîÿòåëüíî. Ïðîùàÿñü, ÿõîòåë áû ïîæåëàòü âàì óñïåõîâ â òîì çàìå÷àòåëüíîì âèäå ÷åëîâå÷åñêîéäåÿòåëüíîñòè, êàêèì, íåñîìíåííî, ÿâëÿåòñÿ ïðîãðàììèðîâàíèå.***Àâòîð ñ÷èòàåò ñâîèì ïðèÿòíûì äîëãîì ïîáëàãîäàðèòü È. Ã. Ãîëîâèíàè À.
Í. Äàðüèíà, ÷üè ñâîåâðåìåííûå çàìå÷àíèÿ ïîìîãëè ñäåëàòü òåêñò ïîñîáèÿ ãîðàçäî ëó÷øå, ÷åì îí áûë; òàêæå áîëüøîå ñïàñèáî Àíå Ôèëîíîâîéçà ñïèñîê îïå÷àòîê.Ýëåêòðîííóþ âåðñèþ ýòîé è äðóãèõ êíèãÀ. Â. Ñòîëÿðîâà âû ìîæåòå íàéòè íàîôèöèàëüíîì ñàéòå àâòîðàhttp://www.stolyarov.info98ÎãëàâëåíèåÏðåäèñëîâèå1. Îáùèå ïðàâèëà è ïðèíöèïû1.1. Ñðåäñòâà è öåëè . . . . . . . . .
. . . . . . . . . . . . . . . .1.2. Ñàìîïîÿñíÿþùèé êîä . . . . . . . . . . . . . . . . . . . . . .1.2.1. Âûáîð èì¼í (èäåíòèôèêàòîðîâ) . . . . . . . . . . . .1.2.2. Ñòðóêòóðíûå îòñòóïû: îáùèå ïðèíöèïû . . . . . . .1.2.3. Åù¼ î ïðîáåëàõ . . . . . . . . . . . . . . . . . . . . .1.2.4. Ðàçáèåíèå çàäà÷ íà ïîäçàäà÷è . . .
. . . . . . . . . .1.3. Óíèâåðñàëüíî-÷èòàåìûé êîä . . . . . . . . . . . . . . . . . .1.3.1. Àëôàâèò ASCII ãàðàíòèÿ óíèâåðñàëüíîñòè òåêñòà1.3.2. Àíãëèéñêèé ÿçûê íå ðîñêîøü, à ñðåäñòâî âçàèìîïîíèìàíèÿ . . . . . . . . . . . . . . . . . . . . . . . .1.3.3. Î ðóññêîÿçû÷íîì ïîëüçîâàòåëüñêîì èíòåðôåéñå . .1.3.4. Ñòàíäàðòíûé ðàçìåð ýêðàíà . . . .
. . . . . . . . . .1.4. Ìîäóëüíîñòü . . . . . . . . . . . . . . . . . . . . . . . . . . .1.4.1. Î ðîëè ïîäñèñòåì è ìîäóëåé . . . . . . . . . . . . . .1.4.2. Ìîäóëü êàê àðõèòåêòóðíàÿ åäèíèöà . . . . . . . . .1.4.3. Îñëàáëåíèå ñöåïëåííîñòè ìîäóëåé . . . . . . . . . .1.4.4. Âûäåëåíèå ìîäóëåé âî âíåøíèå áèáëèîòåêè . . . . .1.5.
×òî òàêîå coding style è êàêèå îíè áûâàþò . . . . . . . . . .2. Ïðîöåäóðíûé êîä: Ïàñêàëü, Ñè, Ñè++2.1. Çàãîëîâîê è òåëî . . . . . . . . . . . . . . . . . . . . . .2.1.1. Îñíîâíûå âàðèàíòû ñòèëÿ îòñòóïîâ íà ïðèìåðåðàòîðà while . . . . . . .
. . . . . . . . . . . .2.1.2. Îïåðàòîð if ñ âåòêîé else . . . . . . . . . . . .2.1.3. Åñëè çàãîëîâîê ñëèøêîì äëèííûé . . . . . . .2.1.4. Çàãîëîâîê è òåëî ïîäïðîãðàììû . . . . . . . . .2.2. Îñîáåííîñòè îôîðìëåíèÿ îïåðàòîðîâ âûáîðà . . . .
.2.3. Ïîñëåäîâàòåëüíîñòü âçàèìîèñêëþ÷àþùèõ if'îâ . . . .2.4. Ìåòêè è îïåðàòîð goto . . . . . . . . . . . . . . . . . .2.5. Êàê ðàçáèòü äëèííóþ ñòðîêó . . . . . . . . . . . . . . .2.5.1. Ñëèøêîì äëèííîå âûðàæåíèå â ïðèñâàèâàíèè99. . .îïå. . .. . .. . .. . .. . .. . .. . .. . .. . .3557791516181820212225252728313335363741434648545660602.6.2.7.2.8.2.9.2.5.2. Ñëèøêîì äëèííûé âûçîâ ïîäïðîãðàììû . . .