Поддерживать
www.wikidata.ru-ru.nina.az
Oblast vidimosti angl scope v programmirovanii chast programmy v predelah kotoroj identifikator obyavlennyj kak imya nekotoroj programmnoj sushnosti obychno peremennoj tipa dannyh ili funkcii ostayotsya svyazannym s etoj sushnostyu to est pozvolyaet posredstvom sebya obratitsya k nej Govoryat chto identifikator obekta viden v opredelyonnom meste programmy esli v dannom meste po nemu mozhno obratitsya k dannomu obektu Za predelami oblasti vidimosti tot zhe samyj identifikator mozhet byt svyazan s drugoj peremennoj ili funkciej libo byt svobodnym ne svyazannym ni s kakoj iz nih Oblast vidimosti mozhet no ne obyazana sovpadat s oblastyu sushestvovaniya obekta s kotorym svyazano imya Cvyazyvanie identifikatora angl binding v terminologii nekotoryh yazykov programmirovaniya process opredeleniya programmnogo obekta dostup k kotoromu dayot identifikator v konkretnom meste programmy i v konkretnyj moment eyo vypolneniya Eto ponyatie po suti sinonimichno oblasti vidimosti no mozhet byt bolee udobno pri rassmotrenii nekotoryh aspektov vypolneniya programm Oblasti vidimosti vhodyat drug v druga i sostavlyayut ierarhiyu ot lokalnoj oblasti vidimosti ogranichennuyu funkciej ili dazhe eyo chastyu do globalnoj identifikatory kotoroj dostupny vo vsej programme Takzhe v zavisimosti ot pravil konkretnogo yazyka programmirovaniya oblasti vidimosti mogut byt realizovany dvumya sposobami leksicheski staticheski ili dinamicheski Oblast vidimosti takzhe mozhet imet smysl dlya yazykov razmetki naprimer v HTML oblastyu vidimosti imeni elementa upravleniya yavlyaetsya forma HTML ot lt form gt do lt form gt Tipy oblasti vidimostiV monolitnoj odnomodulnoj programme bez vlozhennyh funkcij i bez ispolzovaniya OOP mozhet sushestvovat tolko dva tipa oblasti vidimosti globalnaya i lokalnaya Prochie tipy sushestvuyut tolko pri nalichii v yazyke opredelyonnyh sintaksicheskih mehanizmov Globalnaya oblast vidimosti identifikator dostupen vo vsyom tekste programmy vo mnogih yazykah dejstvuet ogranichenie tolko v tekste nahodyashemsya posle obyavleniya etogo identifikatora Lokalnaya oblast vidimosti identifikator dostupen tolko vnutri opredelyonnoj funkcii procedury Vidimost v predelah modulya mozhet sushestvovat v modulnyh programmah sostoyashih iz neskolkih otdelnyh fragmentov koda obychno nahodyashihsya v raznyh fajlah Identifikator chej oblastyu vidimosti yavlyaetsya modul dostupen iz lyubogo koda v predelah dannogo modulya Paket ili prostranstvo imyon V globalnoj oblasti vidimosti iskusstvenno vydelyaetsya poimenovannaya podoblast Imya privyazyvaetsya k etoj chasti programmy i sushestvuet tolko vnutri neyo Vne dannoj oblasti imya libo voobshe nedostupno libo dostupno ogranichenno V OOP yazykah dopolnitelno k vysheperechislennym mogut podderzhivatsya specialnye ogranicheniya oblasti vidimosti dejstvuyushie tolko dlya chlenov klassov identifikatorov obyavlennyh vnutri klassa ili otnosyashihsya k nemu Privatnaya lichnaya zakrytaya angl private oblast vidimosti oznachaet chto imya dostupno tolko vnutri metodov svoego klassa Zashishyonnaya angl protected oblast vidimosti oznachaet chto imya dostupno tolko vnutri svoego klassa i ego klassov potomkov Obshaya angl public oblast vidimosti oznachaet chto imya dostupno v predelah oblasti vidimosti k kotoroj otnositsya ego klass Sposoby zadaniya oblasti vidimostiV prostejshih sluchayah oblast vidimosti opredelyaetsya mestom obyavleniya identifikatora V sluchayah kogda mesto obyavleniya ne mozhet odnoznachno zadat oblast vidimosti primenyayutsya specialnye utochneniya Identifikator obyavlennyj vne lyubogo opredeleniya funkcii procedury tipa yavlyaetsya globalnym Identifikator obyavlennyj vnutri opredeleniya funkcii yavlyaetsya lokalnym v dannoj funkcii to est ego oblastyu vidimosti yavlyaetsya eta funkciya Identifikator yavlyayushijsya chastyu opredeleniya tipa dannyh v otsutstvie dopolnitelnyh utochnenij imeet tu zhe oblast vidimosti chto i identifikator tipa v opredelenie kotorogo on vhodit V yazykah podderzhivayushih moduli pakety ili prostranstva imyon identifikator obyavlennyj vne vseh procedur i klassov po umolchaniyu otnositsya k modulyu paketu ili prostranstvu imyon vnutri kotorogo nahoditsya ego obyavlenie Sami predely oblasti vidimosti dlya paketa ili prostranstva imyon ukazyvayutsya s pomoshyu specialnyh opisanij a modulnaya oblast vidimosti ogranichivaetsya obychno tekushim fajlom ishodnogo teksta programmy Osobennostyu etogo tipa vidimosti yavlyaetsya to chto yazyk kak pravilo soderzhit sredstva pozvolyayushie sdelat identifikator dostupnym i vne svoego modulya paketa ili prostranstva imyon to est rasshirit ego oblast vidimosti Dlya etogo dolzhno imetsya sochetanie dvuh faktorov soderzhashij identifikator modul dolzhen byt importirovan s pomoshyu specialnoj komandy tam gde predpolagaetsya ego ispolzovanie a sam identifikator pri ego opisanii dolzhen byt dopolnitelno obyavlen eksportiruemym Sposoby obyavleniya identifikatora eksportiruemym mogut byt razlichny Eto mogut byt specialnye komandy ili modifikatory v opisaniyah soglasheniya ob imenovanii naprimer v yazyke Go eksportiruemymi yavlyayutsya identifikatory paketnoj oblasti vidimosti nachinayushiesya na zaglavnuyu bukvu V ryade yazykov kazhdyj modul paket iskusstvenno delitsya na dve chasti razdel opredelenij i razdel realizacii kotorye mogut nahoditsya kak v predelah odnogo fajla ishodnogo koda naprimer v Delphi tak i v raznyh naprimer v yazyke Modula 2 eksportiruemymi yavlyayutsya identifikatory obyavlennye v module opredelenij Oblast vidimosti identifikatora obyavlennogo vnutri OOP klassa po umolchaniyu yavlyaetsya libo privatnoj libo obshej Inaya oblast vidimosti pridayotsya s pomoshyu specialnogo opisaniya naprimer v C eto modifikatory private public protected Privedyonnyj perechen ne ischerpyvaet vseh nyuansov opredeleniya oblasti vidimosti kotorye mogut imetsya v konkretnom yazyke programmirovaniya Tak naprimer vozmozhny razlichnye tolkovaniya sochetanij modulnoj oblasti vidimosti i obyavlennoj vidimosti chlenov OOP klassa V odnih yazykah naprimer C obyavlenie lichnoj ili zashishyonnoj oblasti vidimosti dlya chlena klassa ogranichivaet dostup k nemu iz lyubogo koda ne otnosyashegosya k metodam svoego klassa V drugih Object Pascal vse chleny klassa v tom chisle lichnye i zashishyonnye polnostyu dostupny v predelah togo modulya v kotorom obyavlen klass a ogranicheniya oblasti vidimosti dejstvuyut tolko v drugih modulyah importiruyushih dannyj Ierarhiya i razreshenie neodnoznachnostejOblasti vidimosti v programme estestvennym obrazom sostavlyayut mnogourovnevuyu strukturu v kotoroj odni oblasti vhodyat v sostav drugih Ierarhiya oblastej obychno stroitsya na vseh ili nekotoryh urovnyah iz nabora globalnaya paketnye modulnye klassov lokalnye konkretnyj poryadok mozhet neskolko otlichatsya v raznyh yazykah Pakety i prostranstva imyon mogut imet neskolko urovnej vlozhennosti sootvetstvenno vlozhennymi budut i ih oblasti vidimosti Otnosheniya oblastej vidimosti modulej i klassov mogut silno otlichatsya v raznyh yazykah Lokalnye prostranstva imyon takzhe mogut byt vlozhennymi prichyom dazhe v teh sluchayah kogda yazyk ne podderzhivaet vlozhennye funkcii i procedury Tak naprimer v yazyke C vlozhennyh funkcij net no kazhdyj sostavnoj operator soderzhashij nabor komand zaklyuchyonnyj v figurnye skobki obrazuet sobstvennuyu lokalnuyu oblast vidimosti v kotoroj vozmozhno obyavlenie svoih peremennyh Ierarhicheskaya struktura pozvolyaet razreshat neodnoznachnosti kotorye voznikayut kogda odin i tot zhe identifikator ispolzuetsya v programme bolee chem v odnom znachenii Poisk nuzhnogo obekta vsegda nachinaetsya s toj oblasti vidimosti v kotoroj raspolagaetsya obrashayushijsya k identifikatoru kod Esli v dannoj oblasti vidimosti nahoditsya obekt s nuzhnym identifikatorom to imenno on i ispolzuetsya Esli takovogo net translyator prodolzhaet poisk sredi identifikatorov vidimyh v obemlyushej oblasti vidimosti esli ego net i tam v sleduyushej po urovnyu ierarhii program Example1 var a b c Integer Globalnye peremennye procedure f1 var b c Integer Lokalnye peremennye procedury f1 begin a 10 Izmenyaet globalnuyu a b 20 Izmenyaet lokalnuyu b c 30 Izmenyaet lokalnuyu s writeln 4 a b c end procedure f2 var b c Integer Lokalnye peremennye procedury f2 procedure f21 var c Integer Lokalnaya peremennaya procedury f21 begin a 1000 Izmenyaet globalnuyu a b 2000 Izmenyaet lokalnuyu b procedury f2 c 3000 Izmenyaet lokalnuyu c procedury f21 writeln 5 a b c end begin a 100 Izmenyaet globalnuyu a b 200 Izmenyaet lokalnuyu b c 300 Izmenyaet lokalnuyu c writeln 6 a b c f21 writeln 7 a b c end begin Inicializaciya globalnyh peremennyh a 1 b 2 c 3 writeln 1 a b c f1 writeln 2 a b c f2 writeln 3 a b c end Tak pri zapuske privedyonnoj vyshe programmy na yazyke Paskal budet poluchen sleduyushij vyvod 1 1 2 3 4 10 20 30 2 10 2 3 6 100 200 300 5 1000 2000 3000 7 1000 2000 300 3 1000 2 3 V funkcii f1 peremennye b i c nahodyatsya v lokalnoj oblasti vidimosti poetomu ih izmeneniya ne zatragivayut odnoimyonnye globalnye peremennye Funkciya f21 soderzhit v svoej lokalnoj oblasti vidimosti tolko peremennuyu c poetomu ona izmenyaet i globalnuyu a i b lokalnuyu v obemlyushej funkcii f2 Leksicheskie vs dinamicheskie oblasti vidimostiIspolzovanie lokalnyh peremennyh imeyushih ogranichennuyu oblast vidimosti i sushestvuyushih lish vnutri tekushej funkcii pomogaet izbezhat konflikta imyon mezhdu dvumya peremennymi s odinakovymi imenami Odnako sushestvuet dva ochen raznyh podhoda k voprosu o tom chto znachit byt vnutri funkcii i sootvetstvenno dva varianta realizacii lokalnoj oblasti vidimosti leksicheskaya oblast vidimosti ili leksicheskij kontekst angl lexical scope ili leksicheskoe staticheskoe svyazyvanie angl lexical static binding lokalnaya oblast vidimosti funkcii ogranichena tekstom opredeleniya etoj funkcii imya peremennoj imeet znachenie vnutri tela funkcii i schitaetsya neopredelyonnym za ego predelami dinamicheskaya oblast vidimosti ili dinamicheskij kontekst angl dynamic scope ili dinamicheskoe svyazyvanie angl dynamic binding lokalnaya oblast vidimosti ogranichena vremenem ispolneniya funkcii imya dostupno poka funkciya vypolnyaetsya i ischezaet kogda funkciya vozvrashaet upravlenie vyzvavshemu eyo kodu Dlya chistyh funkcij kotorye operiruyut tolko svoimi parametrami i lokalnymi peremennymi leksicheskaya i dinamicheskaya oblasti vidimosti vsegda sovpadayut Problemy voznikayut kogda funkciya ispolzuet vneshnie imena naprimer globalnye peremennye ili lokalnye peremennye funkcij v kotorye ona vhodit ili iz kotoryh vyzyvaetsya Tak esli funkciya f vyzyvaet ne vlozhennuyu v neyo funkciyu g to pri leksicheskom podhode funkciya g ne imeet dostupa k lokalnym peremennym funkcii f Pri dinamicheskom zhe podhode funkciya g budet imet dostup k lokalnym peremennym funkcii f poskolku g byla vyzvana vo vremya raboty f Naprimer rassmotrim sleduyushuyu programmu x 1 function g echo x x 2 function f local x 3 g f vyvedet 1 ili 3 echo x vyvedet 1 ili 2 Funkciya g vyvodit i izmenyaet znachenie peremennoj x no eta peremennaya ne yavlyaetsya v g ni parametrom ni lokalnoj peremennoj to est ona dolzhna byt svyazana so znacheniem iz oblasti vidimosti v kotoruyu vhodit g Esli yazyk na kotorom napisana programma ispolzuet leksicheskie oblasti vidimosti to imya x vnutri g dolzhno byt svyazano s globalnoj peremennoj x Funkciya g vyzvannaya iz f vyvedet pervonachalnoe znachenie globalnoj h posle chego pomenyaet ego i izmenyonnoe znachenie budet vyvedeno poslednej strokoj programmy To est programma vyvedet snachala 1 zatem 2 Izmeneniya lokalnoj x v tekste funkcii f na etom vyvode nikak ne otrazyatsya tak kak eta peremennaya ne vidna ni v globalnoj oblasti ni v funkcii g Esli zhe yazyk ispolzuet dinamicheskie oblasti vidimosti to imya x vnutri g svyazyvaetsya s lokalnoj peremennoj x funkcii f poskolku g vyzyvaetsya iznutri f i vhodit v eyo oblast vidimosti Zdes funkciya g vyvedet lokalnuyu peremennuyu x funkcii f i izmenit eyo zhe a na znachenii globalnoj x vsyo eto nikak ne skazhetsya poetomu programma vyvedet snachala 3 zatem 1 Poskolku v dannom sluchae programma napisana na bash kotoryj ispolzuet dinamicheskij podhod v realnosti imenno tak i proizojdyot I leksicheskoe i dinamicheskoe svyazyvanie imeyut svoi polozhitelnye i otricatelnye storony Prakticheski vybor mezhdu tem i drugim razrabotchik delaet ishodya kak iz sobstvennyh predpochtenij tak i iz haraktera proektiruemogo yazyka programmirovaniya Bolshinstvo tipichnyh imperativnyh yazykov vysokogo urovnya iznachalno rasschitannyh na ispolzovanie kompilyatora v kod celevoj platformy ili v bajt kod virtualnoj mashiny ne principialno realizuyut staticheskuyu leksicheskuyu oblast vidimosti tak kak ona udobnee realizuetsya v kompilyatore Kompilyator rabotaet s leksicheskim kontekstom kotoryj statichen i ne menyaetsya pri ispolnenii programmy i obrabatyvaya obrashenie k imeni on mozhet legko opredelit adres v pamyati gde raspolagaetsya svyazannyj s imenem obekt Dinamicheskij kontekst nedostupen kompilyatoru tak kak on mozhet menyatsya v hode ispolneniya programmy ved odna i ta zhe funkciya mozhet vyzyvatsya vo mnozhestve mest prichyom ne vsegda yavno tak chto dlya obespecheniya dinamicheskoj oblasti vidimosti kompilyator dolzhen dobavit v kod dinamicheskuyu podderzhku opredeleniya obekta na kotoryj ssylaetsya identifikator Eto vozmozhno no snizhaet skorost raboty programmy trebuet dopolnitelnoj pamyati i uslozhnyaet kompilyator V sluchae s interpretiruemymi yazykami naprimer skriptovymi situaciya principialno inaya Interpretator obrabatyvaet tekst programmy neposredstvenno v moment ispolneniya i soderzhit vnutrennie struktury podderzhki ispolneniya v tom chisle tablicy imyon peremennyh i funkcij s realnymi znacheniyami i adresami obektov Interpretatoru proshe i bystree vypolnit dinamicheskoe svyazyvanie prostym linejnym poiskom v tablice identifikatorov chem postoyanno otslezhivat leksicheskuyu oblast vidimosti Poetomu interpretiruemye yazyki chashe podderzhivayut dinamicheskoe svyazyvanie imyon Osobennosti svyazyvaniya imyonV ramkah kak dinamicheskogo tak i leksicheskogo podhoda k svyazyvaniyu imyon mogut byt nyuansy svyazannye s osobennostyami konkretnogo yazyka programmirovaniya ili dazhe ego realizacii V kachestve primera rassmotrim dva Si podobnyh yazyka programmirovaniya JavaScript i Go Yazyki sintaksicheski dovolno blizki i oba ispolzuyut leksicheskuyu oblast vidimosti no tem ne menee razlichayutsya detalyami eyo realizacii Nachalo oblasti vidimosti lokalnogo imeni V sleduyushem primere pokazany dva tekstualno analogichnyh fragmenta koda na JavaScript i Go V oboih sluchayah v globalnoj oblasti vidimosti obyavlyaetsya peremennaya scope inicializirovannaya strokoj global a v funkcii f snachala vypolnyaetsya vyvod znacheniya scope zatem lokalnoe obyavlenie peremennoj s tem zhe imenem inicializirovannoe strokoj local i nakonec povtornyj vyvod znacheniya scope Dalee privedyon realnyj rezultat vypolneniya funkcii f v kazhdom sluchae JavaScript Govar scope global function f alert scope var scope local alert scope var scope global func f fmt Println scope var scope local fmt Println scope undefined local global local Legko videt chto raznica zaklyuchaetsya v tom kakoe znachenie vyvoditsya v stroke pomechennoj kommentariem so znakom voprosa V JavaScript oblastyu vidimosti lokalnoj peremennoj yavlyaetsya vsya funkciya v tom chisle ta eyo chast kotoraya nahoditsya do obyavleniya pri etom inicializaciya etoj peremennoj vypolnyaetsya tolko v moment obrabotki stroki gde ona nahoditsya Na moment pervogo vyzova alert scope lokalnaya peremennaya scope uzhe sushestvuet i dostupna no eshyo ne poluchila znacheniya to est po pravilam yazyka imeet specialnoe znachenie undefined Imenno poetomu v pomechennoj stroke budet vyvedeno undefined V Go ispolzuetsya bolee tradicionnyj dlya etogo tipa yazykov podhod soglasno kotoromu oblast vidimosti imeni nachinaetsya so stroki gde ono obyavlyaetsya Poetomu vnutri funkcii f no do obyavleniya lokalnoj peremennoj scope eta peremennaya nedostupna i pomechennaya znakom voprosa komanda vyvodit znachenie globalnoj peremennoj scope to est global Blochnaya vidimost Eshyo odin nyuans v semantike leksicheskoj oblasti vidimosti nalichie ili otsutstvie tak nazyvaemoj blochnoj vidimosti to est vozmozhnosti obyavit lokalnuyu peremennuyu ne tolko vnutri funkcii procedury ili modulya no i vnutri otdelnogo bloka komand v Si podobnyh yazykah zaklyuchyonnogo v figurnye skobki Dalee privedyon primer identichnogo koda na dvuh yazykah dayushego raznye rezultaty vypolneniya funkcii f JavaScript Gofunction f var x 3 alert x for var i 10 i lt 30 i 10 var x i alert x alert x func f var x 3 fmt Println x for i 10 i lt 30 i 10 var x i fmt Println x fmt Println x 3 10 20 20 3 10 20 3 Raznica proyavlyaetsya v tom kakoe znachenie budet vyvedeno poslednim operatorom v funkcii f pomechennym znakom voprosa v kommentarii V JavaScript net blochnoj oblasti vidimosti v versiyah predshestvuyushih ES6 a povtornoe obyavlenie lokalnoj peremennoj rabotaet prosto kak obychnoe prisvaivanie Prisvaivanie x znachenij i vnutri cikla for izmenyaet edinstvennuyu lokalnuyu peremennuyu x kotoraya byla obyavlena v nachale funkcii Poetomu posle zaversheniya cikla peremennaya x sohranyaet poslednee znachenie prisvoennoe ej v cikle Eto znachenie i vyvoditsya v rezultate V Go blok operatorov obrazuet lokalnuyu oblast vidimosti i obyavlyaemaya vnutri cikla peremennaya x eto novaya peremennaya oblastyu vidimosti kotoroj yavlyaetsya tolko telo cikla ona perekryvaet x obyavlennuyu v nachale funkcii Eta dvazhdy lokalnaya peremennaya poluchaet v kazhdom prohode cikla novoe znachenie i vyvoditsya no eyo izmeneniya ne zatragivayut obyavlennuyu vne cikla peremennuyu x Posle zaversheniya cikla obyavlennaya v nyom peremennaya h prekrashaet svoyo sushestvovanie a pervaya x stanovitsya snova vidna Eyo znachenie ostayotsya prezhnim ono i vyvoditsya v rezultate Vidimost i sushestvovanie obektovNe sleduet otozhdestvlyat vidimost identifikatora s sushestvovaniem znacheniya s kotorym dannyj identifikator svyazan Na sootnoshenie vidimosti imeni i sushestvovaniya obekta vliyaet logika programmy i klass pamyati obekta Dalee neskolko tipichnyh primerov Dlya peremennyh pamyat pod kotorye vydelyaetsya i osvobozhdaetsya dinamicheski v kuche vozmozhno lyuboe sootnoshenie vidimosti i sushestvovaniya Peremennaya mozhet byt obyavlena i zatem inicializirovana togda obekt sootvetstvuyushij imeni fakticheski poyavitsya pozzhe vhozhdeniya v oblast vidimosti No obekt mozhet byt sozdan zaranee sohranyon i zatem prisvoen peremennoj to est poyavitsya ranshe To zhe i s udaleniem posle vyzova komandy udaleniya dlya peremennoj svyazannoj s dinamicheskim obektom sama peremennaya ostayotsya vidimoj no eyo znachenie ne sushestvuet a obrashenie k nemu privedyot k nepredskazuemym rezultatam S drugoj storony esli komanda udaleniya ne vyzvana to obekt v dinamicheskoj pamyati mozhet prodolzhat sushestvovat i posle togo kak ssylayushayasya na nego peremennaya vyshla iz oblasti vidimosti Dlya lokalnyh peremennyh so staticheskim klassom pamyati v yazykah Si i C znachenie poyavlyaetsya logicheski v moment zapuska programmy Pri etom imya nahoditsya v oblasti vidimosti tolko pri ispolnenii soderzhashej ego funkcii Prichyom v promezhutkah mezhdu funkciyami znachenie sohranyaetsya Avtomaticheskie v terminologii Si peremennye sozdavaemye pri vhode v funkciyu i unichtozhaemye pri vyhode sushestvuyut v period vremeni kogda ih imya vidno To est dlya nih vremena dostupnosti i sushestvovaniya prakticheski mozhno schitat sovpadayushimi PrimerySi Nachinaetsya globalnaya oblast vidimosti int countOfUser 0 int main S etogo momenta obyavlyaetsya novaya oblast vidimosti v kotoroj vidna globalnaya int userNumber 10 include lt stdio h gt int a 0 globalnaya peremennaya int main printf d a budet vyvedeno chislo 0 int a 1 obyavlena lokalnaya peremennaya a globalnaya peremennaya a ne vidna printf d a budet vyvedeno chislo 1 int a 2 eshe lokalnaya peremennaya v bloke globalnaya peremennaya a ne vidna ne vidna i predydushaya lokalnaya peremennaya printf d a budet vyvedeno chislo 2 PrimechaniyaSpecifikaciya yazyka HTML ot 4 dekabrya 2012 na Wayback Machine perevodchik A Piramidin intuit ru ISBN 978 5 94774 648 8 17 Lekciya Formy Oblasti vidimosti neopr Data obrasheniya 11 marta 2013 26 noyabrya 2019 goda
Вершина