Гэты артыкул прысвечана таму, як правільна пісаць код Pascal. Акцэнт робіцца на кадаванне аспекты напісання кода Паскаля.
Прыклад праграмы: roman.p.txt, праграма для пераўтварэння рымскія лічбы ў арабскія лічбы.
Прыклады дрэннага кода: аздабленне, фактычныя свеце кавалак рэальнай дрэннага кода.
Як прасіць за праграмаванне: тут.
Звярніце ўвагу: у гэтым дакуменце выкарыстоўваецца Паскаль/IX, Паскаль на HP 3000 кампутара, але амаль усе кропкі прымяняецца да любога варыянту Паскаль, і найбольш ужывальныя і да іншых мовах праграмавання, а таксама.
Я хачу абмеркавання ў гэтым артыкуле для пакрыцця чатыры пасады ў праграмавання: філасофія, эфектыўнасць, праблемы і партатыўнасць. Я лічыў спрабуюць падзяліць гэтую паперу ў чатыры кіраўніка, па адным для кожнай з P, але зразумеў, што для многіх тэмы, якія я б паставіў у адну галаву, не менш важкія аргументы могуць быць паднятыя для паставіўшы яго ў іншы. Такім чынам, замест таго, адна з кіраўнікоў у P, я арганізаваў гэтую паперу ў раздзелах: Стыль кадавання выбараў, праблемы з прадукцыйнасцю, і партатыўнасць.
У кожнай чале 4 P "выкарыстоўваецца ў якасці прынцыпаў, якія ляжаць набор кіруючых прынцыпаў. Гэтыя прапанаваныя правілы не павінны разглядацца як калі б яны былі 10 (або 12% ці $) запаведзяў. Яны мае правілы, тыя, якія я выкарыстаў (у розных формах для розных моў) у пісьмовай форме аб больш аднаго мільёна радкоў кода. Кіруючыя прынцыпы павінны расці, як гэта робяць людзі. Я магу паглядзець на праграмы, якія я напісаў у 1970 годзе і ўбачыць змены ў стылі ў мінулыя гады. Нягледзячы на ??змены, вонкавы выгляд застаўся ранейшым.
Асноўная мэта дадзенай працы складаецца ў заахвочванні чытачоў думаць аб розных аспектах стылю і ствараць свае ўласныя кіруючыя прынцыпы кадавання. Гэта важная падтрымка для якаснай запісу праграм... у Паскалю або на любой мове.
Я напісаў больш за мільён радкоў на высокім ўзроўні зыходнага кода мовы з 1970 года. Гэта, вядома, уключае ў сябе некалькі пустых радкоў, радкі каментароў, і лініі, якія кланавалі з іншых файлаў. Тым не менш, гэты фон навучыў мяне, што "погляд" (ці знешні выгляд) праграмы з'яўляецца крытычна важным для разумення таго, што код робіць.
Кіруючыя прынцыпы:
# 1-1. Існуе няма такой рэчы, як аднаразовы код. Такім чынам, вашы прынцыпы распаўсюджваюцца на ўсё, што вам напісаць. Асабліва "аднаразовыя" або "One-Shot" праграм.
Каментарыі:
# 1-1. Я заўважыў, што я амаль заўсёды паўторнае выкарыстанне маёй нібыта аднаразовыя або аднаразовых праграм. І, калі я зрэзаць вуглы на выкарыстанне маіх прынцыпаў я заўсёды прыходзіцца плаціць за гэта пазней.
(Назад да зместу)
Стыль, ці яго адсутнасць, можа істотна паўплываць на якасць праграмы. Якасць кода павінна быць напісана так, што гэта правільна, эфектыўна, і ў суправаджэнні. Выбар, і пасля, асаблівы стыль можа павялічыць верагоднасць таго, што кожны з гэтых трох мэт былі дасягнуты. У гэтым раздзеле спачатку абмяркуем зменных, а затым астатнія праграмы.
(Назад да зместу)
01/01 Назвы: Асновы
Адзін з ключоў да паспяховай рэалізацыі праграмы з'яўляецца правільны выбар назвы.
Поспех праграмы Паскаля заключаецца ў добрым разуменні дадзеных праграма дазваляе маніпуляваць файламі. Гэта разуменне адлюстравана ў выбары структуры дадзеных і зменных, якія выкарыстоўваюцца праграмай.
На працягу ўсёй артыкула фраза "імёны", пры выкарыстанні без адборачнага, спасылаецца на імёны зменных, канстанты, тыпы, працэдуры і функцыі.
Кіруючыя прынцыпы:
# 01/11. Выкарыстаньне імёнаў для зменных, канстанты і тыпы; фразы выкарыстоўваць дзеяслоў для працэдур і функцый.
# 01/12. Тыпы павінны, як правіла, "_type" у канцы сваё імя.
# 1-13. Імёны павінны быць цалкам у ніжнім рэгістры, з падкрэслення ("_") падзяляюць словы (напрыклад: card_counter).
Каментарыі:
# 01/11. Наступныя адна радок прыкладу дастаткова, каб паказаць важнасць гэтага кіруючага палажэнні:
if card_count = 52 thenЦі з'яўляецца "card_count" цэлай зменнай ці функцыі? Розніца мае вырашальнае значэнне для разумення праграмы. Толькі кіруючага чытач можа магчыма толькі яго/яе разумення англійскай мовы. (Капіталізацыя правіла, не хапіла б!)
Важна памятаць, што іншыя людзі будуць чытаць код калі-небудзь. ("Іншыя" ўключае ў сябе людзей вы дзень пасля таго, як вы напісалі код!) Яны будуць патрэбныя "паказальнікі", каб дапамагчы ім правільна інтэрпрэтаваць код, які яны чытаюць.
У адпаведнасці з дырэктывай # 01/11 ", card_count" з'яўляецца зменнай. Калі ён павінен быў быць функцыя, то яе назва павінна было быць нешта накшталт "count_the_cards".
# 01/12. Некаторыя праграмісты дадайце "t_", "typ_", або "type_". Іншыя дадаць "_t", "_typ", або "_type". Некалькі памылковай душы былі настолькі зачараваныя гэтай ідэяй, што яны дадайце "t_" і дадаць "_type" для кожнага тыпу.
Асноўная ідэя заключаецца ў выразна дыферэнцаваць імёны карыстацкіх тыпаў з зменных, а таксама працэдуры (або функцыі).
# 1-13. Дадзенае кіраўніцтва адлюстроўвае той факт, што мы ангельскай мовы. Калі б мы былі нямецкай мове, нашы праграмы, верагодна, варта выкарыстоўваць толькі загалоўныя літары ў пачатку кожнай зменнай. Звярніце ўвагу, наколькі цяжэй чытаць гэта?
Я бачу тры прычыны для капіталізацыі першую літару (ці ўсё) з некаторых тыпаў імёнаў. Ні адзін не варта:
Назвы для тыпаў павінна быць зразумелым, і павінны быць дакладна адрозныя як тыпы так, што яны вылучаюцца пры выкарыстанні ў тып прымусу ці "SizeOf" выразы.
Кіруючыя прынцыпы:
# 1-21. Універсальныя тыпы, якія упакованы масівы сімвал павінен быць названы "пак" з колькасцю знакаў.
type
pac8 = packed array [1..8] of char;
pac80 = packed array [1..80] of char;
# 1-22. Тыпы, масівы павінны мець "масіў" у назве. (Выключэнне:. ПЧК # # імёны тыпаў (гл. № 1-21))
# 1-23. Тыпы, паказальнікі павінны мець "PTR" у назве. Тыпы, якія даўно паказальнікаў (64 біта), павінны мець "lptr" у назве. (У Pascal/IX, звычайныя паказальнікі 32-біт... "доўгі" паказальнік, які можа кропку ў любым месцы ў памяці.)
# 1-24. Справаздачы павінны мець імёны палёў з прэфікса, які адлюстроўвае запісу яны з'яўляюцца часткай.
# 1-25. Простыя тыпы не павінны звычайна адлюстроўваюць іх "памер".
# 1-26. Старайцеся пазбягаць выкарыстання "ісціна" і "ілжывых" на функцыянальныя вынікі. Выкарыстаньне тыпу, як "good_failed_type" замест.
Каментарыі:
# 1-21. Мова Паскаль мае спецыяльныя правілы для зменных, якія упакованы масівы сімвалаў з ніжняй мяжой 1. Гэтыя спецыяльныя правілы былі дададзены ў спробе зрабіць стандартны Паскаль выкарыстоўваць для маніпуляцый з тэкстам. Як вынік, большасць рэалізацый Паскаля ставяцца да "ПЧК" у якасці зменнай (або тыпу), які ўпакаваны масіў сімвалаў, з ніжняй гранню 1. Такім чынам, гэта зручна, каб адлюстраваць гэта стандартызацыі ў нашай уласнай тыпаў.
Заўважым, што гэта кіруючага сказаў універсальных тыпаў. Калі я выкарыстоўваю TurboIMAGE (СКБД на HP 3000), і неабходна стварыць тып, які адпавядае IMAGE пункт, я паспрабую даць увядзіце імя, падобнае на назву элемента:
{IMAGE items: }
{ cust_name x20;}
type
cust_name_type = packed array [1..20] of char;
У прыведзеным вышэй прыкладзе, я выкарыстаў "20" у аб'ява тыпу толькі таму, што быў непасрэдна відавочным значэнне (з улікам каментарыяў аб адлюстраванні прадметаў). Я ніколі не выкарыстоўваў бы канстанта "20" у канцы праграмы. Калі я павінен спаслацца на "20", я б або выкарыстоўваць Pascal/IX пабудаваць "SizeOf (cust_name_type)" ці я хацеў бы дадаць "сопзЬ cust_name_len = 20" і выкарыстаць гэта пастаянная абвясціць запісу.
# 1-24. Гэта кіраўніцтва робіць поля запісу неадкладна ідэнтыфікаваць, калі яны выкарыстоўваюцца ў "з" заявай. Прыклад:
дрэнна:
type
hpe_status = record {name matches MPE/iX's usage}
info : shortint;
subsys : shortint;
end;
hpe_status_ptr_type = ^ hpe_status;
...
var
hs_status_ptr : hpe_status_ptr_type;
...
with hs_status_ptr^ do
begin
info := my_info;
subsys := my_subsys;
end;
добра:
type
hpe_status = record {name matches MPE/iX's usage}
hs_info : shortint;
hs_subsys : shortint;
end;
...
with hs_status_ptr^ do
begin
hs_info := my_info;
hs_subsys := my_subsys;
end;
У дрэнны прыклад, чытач, які не знаёмы з кодам не будзе ведаць, што поля паказальніка змяняюцца. У добры прыклад, гэта відавочна.
# 1-25. У SPL (Алгол-падобны мова праграмавання), гэта даволі часта выкарыстоўваць суфікс або прэфікс для абазначэння "тып" зменнай. (Прыклад: двайны ktr'd). З абмежаваннямі Паскаля на адпаведныя тыпы гэта нашмат менш неабходнай.
# 1-26. "Ісціна" і "ілжывых" мала што значаць самі па сабе. Прыклады:
дрэнна:
function open_files : boolean;
...
open_files := false;
...
if open_files then
...
добра:
type
good_failed_type = (failed, good);
function open_files : good_failed_type;
...
open_files := good;
...
if open_files = failed then
...
У дрэнны прыклад, чытач не ведае, ці не "open_files" вяртаецца праўдзівае значэнне, добра гэта ці дрэнна.
Гэта кіраўніцтва з'яўляецца яшчэ больш важным пры праграмаванні у шматмоўны асяроддзі, таму што розныя мовы (і рознымі аперацыйнымі сістэмамі) маюць дзіўныя ідэі аб тым, "0" (ці "ілжыва") азначае, добрыя або дрэнныя.
(Назад да зместу)
1,3 Заказ Крыніца
Упарадкаванне зыходнага кода можа істотна паўплываць на лёгкачытэльнасць праграмы. Заказ кіруючыя прынцыпы можна падзяліць на тры вобласці: тыпы і канстанты, зменныя і працэдуры і функцыі.
Кіруючыя прынцыпы:
# 1-31. Простыя канстанты павінны быць пастаўлены пад пачатак дэкларацыі вобласці, а затым па відах, структураваныя канстант, а затым пераменных. Унутры кожнай групы, ідэнтыфікатары павінны быць размешчаныя ў вызначаным парадку. Калі іншы парадак ўяўляе сабой, алфавітным парадку павінны быць выкарыстаны. Прыклад:
const
max_queues = 10;
type
aardvark_quantity_type = 0..9;
queue_name_type = packed array [1..8] of char;
queue_names_type = array [1..max_queues] of queue_name_type;
zoo_fed_arrdvarks_type = array [aardvark_quantity_type] of integer;
# 1-32. У лепшым выпадку адзін асобнік "тыпу", і "Var" неабходная, і да двух асобнікаў "Const" (адзін для простых канстант, і адна для структураваных канстанты).
# 1-33. Ідэнтыфікатары ў дэкларацыі вобласці (канстанты, тыпы, зменныя) павінны быць аб'яўлены адным у кожнай радку, у нейкі парадак. Алфавітным парадку па змаўчанні. Калі іншага парадку, ён павінен быць растлумачаны з каментаром.
# 1-34. Ідэнтыфікатары ў дэкларацыі вобласці павінны быць уведзеныя, каб "=" знакаў выраўноўваюцца для канстанты і тыпы, і ":" знакаў выраўноўваюцца для зменных і палёў у запісах.
# 1-35. Тыпы запісаў, якія ўтрымліваюць укладзеныя запісы ніколі не павінны быць аб'яўлены як "ананімныя тыпы". Прыклады дрэнных і добрых практык:
дрэнна:
type payment_record_type = record
pay_date : date_type;
pay_time : time_type;
pay_style : (paid_cash, paid_check, paid_charge);
end;
добра:
type
payment_style_type = (paid_cash, paid_check, paid_charge);
payment_record_type = record
pay_date : date_type;
pay_time : time_type;
pay_style : payment_style_type;
end;
# 1-36. "Хрусьцеў" запісаў варта пазбягаць, калі неабходнасць жорсткай упакоўкі поля перакрывае страты прадукцыйнасці яны выклікаюць.
Pascal/IX падтрымлівае "хрусьцеў запіс", пашырэнне за межы простага "упакованы запіс". У хрусьцеў запісы, Ёсць * не * нявыкарыстаныя біты. Калі вы аб'яўляе хрусьцеў запісы з полем 1 біт, а затым полі 8 біт, а затым 1-бітнае поле, то ўся запіс будзе займаць 10 біт і 8-бітнае поле, спатрэбіцца дадатковы код для загрузкі/захавання.
# 1-37. Вялікія знешнія зменныя блока (> 256 байт) павінны быць аб'яўлены апошнія, нават калі гэта парушае кіруючага # 1-33. (Сапраўды гэтак жа, вялікія лакальныя зменныя павінны быць абвешчаныя ў першую чаргу.) (Заўвага: гэта Pascal/IX прадукцыйнасці водгук... іншых кампілятараў на іншых машынах, верагодна, зрабіць па-іншаму!)
# 1-38. Працэдуры і функцыі перамяшаныя (гэта значыць: не асобныя працэдуры з функцый).
# 1-39. Працэдуры (і функцыі) павінны быць аб'яўлены ў нейкі парадак (алфавітным па змаўчанні).
# 1-40. Больш чым на адзін узровень ўкладзенасці працэдуры варта пазбягаць.
# 1-41. Убудаваныя сродкі павінны быць абвешчаны адзін раз, на знешнім узроўні, пасля ўсіх канстант, тыпаў і зменных, і перад "вонкавымі", "наперад", або фактычных працэдур. ("Унутраныя" з'яўляецца спасылкай на выгляд скампіляваных "знешніх" аб'ява працэдуры, падтрымлівае большасць моў на HP 3000.)
# 1-42. Убудаваныя сродкі павінны быць у алфавітным парадку, арганізаваны уласных файлаў. Прыклад:
Function ascii : shortint; intrinsic; Function binary : shortint; intrinsic; Procedure quit; intrinsic;
У прыведзеным вышэй прыкладзе, два прасторы былі ўведзеныя пасля слова "функцыі", так што імёны ўсіх ўбудаваных функцый будзе прыведзены ў адпаведнасць, незалежна ад таго ці былі яны функцый або працэдур. Вельмі шкада, што Паскаль дае нам даказаць кампілятар, што мы ведаем функцыянальнага тыпу кожнага ўласнага.
Звярніце ўвагу на літары "Р" і "F" у прыведзеным вышэй прыкладзе. Гэта адзін асобнік вельмі карысна кадавання дысцыпліны, што тлумачыцца ў асноўным становішчы # 1-45 ніжэй.
# 1-43. Усе працэдуры і функцыі павінны быць аб'яўлены з "наперад" заявы, якія ў алфавітным парадку.
# 1-44. Тыпы, "напаўняльнікаў" павінен быць абвешчаны як "цэлае" або "байт" (дзе "байт" аб'яўлены як 0.. 255), а не як "сімвал" для іх базавыя тыпы.
# 1-45. "Наперад", "знешнія" і "унутраныя" працэдура (і функцыі) аб заявах павінна выкарыстоўваць першую літару "працэдуры" і "функцыя".
Каментарыі:
# 1-34. Я наогул выраўнаваць "=" для тыпаў і consts ў калонцы 31, ":" для поля ў тып таксама ў калонцы 31 і ":" для зменных у калонцы 19. Калі зменныя маюць дастаткова доўгія імёны, я часта проста выраўнаваць ":" у калонцы 31. Я ўжыць гэтую выраўноўвання ":", які выкарыстоўваецца ў дэкларацыі параметраў, такіх, што імя зменнай пачынаецца ў калонцы?:
procedure parse_gribbitz (
a_token : str80;
var status : boolean;
anyvar stuff : char)
option default_parms (
stuff := nil);
У прыведзеным вышэй прыкладзе, звярніце ўвагу, што імёны параметраў выраўноўваюцца. (Відавочна, што гэта не заўсёды магчыма, асабліва калі параметр $ $ выраўноўванне інфармацыі, указанай.) (Заўвага: "anyvar" гэта бачыў у 02/09 ніжэй) # 1-35. Зменных (і палі запісаў), якія ананімныя тыпы не могуць быць перададзены па спасылцы (як "Var" параметраў) для звычайных працэдур. Сапраўды, ананімных запісаў як правіла, не могуць быць перададзены па значэнні ў працэдуры.
# 1-36. Доступ поля "хрусьцеў" запісаў можа заняць да трох разоў лік каманд, якія былі б неабходныя, калі запіс не хрусцелі. Разгледзім наступныя два тыпу:
type
bad_type = crunched record
bad_misc : shortint; {Bytes 0, 1}
bad_status : integer; {Bytes 2, 3, 4, 5}
end; {Total size: 6 bytes}
good_type = record
good_misc : shortint; {Bytes 0, 1}
good_status : integer; {Bytes 4, 5, 6, 7}
end; {Total size: 8 bytes}
Калі "bad_status" поле доступу, Pascal/IX вылучае тры інструкцыі (ЛДГ, ЛДГ, і DEP). Калі "good_status" поле доступу, Pascal/IX выпраменьвае адну інструкцыю (LDW).
# 1-37. Pascal/IX можа эфектыўна доступ толькі першыя 8192 байт глабальных або * Прозвішча * 8192 байта лакальных пераменных. Pascal/IX вылучае зменныя ў (прыблізна) першым убачыў, першым вылучыў чынам. Такім чынам, для глабальных зменных, паклаўшы маленькія першым і другім буйным, як правіла, больш эфектыўным. Для лакальных зменных, паклаўшы буйныя па-першае, і маленькія другі мае тэндэнцыю быць больш эфектыўным.
Таму што Паскаль/IX вылучае вонкавага блока ("глабальны") зменных у зваротным парадку, чым лакальныя зменныя, правіла складаецца ў:
Разгледзім наступныя прыклады:
дрэнна:
var {outer-block variables}
big_array : array [0..9999] of integer; {40,000 bytes}
ktr : integer;
...
procedure foo;
var
ktr2 : integer;
big_array_2 : array [0..9999] of integer; {40K bytes}
добра:
var {outer-block variables}
{small variables...}
ktr : integer;
{big variables...}
big_array : array [0..9999] of integer;
...
procedure foo;
var
{big variables...}
big_array_2 : array [0..9999] of integer; {40K bytes}
{small variables...}
ktr2 : integer;
У дрэнны прыклад, Pascal/IX будзе выкарыстоўваць дзве каманды для доступу да "КТР" і "ktr2". У добры прыклад, Pascal/IX будзе выкарыстоўваць адну каманду для доступу да "КТР" і "ktr2".
# 1-38. дыферэнцыяцыя Паскаля функцый ад працэдур жаль, у лепшым выпадку. Мы не павінны заахвочваць распрацоўшчыкі мовы, каб увекавечыць гэты недахоп.
# 1-39. Pascal/с IX '"$ мясцовасці" заява можа быць выкарыстана, каб паведаміць кампаноўнік ў групу устаноўленых працэдур разам, незалежна ад іх парадку ў зыходным кодзе.
# 1-40. Паскаль дазваляе працэдур, якія будуць абвешчаныя ў рамках працэдур, якія абвешчаны ў рамках працэдур, якія...
Укладзеныя працэдуры заплаціць штраф падчас выканання, калі яны атрымліваюць доступ да пераменным глабальнай ім, што з'яўляюцца лакальнымі для навакольных працэдур.
Працэдуры укладзеных больш, чым у агульнай складанасці два глыбокіх (гэта значыць: "знешнім узроўні" Парадак і адной ўнутранай працэдуры) звычайна азначае, што іншыя праблемы дызайну існуе.
Некаторыя адладчык цяжка ўстаноўка кропак супыну на укладзеных працэдур.
# 1-43. Гэтая дадатковая праца часта акупляецца таксама пры напісанні "модуля", які будзе звязаны з іншымі праграмамі. Я часта ставяць ўсе мае "наперад" заявы ў файл, а затым выкарыстоўваць наступныя каманды QEDIT для стварэння "знешніх" заявы файл для іншых модуляў да $ ўключаюць у сябе:
t myfile.forward c "forward"(S)"external"@ k myfile.external(QEDIT шырока выкарыстоўваецца рэдактар ??на HP 3000.)
# 1-44. Debug/IX 'S Фармат віртуальных каманд (FV) будзе вырабляць значна больш зручным для чытання выхад для выпадковых дадзеных, калі базавы тып лічбавай, а не характар. (Debug/IX з'яўляецца адладчык ў камплекце з ПДВ/IX на HP 3000.)
# 1-45. З гэтай рэкамендацыі, і звязаныя адзін у наступным раздзеле, каманда QEDIT як:
l "procedure" (s)
будуць пералічаны ў першай радку кожнай працэдуры дэкларацыі. Звярніце ўвагу, што толькі фактычнае аб'ява будзе ў спісе, не "наперад" або "знешніх" заявы, паколькі яны былі абвешчаныя з вялікай літары "P" у "Парадак".
Заўвага: не скажыце вашаму рэдактару аўтаматычна upshift ўвесь тэкст вы шукаеце (напрыклад: ўстаноўка вокнаў (UP) у QEDIT), так як гэта будзе параза мэт гэтага кіраўніцтва.
(Назад да зместу)
1,4 выкананага кода
У гэтым раздзеле разглядаюцца стылі кадаваньня для выкананай часткі кода праграмы Паскаль.
Кіруючыя прынцыпы:
# 1-50. Увесь код павінен быць у ніжнім рэгістры.
# 1-51. Каментары павінны быць на англійскай мове, і павінны быць у мяшаным выпадку, як гэта практыкуецца ў англійскай мове.
# 1-52. Каментары павінны з'явіцца ў адным з двух стыляў, у залежнасці ад іх памеру:
Прыклад:
{the following loop looks for a null character}
null_index := -1; {-1 will mean "not found"}
test_inx := 0; {index of first char}
done := (len = 0); {don't loop if no data}
while not done do
begin
{see if current character is null...}
if buf [test_inx] = chr (0) then
begin {found a null!}
null_index := test_inx; {remember location}
done := true; {terminate loop}
end
else
begin {incr inx, check end}
test_inx := test_inx + 1;
if test_inx >= len then {inx is 0-based}
done := true;
end;
end; {while not done}
# 1-53. Шматрадковы каментарыі могуць быць напісаны з "{" і "}" у кожнай радку, альбо з "{" і "}" зьяўляюцца толькі адзін раз, на лініі самі па сабе.
# 1-54. "{" І "}" сімвалы выкарыстоўваюцца для пачынаць і спыняць каментары, ніколі "(*" і "*)" пар.
# 1-55. "{", Як правіла, не ідуць прасторы, роўна як і "}" звычайна папярэднічае прастору (калі гэта не яго ўзгаднення з папярэдняга лініі "}").
# 1-56. Лініі павінны быць не больш за 72 байт, хоць Pascal/IX дазваляе больш ўваходных ліній.
# 1-57. Пустыя радкі нічога не варта падчас выканання, і павінны быць выкарыстаны шчодра асобных участкаў кода. Прыклад:
if ktr > max_ktr then
max_ktr := ktr; {remember new high water}
done := false;
while not done do
begin
...
# 1-58. "Канца" заявы не павінны мець каментаваць. Паскаль ніколі не правярае, што вашыя каментары матчаў рэальнасці, ва ўсякім выпадку.
# 1-59. Асноўнай адзінкай водступы 3, не 4 або 2.
# 1-60. Водступ "пачаць" з 3 прасторы больш, чым у пачатку папярэдняга радка. Кодэкс пасля "пачатку" (аж да "канца") на тым жа ўзроўні, "пачаць".
# 1-61. Працяг лініі адступам па 6 больш, чым у пачатку першага радка.
# 1-62. "Тое" з ", калі /, то" заяву, як правіла, на той жа лініі, што і астатнія лагічны выраз, а не на наступным радку па сабе (калі неабходна для адлегласці, а затым з водступам 6), і ніколі на той жа лініі, як аператар, наступны за "тое".
# 1-63. "Інакш калі" канструкцыя можа разглядацца як калі б гэта быў новы Паскаль пабудаваць: "ElseIf". (Гэта значыць:. "Калі б" варта "яшчэ" на той жа лініі)
# 1-64. "Пераход 999" прымальны метад галінавання ў канцы працэдуры (або функцыі).
# 1-65. Ніякіх іншых "перайсці" S неабходныя.
# 1-66. Пастарайцеся, каб працэдуры ніжэйшы за пяць старонак (300 радкоў).
# 1-67. Ніколі не выкарыстоўвайце слова "працэдура" ці "функцыі" у каментары ў дакладнасці ўсё ў ніжнім рэгістры. Замест гэтага варта выкарыстоўваць "звычайныя" або "працэдура" ці "функцыі".
# 1-68. Заўсёды спыніць працэдуру або функцыю з каментарыем выгляд:
end {nameofroutine proc};
# 1-69. Пакладзеце прабел паміж імя працэдуры або функцыі і "(" з спісу параметраў.
# 1-70. Пакладзеце пусты пасля кожнай коскі ў спісе параметраў.
# 1-71. Пакладзеце прабелы вакол аператараў (напрыклад: ": =", "+", "-"), а ў пярэдняй левай дужкі ("[").
Каментарыі:
# 1-52. Уніфікаваныя каментары зрабіць больш акуратна код погляд. Гэтая практыка дазваляе чытачу лёгка прачытаць код або каментары.
# 1-55. Практыка заўсёды наступныя "{" з прасторай і папярэднія "}" адходы каштоўнае прастору на лініі.
# 1-56. Доўгія чэргі не буду пералічваць а на большасці тэрміналаў, і яны не прымальныя для ўсіх рэдактараў.
# 1-58. Я паклаў каментар на "канец" заяву, калі гэта больш, чым аб 10 радкоў з адпаведнага "пачаць".
# 1-60. Значэнне "3" і забарона на "двайны водступ" эканоміць прастору і робіць вынік больш чытэльным. Разгледзім наступныя два прыкладу:
дрэнна:
for i := 1 to 10 do
begin
buf [i] := 0;
foo [i] := 0;
end;
if ktr = 0 then
begin
if not done then
begin
...
добра:
for i := 1 to 10 do
begin
buf [i] := 0;
foo [i] := 0;
end;
if ktr = 0 then
begin
if not done then
begin
...
Многія праграмісты Паскаль бачылі "двайны водступ" стыль, таму што прафесар адказвае за UCSD Pascal (у пачатку 1970-х) выкарыстаў гэты стыль. Звярніце ўвагу, што ён быў у першую чаргу настаўнікі, не праграміст.
# 1-61. Напрыклад:
if (card_counter = max_card_counter) and
all_cards_accounted_for then
begin
...
Мэта водступаў працяг ліній, каб ясна зразумець чытачу, што да лініі працягваецца на наступны радок. Калі без дадатковых водступаў выкарыстоўваецца, то яна становіцца цяжка вызначыць розніцу паміж Наступнае сцверджанне і працяг бягучага аператара.
Калі ў мяне ёсць комплекс "і/ці", я стараюся, каб зрабіць яго даступным для чытання пры выкананні наступнай радкі:
дрэнна:
if ((card_counter = prior_card_counter) and ((number_of_cards_left
> cards_for_book)) then
begin
добра:
if ( (card_counter = prior_card_counter)
and (number_of_cards_left > cards_for_book) ) then
begin
У дрэнны прыклад, звярніце ўвагу, як "пачаць" размытая ад "і" пачала ў тым жа слупкі.
# 1-62. Словы ", то" гэта сінтаксічны цукар: яна выкормліваюць лістынг, і не мае каштоўнасці. Калі чытач бачыць "калі", то ён або яна аўтаматычна ведае, што "тое" ў хуткім часе таксама. Водступ было б дастаткова, каб сказаць чытачу, што "тое" зварот быў знойдзена. Прыклады:
дрэнна:
if card_counter = max_card_counter
then done := true
else...
добра:
if card_counter = max_card_counter then
done := true
else
...
У прыведзеным вышэй дрэнны прыклад, чытач думках просеять праз залішнія фармулёўкі ("то") перад "зроблена: =", каб зразумець, ўплывае "праўдзівага" лагічны выраз. У добры прыклад, чытанне левай частцы лістынга дастаткова.
# 1-63. "Інакш калі" будуе, як правіла, знайсці ў адной з двух сітуацый:
Прыклад "Ран-на" "калі для/то/інакш":
if token_check ('EXIT') then
wrapup
else if token_check ('LIST') then
do_list
else if token_check ('PRINT') then
do_print
else
writeln ('Unknown command: ', token);
Заўвага: у стылі вышэй, я часта паставіць 5 лішніх прабелаў перад першым "token_check", так што каманда QEDIT як спіс "token_check" пакажа ўсе тры "token_check" фразы добра размешчаныя.
Прыклад укладзеных ", калі/то/інакш":
if card_counter = max_card_counter then
if done then
...
else
discard_current_card
else
if current_card = joker then
try_best_wildcard
else
calculate_score;
Стыль, які я рэкамендую наступнае:
if token_check ('EXIT') then
wrapup
else
if token_check ('LIST') then
do_list
else
...
Вышэй стыль цяжкія наступствы чытаема, калі несвоечасова "старонкі вымання" уваходзіць у лістынг паміж "яшчэ" лініі і наступныя ", калі" лініі.
# 1-64. Паскаль не хапае "выхаду" заяву. З і SPL маюць некаторую форму "вяртання з гэтай працэдуры прама зараз" заявы. Гэта адзінае месца, я выкарыстоўваю "перайсці" на мове Паскаль.
# 1-67. Гэтая рэкамендацыя азначае, што рэдактар ??"Знайсці" і "спіс" каманды шукае "працэдуры" і "функцыі" ніколі не будзе выпадкова знайсці радка каментарыяў замест. (Гл. таксама # 1-45).
# 1-68. Гэта робіць яго вельмі лёгка знайсці канцы любога (ці ўсіх) працэдуру (ы) з "знайсці" каманду.
# 1-69/70/71. Бланкі зрабіць код больш зручным для чытання, так жа як яны робяць ангельску больш чытэльным. Звярніце ўвагу на прабел пасля коскі ў папярэднім сказе. Прыклад:
дрэнна:
fid:=fopen(filename,3,0);
добра:
fid := fopen (filename, 3, 0);
Гэты раздзел прысвечаны выбар, зроблены ў пісьмовым выглядзе выконваемага кода.
Кіруючыя прынцыпы
# 2-1. Вырашыце, калі ваш стыль, каб функцыі, якія вяртаюць памылкі, ці працэдуры, якія маюць статус параметраў (або абодва), а затым прытрымлівацца яго.
# 2-2. Не выкарыстоўвайце "з" для простых паказальнікаў deferencing. Выкарыстоўвайце толькі "с", калі індэксацыі ў масіве.
# 2-3. Старайцеся пазбягаць "паўтарыць" завесы, з дапамогай "а" замест завесы.
# 02/04. Старайцеся пазбягаць выкарыстання "бегчы" за рамкі "Try/аднавіць" блокаў.
# 02/05. Пазбягайце "радок" S у карысць ПЧК. ПЧК ўпакаваны масіў Char з ніжняй мяжой 1.
№ 2-6. Выкарыстоўвайце Pascal/IX пашырэння калі гэта магчыма, калі мабільнасць з'яўляецца асноўнай мэтай.
# 02/07. "Try/аднавіць" пабудаваць у Pascal/IX вельмі карысна для лоўлі памылак: як нечаканы і наўмысна. (Паспрабуйце/аднавіць гэта памылка лоўлі механізм некалькі падобная на вылаў/кінуць у некаторых іншых мовах)
# 02/08. Выкарыстоўвайце $ type_coercion 'прадстаўленне' $. Ніколі не выкарыстоўвайце noncompatible ўзроўню тыпу прымусу.
# 02/09. "Anyvar" параметр тыпу карысна. Паспрабуйце выкарыстаць яго, калі вы хочаце перадаць рознымі тыпамі зменных у адну працэдуру.
# 02/10. "Uncheckable_anyvar" для працэдуры павінны выкарыстоўвацца кожны раз, калі "anyvar" параметры абвешчаныя, калі вы хочаце канкрэтна Pascal/IX прайсці скрытыя "агульная" параметру.
# 02/11. Пры выкарыстанні "anyvar", пераканайцеся, што фармальны параметр тыпу матчы выраўноўванне абмежаванні чаканых фактычных тыпаў. Гэта значыць: калі фармальны параметр аб'яўлены як "цэлае", то Pascal/IX будзе лічыць, што ўсе адрасы, якія прайшлі ў параметру кратна 4. Выкарыстоўвайце "сімвал" (ці іншай байт краю тыпу), што фармальнай параметрам тыпу, калі вы хочаце перадаць любыя адрасы бяспечна.
# 02/12. "Default_parms" працэдуры варыянт варта разглядаць у якасці сродку забеспячэння доўгага фактычны параметр спісы карацей (для звычайных выпадках).
Каментарыі:
# 2-1. Часам, я вярнуся хутка агульны вынік з "good_failed_type", і падрабязныя памылкі ў стан параметру. Прыклад:
function open_files (var status : hpe_status) : good_failed_type;
...
if open_files (status) = failed then
report_status (status);
# 2-2. Паскаль дае "з" заяву, якое можа, у некаторых выпадках, забяспечыць кампілятар з намёкам аб тым, як аптымізаваць інструкцыі, якія ён выпускае для вашага кода. Акрамя таго, "з" Заява можна захаваць наступнай друку.
Прыклад бескарысна "з" гэта:
var
ptr : hpe_status_ptr_type;
...
with ptr^ do
begin
hs_info := 0;
hs_subsys := 0;
end;
Гэта "бескарысным", таму што кампілятар і аптымізатар, верагодна, зрабілі так жа добра, працу выпраменьваючых аптымальнага кода, калі б мы сказалі:
ptr^.hs_info := 0;
ptr^.hs_subsys := 0;
Звярніце ўвагу, што код узяў пяць ліній з выкарыстаннем "з" заяву, і дзве лініі без яго. Нарэшце, той факт, што "hs_info" і "hs_subsys" на самай справе поля запісы, на якую паказвае "PTR" некалькі Obscured, калі "з" выкарыстоўваецца.
Прыклад карыснай "з" з'яўляецца:
var
statuses : array [0..9] of hpe_status_type;
...
with statuses [k] do {optimize hs_@ fields}
begin
hs_info := 0;
hs_subsys := 0;
end;
Я лічу гэта прыкладам "карыснай", таму што аптымізатар б было больш працы спрабую сабраць аптымальны код для эквівалентнай не-з заявы:
statuses [k].hs_info := 0; statuses [k].hs_subsys := 0;
У прыведзеных вышэй прыкладах, павабна для выраўноўвання ": =" S з самай правай ": =" блока прысвойвання. Раней я часта робяць гэта, калі ў мяне было чатыры ці больш аналагічных заданняў у радку.
Перавага павялічваецца чытальнасць, таму што мы з усёй відавочнасцю паказваюць, што дадзеныя звязаныя паміж сабой (з-за адпаведнасць ": =" S). Недахопам з'яўляецца тое, што простая каманда QEDIT накіраваных на спіс, у якім "hs_info" поле змянілася (напрыклад: СПІС "hs_info: =") не будзе выканана. Я знайшоў, што пошук у абмен на магчымасць прызначэння перавешваюць даных з'яўляецца звязаным выгады, для мяне.
# 2-3. Калі "паўтарыць" пятля сустракаецца, чытач не будзе ведаць, што ўмова завяршэння пакуль шматлікія іншыя лініі крыніцы праграмы для чытання. Гэта азначае, што ён ці яна не зможа праверыць правільнасць настройкі ўмова завяршэння. "А" пятля дазваляе пазбегнуць гэтай праблемы, паколькі спыненне ўмова, відавочна, указаны ў верхняй частцы завесы.
Паўтарыць завесы, як правіла, быць зменены ў той час як пятля лёгка:
да:
repeat
begin
...
end
until
buf [inx] = 0;
пасля:
done := false;
while not done do
begin
...
done := (buf [inx] = 0);
end; {while not done}
# 02/04. "Нелокальные пазбегнуць" стаіць тысячы цыклаў працэсарнага часу для выканання. Карацей кажучы, ніколі не плануеце выкарыстоўваць гэтую канструкцыю як звычайны метад вяртання з працэдуры. Прыклады:
дрэнна:
procedure do_work; {note: no status parameter!}
...
if problem then
escape (i_failed);
...
добра:
procedure do_work (var status : hpe_status_type);
label
999;
...
if problem then
begin
status := my_failure_status;
goto 999; {exit}
end;
...
999:
end {do_work proc};
# 02/05. Радкі схаваць велізарная колькасць павольна і некалькі няправільных генераваны кампілятарам код. Аб'яднанне радкоў, у прыватнасці, можа прывесці да "уцечкі памяці", дзе ваш працэс выконваецца з кучы прасторы. ПЧК з'яўляюцца Мэсье мець справу, але значна больш эфектыўным. Гэта прадукцыйнасці ў параўнанні з эстэтыкай кампраміс.
№ 2-6. Pascal/IX з'яўляецца вельмі карысным мову менавіта таму, што яна мае вялікую колькасць пашырэнняў для стандартных Паскаль. Калі вы адмовіцца ад іх выкарыстання, вы б лепш праграмавання ў ANSI C ці C + +.
# 02/07. "Паспрабуйце/аднавіць" не гарантуецца, каб злавіць любыя памылкі, якія адбываюцца ў ім. Нечаканыя памылкі (напрыклад: няправільны індэкс, дрэнны віртуальны адрас) спасылацца аперацыйнай сістэмы руцінных званых trap_handler які будзе "хадзіць" праз вашу стэка маркераў шукае самыя апошнія "спрабуюць/аднавіць" блокаў. Гэтая "прагулка" можа пацярпець няўдачу, калі ваш стэк пашкоджаны, і "нічога/аднаўлення" не будзе знойдзены. Калі гэта адбудзецца, і калі адпаведны апрацоўшчык пасткі (напрыклад: XCODETRAP) не былі ўзброеныя, ваш працэс будзе спынены.
# 02/08. Тып прымус з'яўляецца адным з лепшых пашырэнняў на мове Паскаль/IX. Яна забяспечвае кіраваны спосаб пераазначэння праверкі тыпаў Паскаля. $ Type_coercion дырэктыва кажа Паскаль/IX якім узроўні тыпу прымусу вы хочаце, каб у вашай праграме. Каля пяці розных узроўнях існуе. Узроўні я настойліва рэкамендую гэта прадстаўленне. Гэты ўзровень дазваляе выраз аднаго тыпу, каб быць прымушаны (лічыцца) іншага тыпу, калі, і толькі тады, калі два тыпу дакладна такога ж памеру (у адзінках біт, а не байт).
Noncompatible узроўні кажа Паскаль/IX, што не павінна быць ніякіх абмежаванняў на тып прымусу. Гэта прыводзіць да цікавых памылак у праграмах. Некаторыя MPE/аварый IX сістэмы можна прасачыць ў выкарыстанні гэтага віду тып прымусу няправільна. У наступных прыкладах паказана, як noncompatible могуць схаваць памылкі.
здагадцы:
var
big_ptr : globalanyptr;
my_address : integer;
small_ptr : localanyptr;
дрэнна:
$type_coercion 'noncompatible'$
my_address := integer (big_ptr); {will get half of data!}
my_address := integer (small_ptr); {will get 32 bit value}
добра:
$type_coercion 'representation'$
my_address := integer (big_ptr); {will get syntax error}
my_address := integer (small_ptr); {will get 32 bit value}
У дрэнны прыклад, прымус big_ptr вынікаў у стварэнні my_address да верхняга 32 біта big_ptr (г.зн. прастору ID), моўчкі страты ніжняй 32 біт адрасы. У добры прыклад, Pascal/IX будзе генераваць сінтаксічную памылку ў спробе прымусіць 64-разрадных выраз (big_ptr) у 32-бітнае значэнне (цэлае лік).
# 02/09. "Anyvar" з'яўляецца Pascal/IX пашырэнне "Var". Калі фармальны параметр аб'яўлены як "anyvar", кампілятар дазваляе любы зменнай быць перададзены ў якасці фактычнага параметру. Без такой функцыі, і без аб'ектна-арыентаваны Паскаль, вы не маглі б напісаць адну працэдуру, якая б нулю (выдаленне) адвольнай зменнай (гл. ніжэй прыклад).
Па змаўчанні, калі параметр абвешчаны як anyvar, Pascal/IX будзе праходзіць у адрас фактычнага параметру * і * скрытыя цэлае па значэнні, якая фіксуе памер фактычнага запаволення. Наступны прыклад паказвае, што перадаецца па фармальных запаволення, як: "anyvar Foo: цэлае", а таксама ўплывае на "SizeOf (Foo)" у рамках працэдуры:
| Фактычны параметр тыпу | Схаваная памер поля | SizeOf (Foo) |
| сімвал | 1 | 1 |
| SHORTINT | 2 | 2 |
| цэлае лік | 4 | 4 |
| LONGINT | 8 | 8 |
| рэальны | 4 | 4 |
| LONGREAL | 8 | 8 |
| hpe_status (гл. № 1-24) | 4 | 4 |
| ўпакаваны масіў [1.. 80] з сімвалаў | 80 | 80 |
procedure zero_var (anyvar foo : char);
{Purpose: zero every byte in the parameter}
var
bytes_left : integer;
byte_ptr : ^char;
begin
$push, range off$
byte_ptr := addr (foo);
bytes_left := sizeof (foo); {Note: gets actual size!}
while bytes_left > 0 do
begin {zero one byte}
byte_ptr^ := chr (0);
bytes_left := bytes_left - 1;
byte_ptr := addtopointer (byte_ptr, 1);
end;
$pop$ {range}
end {zero_var proc};
Звярніце ўвагу на каментар на $ поп $... дазваляе мне ўспомніць, якія варыянты $ $ поп нібыта аднаўлення. У Pascal/IX, $ штуршок $ захоўвае стан большасці параметраў кампілятара, і $ поп $ аднаўляе іх. Такім чынам, $ штуршок, дыяпазон ад $... $ $ Поп часова выключае "Дыяпазон" варыянт, а затым аднавіць яе на старое дзяржава... што значна адрозніваецца ад проста павярнуўшы яго, калі "зрабілі"!
Вядома, Pascal/IX дазваляе яшчэ хутчэй спосаб абнулення зменнай, якая адбываецца, добра працаваць з триггерной параметраў anyvar. Увесь код вышэй працэдуры (паміж "пачаць" і "канец") можа быць заменены на:
fast_fill (addr (foo), 0, sizeof (foo));
# 02/12. У наступным прыкладзе, працэдуры, што большасць карыстальнікаў будзе званок з "ілжывымі" у якасці другога параметру, паказвае карыснасць "default_parms":
const
print_with_cr = 0;
print_without_cr = 1;
procedure print_msg (
msg : str80;
cr_or_no_cr : integer)
option default_parms (
cr_or_no_cr := print_with_cr);
var
cctl_val : shortint;
begin
if cr_or_no_cr = print_without_cr then
cctl_val := octal ('320')
else
cctl_val := 0;
print (msg, -strlen (msg), cctl_val);
{Note: ignoring errors from print intrinsic}
end {print_msg};
...
print_msg ('Starting...', print_without_cr);
print_msg ('Ending'); {does a CR/LF at end}
Звярніце ўвагу, што я б не выкарыстоўваць "default_parm" для параметра, які апускаецца менш чым аб 75% часу. Два самых вялікіх праблем прадукцыйнасці ў Pascal/праграмы IX выкарыстоўваецца убудаваны ў I/O, і выкарыстанне радкоў.
Кіруючыя прынцыпы:
# 3-1. Пазбягайце Паскаль I/O. Выкарыстаньне ўбудаваных замест.
# 3-2. Пазбягайце Паскаль I/O. Выкарыстаньне ўбудаваных замест. Гэта варта сказаць два разы!
# 3-3. Пазбягайце радкоў у прадукцыйнасці крытычна важных галінах.
# 3-4. Выключыце праверкі дыяпазону ($ дыяпазоне ад $) толькі тады, калі вы ўпэўнены, што ваша праграма працуе карэктна.
# 3-5. Выкарыстоўвайце Pascal/IX аптымізатар ($ аптымізацыі на $).
Каментарыі:
# 3-1. Калі вы інкапсуляваць ўводу/вываду званкоў, то іх асноўны рэалізацыі можа быць лёгка зменена, каб выкарыстаць убудаваныя ПДВ. Гэта таксама дапамагае пераноснасць розных аперацыйных сістэмах і ў розных мовах. "Print_msg" працэдура ў каментары # 02/12 прыклад.
Другая прычына для пазбягання Паскаль I/O канструкцыі з'яўляецца эфектыўнасць. Pascal/IX ўводу/вываду працэдуры вельмі неэфектыўна. Гэтая рэкамендацыя справядлівая для большасці моў.
# 3-3. Радковыя выразы прымушае кампілятар выпраменьваюць шмат званкоў на "дапаможныя" працэдур. Замест вылучэння адной вобласці працы ў стэку, гэтыя працэдуры вылучыць (і вызвалення) многіх галінах працы на кучы. Гэта можа быць дарагі дзейнасці, і можа прывесці да страты прасторы кучы, і ў канчатковым выніку спынення працэсу.
# 3-5. Калі ваша праграма працуе правільна неоптимизированная, і праблема аптымізаваныя, то Ёсць, верагодна, адзін (ці больш) неинициализированных пераменных. Другі найбольш распаўсюджанай праблемай з'яўляецца выкарыстанне паказальнікаў у шляху, што аптымізатар не чакаем (асабліва пры звароце да лакальных пераменным з дапамогай паказальнікаў).
(Назад да зместу)
Пераноснасць праграм, напісаных на мове Паскаль/IX можа быць павышана з некалькімі метадамі. Майце на ўвазе, аднак, што большасць іншых рэалізацый Паскаля не так багаты, як Паскаль/IX. Delphi і Turbo Pascal (на IBM PC сумяшчальных) забяспечваюць тыя ж функцыі, як Паскаль/IX.
# 4-1. Пазбягайце гэтых Pascal/IX пашырэнняў: пашыраецца, толькі для чытання, anyvar, варыянт, uncheckable_anyvar, default_parms, globalanyptr.
# 04/02. Пазбягайце вышэй за $ дырэктывы (напрыклад: $ extnaddr $).
# 04/03. Выкарыстоўвайце тып прымусу толькі для тыпаў аднолькавых памераў. (Добры савет, нават калі вы ніколі не будзеце порт кодзе!) Больш за ўсё на базе ПК Па маюць форму тыпу прымусу. Яны могуць спасылацца на яго як "прывядзенне тыпаў".
# 04/04. Пазбягайце "хрусьцеў" запісаў. Нават самыя C моў не маюць функцыянальны эквівалент. Гэта ўключае пазбегнуць "$ HP3000_16 $".
# 4-5. Інкапсуляцыя "дзіўных" канструкцый, дзе гэта магчыма.
# 04/06. Інкапсуляцыя ўводу/вываду званкоў. Гэта не праблема мовы пераноснасці так шмат, як аперацыйнай сістэмы і/або праблем з прадукцыйнасцю.
# 4-7. Трымайце радкоў зыходнага кода кароткі (72 сімвалаў ці менш у кожнай радку).
# 04/08. Выкарыстаньне карыстацкіх тыпаў, як "int16" і "int32" замест "SHORTINT" ці "цэлае". Майце на ўвазе, гэта надзвычай важна для праграмістаў C!
# 04/09. Майце на ўвазе, што поля ў запісы могуць быць спакаваныя па-рознаму на розных машынах.
# 04/10. Стандартны Паскаль не дазваляе паказальнікі на кропкі ў пераменныя. (Яны могуць толькі кропка ў кучу.)
(Назад да зместу)
Самы кароткі рэзюмэ гэтага артыкула, магчыма,: вы можаце судзіць аб кнізе па яе вокладцы. Калі праграма выглядае добра, яна, верагодна, гэта прыемна.
(Назад да зместу)