Ёсць глабальныя зменныя зла ў Arduino?

Я адносна новым у праграмаванні, і многія з лепшых практык кадавання я эфектыўна чытання сцвярджаюць, што існуе вельмі мала прычын выкарыстоўваць глабальную зменную (або, што лепшы код не мае глобалам наогул).

Я зрабіў усё магчымае, каб захаваць гэта на ўвазе пры напісанні праграмнага забеспячэння, каб зрабіць Arduino інтэрфейс з SD-карты, звярніцеся да кампутара і запусціць кантролер рухавіка.

Я ў цяперашні час ёсць 46 глобалам для каля 1100 ліній «пачатковага ўзроўню» кода (ні адзін радок не маючы больш аднаго дзеяння). Гэта добрае суадносіны ці я павінен глядзець на скарачэнне яго больш? Акрамя таго, якія метады можна выкарыстоўваць, каб паменшыць колькасць Глобал далей?

Я пытаюся гэта тут, таму што я канкрэтна тычыцца перадавой практыкі кадавання на Arduino прадуктаў, а не камп'ютэрнага праграмавання ў цэлым.

20
@LookAlterno: <�я> "Я пазбягаю" і <�я> "Вы не можаце" </я> вельмі розныя рэчы.
дададзена аўтар James Hopkin, крыніца
Глабальныя зменныя на якасці Arduino менш зла, што на ПК. Я бачыў людзей, якiя абвяшчаюць зменную цыклу, я, як глабальная пераменная. ТВН Я стараюся пазбягаць іх, але яны маюць сваё месца ў кіраванні памяццю.
дададзена аўтар Thomas Myron, крыніца
@LookAlterno - Самая вялікая праблема з глабальнымі зменнымі бедныя праграмісты. Вы павінны перадаваць кожнае значэнне ў якасці аргументу (паспрабаваць захаваць яго менш чым 5), таму што compartmentalises кода і дазваляе для паўторнага выкарыстання. Капіраванне і функцыя злепвання ў праграмы вельмі лёгка, але толькі калі вы будзеце пазбягаць Глобал як мага больш. Яно таксама прадухіляе маналітныя функцыі, калі вы перадаеце ў 20 аргументах ў функцыю 2000 лініі, то вы павінны быць рэфактарынгу.
дададзена аўтар Thomas Myron, крыніца
На самай справе, некаторыя ўбудаваныя праграмісты забараніць лакальныя зменныя і патрабуюць глабальных зменных (або функцыі вобласці бачнасці статычныя зменныя) замест гэтага. Калі праграмы невялікія, гэта можа зрабіць яго лягчэй аналізаваць яго як простая дзяржаўную машыну; паколькі зменныя ніколі не перакрываюць адзін аднаго (г.зн., як яны складаюць і куча выдзеленых зменных).
дададзена аўтар Hououin Kyouma, крыніца
@LookAlterno Err, вы можаце не пісаць класы ў Ardunio, так як гэта проста C ++ з фантастычнымі макрасаў і бібліятэк? Калі так, то не кожная пераменная з'яўляецца глабальнай. І нават у C, гэта звычайна лічыцца найлепшай практыкай аддае перавагу праходзяць зменныя (магчыма, ўнутры структуру) у функцыю, а не якая мае глабальныя зменныя. Можа быць меней зручна для невялікай праграмы, але гэта, як правіла, разлічваецца як праграма становіцца ўсё больш і больш складана.
дададзена аўтар sarath, крыніца
У Arduino вы не можаце пазбегнуць глабальных зменных. Кожная пераменная дэкларацыя выходзіць за рамкі функцыі/метаду з'яўляецца глабальным. Так што, калі вам трэба падзяляць каштоўнасці паміж функцыямі, яны павінны быць Глобал, калі вы не хочаце, каб перадаць усе значэння ў якасці аргументу.
дададзена аўтар user31481, крыніца
@Muzer. Я выкарыстоўваю класы C ++ толькі для развіцця бібліятэкі, і, ну, вялікія праграмы. Я пазбягаю C ++ прычын.
дададзена аўтар user31481, крыніца
дададзена аўтар Brian, крыніца
@LookAlterno Гэта мірское труізм з C/C ++ (прастор імёнаў) нягледзячы, што не з'яўляецца спецыфічным для Arduino на ўсіх, і, як вы тады самі падалі, не з дапамогай якіх-небудзь сродкаў прыводзяць да высновы аб тым, што глабальныя зменныя нельга пазбегнуць; яны могуць, і часта павінны. Калі адказ на гэтае пытанне можа адрознівацца, калі платформа з'яўляецца Arduino не на ўзроўні мовы, а ў канструкцыі мадэляў, якія маюць сэнс на платформе і робяць яны Глобалы пажадана.
дададзена аўтар Not that Charles, крыніца
@Muzer ды, заўсёды думаў, што гэта апрацоўка. TIL
дададзена аўтар Sonic Splasher, крыніца
Статычныя і глабальныя зменныя маюць перавагу ведаючы спажыванне памяці падчас кампіляцыі. З Arduino, які мае вельмі абмежаваны аб'ём вольнай памяці, гэта можа быць перавагай. Гэта даволі лёгка для пачаткоўцаў, каб вычарпаць даступную памяць і вопыт без вестак няўдач.
дададзена аўтар mgpugne, крыніца
Эй All: Гэта ёсць шмат больш папулярным, чым чакалася. Я даведаўся шмат за апошнія 9 месяцаў, і хацеў бы зрабіць гэта як карысна «іншы мяне ў», як гэта магчыма. Ці будуць людзі цэняць гэта, калі я прыклаў гэты пост са спасылкамі на падручнікі/ідэі, якія дапамаглі мне, як пачатковец палепшыць мой код? Я да гэтага часу не 100% упэўнены ў edicate стэка біржы, таму я думаў, што спытаць 1-шы.
дададзена аўтар cocco, крыніца

8 адказы

Яны не з'яўляюцца зло самі па сабе, але яны, як правіла, атрымліваюць злоўжываюць, дзе няма ніякіх падставаў, каб выкарыстоўваць іх.

Ёсць шмат раз, калі глабальныя зменныя з'яўляюцца пераважнымі. Тым больш, што праграмаванне Arduino ёсць пад капотам, моцна адрозніваецца ад праграмавання кампутара.

Самае вялікае перавага для глабальных зменных з'яўляецца статычным размеркаваннем. Асабліва з буйнымі і складанымі зменнымі, такімі як асобнікі класаў. Дынамічнае размеркаванне (выкарыстанне новы і г.д.) неадабрэннем з-за недахопу рэсурсаў.

Акрамя таго, вы не атрымаеце ні аднаго дрэва выклікаў, як вы робіце ў звычайнай праграме C (адзіночны Асноўны() функцыі выкліку іншых функцый) - замест таго, каб вы эфектыўна атрымаць два асобных дрэў ( Налада() выкліку функцыі, то пятля() выкліку функцыі), што азначае, што часам глабальныя зменныя з'яўляюцца адзіным спосабам для дасягнення гэтай мэты (гэта значыць, калі вы хочаце выкарыстоўваць яго як у налада() і пятля() ).

Дык не, яны не зло, а на Arduino яны больш і лепш, чым выкарыстанне на ПК.

26
дададзена
Так, я слізгаў занадта хутка і сплаўляючы некаторыя заўвагі па пытанні аб непрымяненні класаў.
дададзена аўтар JaanusSiim, крыніца
Класы могуць быць вылучаныя стэк. Праўда, гэта не добра, каб змясціць вялікія асобнікі ў стэку, але ўсё ж.
дададзена аўтар JaanusSiim, крыніца
@JAB Усё, што можа быць выдзелена стэка.
дададзена аўтар Majenko, крыніца
У гэтым выпадку я б, верагодна, вызначыць іх у цыкле() (можа быць, як статычны , калі мне трэба ім захаваць сваю каштоўнасць праз ітэрацыі) і перадаваць іх праз параметры функцыі ўніз па ланцужку выклікаў.
дададзена аўтар Majenko, крыніца
Гэта адзін са спосабаў, або перадаць яго ў якасці спасылкі: несапраўднымі Foo (ідэалам & вар) {зменная = 4; } і Foo (п); - п цяпер 4.
дададзена аўтар Majenko, крыніца
Адна з прычын, якія я чуў, каб пазбегнуць глабальных зменных мае больш агульнага з сістэмай, выдатнай ад Arduino, глабальныя зменныя могуць быць схільныя знешніх, або за межамі самой праграмы. Гэта зацвярджэнне C ++ сцвярджае, што лепш. «Мова C не мае глабальнае ключавое слова. Зменныя, абвешчаныя па-за функцыі мае" аб'ём файла "азначае, што яны могуць бачыць у файл.» Гэта падвяргае пераменнае прастору для мадыфікуюцца па-за сферай дзеяння праграмы перад запускам, як і ў выпадку статыкі, дзе пераменнае файлавага прастору можна рэдагаваць перад запускам, ствараючы патэнцыйныя рызыкі для бяспекі
дададзена аўтар Clems, крыніца
Добра, я думаю, што я магу зрабіць гэта. Калі ў мяне ёсць (напрыклад) статычная пераменная п вызначаны ў пятля() . Калі я перадаць N для Foo (VAR) і Foo (VAR) I набор п = [новае значэнне] </код >. Ці трэба мне мець вяртання [новае значэнне] і ёсць п = [новае значэнне] у пятля() ?
дададзена аўтар cocco, крыніца
Добра, што, калі гэта нешта я толькі з выкарыстаннем у Петля() (ці ў некалькіх функцыях, выкліканых у цыклу() )? было б лепш, каб наладзіць іх па-іншаму, чым вызначэнне іх у пачатку?
дададзена аўтар cocco, крыніца
Факт адсутнасці сувязі магчымы паміж Налада() і пятля() гэта, само па сабе выдатная нагода, каб выкарыстоўваць больш стандартны ToolSuite і мець добры стары асноўны() або _Главная() кропка ўваходу.
дададзена аўтар Megatron, крыніца

Гэта вельмі цяжка даць адназначны адказ, не бачачы ваш фактычны код.

Глабальныя зменныя не зьяўляюцца злом, і яны часта маюць сэнс у укаранёных асяроддзе, у якой вы звычайна робіце шмат доступу да абсталявання. Ў вас ёсць толькі чатыры UARTS, толькі адзін порт I2C і г.д. Так што мае сэнс выкарыстоўваць Глобалы для зменных, прывязаных да канкрэтных апаратных рэсурсаў. І сапраўды, асноўная бібліятэка Arduino робіць гэта: Серыйная , Serial1 і г.д., з'яўляюцца глабальнымі зменныя. Акрамя таго, пераменная, якая прадстаўляе глябальны стан праграмы як правіла, з'яўляецца глабальным.

<�Р> Я ў цяперашні час ёсць 46 глобалам для каля 1100 радкоў кода []. Ці з'яўляецца гэта   добрае суадносіны [...]

Не пра ліках. Правільнае пытанне, які вы павінны спытаць сябе, для кожнага з гэтых Глобал, ці мае сэнс мець яго ў глабальным Аб'ём.

Тым не менш, 46 глабальнай здаецца трохі высокая для мяне. Калі некаторыя з іх трымаць пастаянны каштоўнасці, кваліфікаваць іх як Const : кампілятар звычайна аптымізуюць з яго захоўванне. Калі які-небудзь з гэтых пераменных выкарыстоўваецца толькі ўнутры аднаго функцыя, зрабіць яго лакальным. Калі вы хочаце яго значэнне захоўваецца паміж выклікамі функцыі, кваліфікаваць яго як статычны . Акрамя таго, можна паменшыць колькасць «бачных» глобалов шляхам групавання зменных разам ўнутры клас, і якія маюць адзін глабальны асобнік гэтага класа. Але зрабіць гэта толькі калі мае сэнс пакласці рэчы разам. Стварэнне вялікай GlobalStuff клас дзеля наяўнасці толькі адна глабальная зменная не дапаможа зрабіць ваш код больш зразумелым.

16
дададзена
Няма. <�Код> статычным толькі калі вам трэба, каб захаваць значэнне. Калі першае, што вы робіце ў функцыі ўсталяваць значэнне зменнай у бягучы час няма неабходнасці трымаць старое значэнне. Усё, што статычнае робіць у гэтай сітуацыі марнаваць памяць.
дададзена аўтар Phil Hannent, крыніца
Гэта вельмі добра акругленыя адказ, які выказвае абедзве пункту на карысць, і скепсіс, глобалов. +1
дададзена аўтар Not that Charles, крыніца
Добра, дзякуй за тлумачэнне.
дададзена аўтар cocco, крыніца
Добра! Я не ведаю, пра статычным , калі ў мяне ёсць пераменная, якая выкарыстоўваецца толькі ў адной функцыі, але атрымаць новае значэнне кожны раз, калі выклікаецца функцыя (напрыклад, вар = Millis() </код >) я павінен зрабіць, што статычны ?
дададзена аўтар cocco, крыніца

Асноўная праблема з глабальнымі зменнымі з'яўляецца падтрымка кода. Пры чытанні радкі коды, лёгка знайсці аб'яву пераменных, што перадаецца ў якасці параметру або абвешчаных лакальна. Гэта не так лёгка знайсці аб'яву глабальных зменных (часта гэта патрабуе і IDE).

Калі ў вас ёсць шмат глабальных зменных (40 ужо шмат), то становіцца цяжка мець відавочную імя, якое не занадта доўга. Выкарыстанне прасторы імёнаў з'яўляецца спосаб праясніць ролю глабальных зменных.

Бедны спосаб імітаваць прасторы імёнаў у З:

static struct {
    int motor1, motor2;
    bool sensor;
} arm;

На разведданых або працэсар рукі, доступ да глабальных пераменным адбываецца павольней, чым іншыя зменныя. Гэта, верагодна, супрацьлеглае па Arduino.

5
дададзена
На AVR, Глобалы на аператыўнай памяці, у той час як большасць нестатические мясцовыя вылучаюцца ў рэгістры працэсара, што робіць іх доступ хутчэй.
дададзена аўтар Sprogz, крыніца
Праблема на самай справе не знайсці дэкларацыі; будучы ў стане хутка зразумець код з'яўляецца важным, але ў канчатковым рахунку, другасным да таго, што яна робіць - і ёсць рэальная праблема знаходка, якая гарэза, у якім невядомая частка кода можа <�я> выкарыстоўваць глабальная дэкларацыя рабіць дзіўныя рэчы з аб'ектам, які вы пакінулі ў адкрытай для ўсіх, каб рабіць усё, што яны хочуць з.
дададзена аўтар Not that Charles, крыніца

Хоць я б не выкарыстоўваць іх пры праграмаванні для ПК, для Arduino яны маюць некаторыя перавагі. Большасць, калі яно ўжо было сказана:

    <�Літый> Няма дынамічнага выкарыстання памяці (стварэнне прабелаў у абмежаванай прасторы кучы з Arduino) </літый>
  • Даступна ўсюды, пры гэтым няма неабходнасці перадаваць іх у якасці аргументаў (які стаіць прасторы стэка)

Акрамя таго, у некаторых выпадках, асабліва прадукцыйнасць мудрая можа быць добра выкарыстоўваць глабальныя зменныя, замест таго каб ствараць элементы пры неабходнасці:

  • Для таго, каб паменшыць прабелы ў кучы прасторы
  • Дынамічна размеркавання і/або вызваленне памяці можа заняць значнае час
  • Зменныя могуць быць «паўторна», як спіс элементаў глабальнага спісу, якія выкарыстоўваюцца па некалькіх прычынах, напрыклад, адзін раз у якасці буфера для SD, а затым у якасці часовага буфера радкі.
5
дададзена

Як і ва ўсім (акрамя GOTOS, якія сапраўды зла) Глобал маюць сваё месца.

напрыклад Калі ў вас ёсць адладкі паслядоўны порт або лог-файл, які вам трэба быць у стане напісаць ад усюды, то часта мае сэнс зрабіць яго глабальным. Сапраўды гэтак жа, калі ў вас ёсць нейкая крытычная частка інфармацыі пра стан сістэмы, тое, што робіць яго глабальным часцяком з'яўляецца самым простым рашэннем. Там няма ніякага сэнсу ў тым, каб значэнне, якое вы павінны перайсці да кожнай функцыі ў праграме.

Як ужо сказаў 46, здаецца, шмат усяго крыху больш за 1000 радкоў кода, але не ведаючы падрабязнасьцяў пра тое, што вы робіце гэта цяжка сказаць, калі вы над іх выкарыстаннем ці не.

Аднак для кожнага глабальнага задаць сабе некалькі важных пытанняў:

Ці з'яўляецца імя выразным і канкрэтным, так што я не выпадкова спрабую выкарыстоўваць тое ж імя дзесьці яшчэ? Калі не змяніць назву.

Ці значыць гэта трэба калі-небудзь зменіцца? Калі няма, то разгледзець магчымасць зрабіць гэта канстантнасцю.

Ці трэба гэта быць бачная ўсюды, ці гэта толькі глабальны, так што значэнне захоўваецца паміж выклікамі функцый? Так лічу, што робіць яго лакальным для функцыі і з дапамогай статычнага ключавога слова.

Ці будзе рэчы сапраўды ўкруціць дрэнна, калі гэта атрымлівае зменены кавалак кода, калі я не будучы асцярожным? напрыклад калі ў вас ёсць два узаемазвязаных зменных, скажам, імя і нумар пасведчання асобы, якія з'яўляюцца глабальнымі (гл папярэдняе заўвага аб выкарыстанні глабальнай, калі вам патрэбна інфармацыя амаль усюды), то, калі адзін з іх атрымлівае зменены без іншых непрыемных рэчаў можа адбыцца. Так, вы маглі б проста быць асцярожным, але часам гэта добра, каб забяспечыць захаванне акуратнасці няшмат. напрыклад змясціць іх у іншы файл .c, а затым вызначыць функцыі, якія ўсталёўваюць іх абодвух у той жа час і дазваляюць чытаць іх. Вы толькі тады ўключаць функцыі ў адпаведным файле загалоўка, такім чынам астатнюю частку вашага кода можа атрымаць доступ толькі зменныя праз пэўныя функцыі, і таму не можа нарабіць. Гэта ў асноўным чыста з спосабам зрабіць тое, што з ++ класа дазволіць, але без таго, каб навучыцца вызначаць і ствараць класы, так што вы не вучыцеся занадта шмат за адзін раз.

- абнаўленне - я проста зразумеў, што вы спыталі аб Arduino канкрэтнай перадавой практыкі, а не агульнага кадавання і гэта больш агульнага кадавання адказу. Але, калі шчыра няма вялікай розніцы, добрая практыка, з'яўляецца добрай практыкай. <�Код> запуску() і пятля() структура Arduino азначае, што вы павінны выкарыстоўваць глобалам трохі больш, чым іншыя платформы, у некаторых сітуацыях, але гэта на самай справе не зменіцца, вы заўсёды ў канчатковым выніку імкнецца да лепшага вы можаце зрабіць у рамках абмежаванняў платформы незалежна ад таго, якая платформа.

4
дададзена
Калі вы думаеце, Гото 's злыя, праверыць код Linux. Можна сцвярджаць, што яны так жа зло, як Try ... Catch блокаў пры выкарыстанні ў якасці такіх.
дададзена аўтар nreich, крыніца
Я нічога не ведаю пра Arduinos але рабіць шмат настольных і развіццё сервера. Існуе адзін дапушчальнае выкарыстанне (ІМХО) для GoTo с і гэта вырвацца з укладзеных цыклаў, гэта значна чысцей і прасцей зразумець, чым альтэрнатыўныя варыянты.
дададзена аўтар sagelynaive, крыніца

Ці з'яўляюцца яны зло? Можа быць. Праблема з Глобал з'яўляецца тое, што яны могуць быць даступныя і зменены ў любы момант часу з дапамогай якой-небудзь функцыі або часткі коды выконваюцца, без абмежаванняў. Гэта можа прывесці да сітуацый, якія, скажам так, цяжка прасачыць і растлумачыць. Звядзенне да мінімуму колькасці Глобал, калі гэта магчыма прывядзенню сумы назад да нуля, таму пажадана.

Ці могуць яны ўцячы? Амаль заўсёды так. Праблема з Arduino ў тым, што яны прымушаюць вас у гэтым дзве функцыі падыходу, у якім яны мяркуюць, што Вы Налада() і вы пятля() . У дадзеным канкрэтным выпадку ў вас няма доступу да вобласці бачнасці функцыі выклікалай гэтых двух функцый (магчыма Асноўны() ). Калі ў вас, вы маглі б пазбавіць сябе ад усіх глобалов і выкарыстоўваць мясцовыя жыхары замест гэтага.

Уявіце наступнае:

int main() {
  setup();

  while (true) {
    loop();
  }
  return 0;
}

Гэта, верагодна, больш ці менш тое, што асноўная функцыя праграмы Arduino выглядае. Зменныя, якія неабходна як у налады() і пятля() функцыя будзе затым пераважна быць аб'яўлена ўнутры рамкі Асноўны() функцыя а не глабальны маштаб. Яны маглі б быць зроблены даступнымі для двух іншых функцый шляхам прапускання іх у якасці аргументаў (выкарыстання паказальнікаў, калі гэта неабходна).

Напрыклад:

int main() {
  int myVariable = 0;
  setup(&myVariable);

  while (true) {
    loop(&myVariable);
  }
  return 0;
}

Звярніце ўвагу, што ў гэтым выпадку вам таксама неабходна змяніць подпіс абедзвюх функцый.

Як гэта можа быць не ўяўляецца магчымым, ні пажаданымі, я бачу, на самай справе толькі адзін спосаб, каб выдаліць большасць Глобал з праграмы Arduino без змены навязаў структуру праграмы.

Калі я правільна памятаю, вы выдатна можаце выкарыстоўваць C ++ пры праграмаванні для Arduino, а не С. калі вы не знаёмыя (пакуль) з ААП (аб'ектна-арыентаванае праграмаванне) або C ++, гэта можа заняць некаторы час, каб прывыкнуць і некаторы чытанне.

Мая прапанова было б стварыць клас праграмы і стварыць адзіны глабальны асобнік гэтага класа. Клас варта разглядаць як план аб'ектаў.

Разгледзім наступны прыклад праграмы:

class Program {
public:      
  Program();

  void setup();
  void loop();

private:
  int myFirstSampleVariable;
  int mySecondSampleVariable;
};

Program::Program() :
  myFirstSampleVariable(0),
  mySecondSampleVariable(0)
{

}

void Program::setup() {
 //your setup code goes here
}

void Program::loop() {
 //your loop code goes here
}

Program program;//your single global

void setup() {
  program.setup();
}

void loop() {
  program.loop();
}

Вуаля, мы пазбавіліся ад амаль усіх Глобал. Функцыі, у якіх вы б пачаць дадаваць логіку прыкладання былі б Праграма :: Налада() і Праграма :: цыкл() функцыі. Гэтыя функцыі маюць доступ да экземпляра канкрэтных зменных членаў myFirstSampleVariable і mySecondSampleVariable у той час як традыцыйны Налада() і пятля() </код > функцыя не мае доступу, паколькі гэтыя зменныя былі адзначаны клас прыватных. Гэтая канцэпцыя называецца інкапсуляцыя дадзеных або дадзеныя утойванне.

Навучанне вам ООП і/або C ++ трохі выходзіць за рамкі адказу на гэтае пытанне, так што я буду спыняцца тут.

Падводзячы вынік: Глобал варта пазбягаць, і гэта амаль заўсёды можна рэзка паменшыць колькасць Глобал. Акрамя таго, калі вы программируете для Arduino.

Самае галоўнае, я спадзяюся, што мой адказ некалькі карысным для вас :)

3
дададзена
Ну, гэта ўсё ж такі глабальнае стан, якое можна атрымаць у любым месцы ў праграме, вы проста атрымаць доступ да яго праз Праграма :: асобнік (). Налада() замест globalProgram.setup() </код >. Ўвод звязаных глабальных зменных у адзін клас/структуры/прастору імёнаў можа быць карысным, асабліва, калі яны толькі неабходныя некалькі звязаных функцый, але шаблон Сінглтан ня дадае нічога. Іншымі словамі статычныя праграмы Р; мае глабальнае захоўванне i статычную праграму & асобнік() мае глабальны доступ, які зводзіцца да таго ж, як проста globalProgram праграмы; </код >.
дададзена аўтар Tomas Andrle, крыніца
Одноплодной фактычна з'яўляецца глабальных, проста апранутым ў дадатковым заблытаным спосабе. Ён мае тыя ж недахопы.
дададзена аўтар Tomas Andrle, крыніца
Вы можаце вызначыць свой уласны Main() у эскізе, калі вы аддаеце перавагу. Гэта тое, што запас адзін выглядае наступным чынам: github.com/arduino/Arduino/blob/1.8.3/hardware/arduino/avr/…
дададзена аўтар per1234, крыніца
@patstew Вы не пярэчыце, тлумачачы мне, як вы адчуваеце, што мае тыя ж недахопы? На мой погляд, гэта не так як вы можаце выкарыстоўваць інкапсуляцыю дадзеных у вашу карысць.
дададзена аўтар gebeyaw, крыніца
@ Per1234 Дзякуй! Я не буду вызначана не Arduino эксперта, але я мяркую, маё першае прапанова можа працаваць і тады.
дададзена аўтар gebeyaw, крыніца
@patstew я не думаю пра гэта такім чынам. Я думаю, што вы маеце рацыю. Я змяню сваю пасаду. Гэта зробіць яго больш лёгка зразумець таксама.
дададзена аўтар gebeyaw, крыніца
@Graham Мне цікава даведацца, якія дысцыпліны вы кажаце? Я думаю, у мяне ёсць ідэя, што вы кажаце, але дысцыпліна не збіраецца ствараць «добра інкапсуляванага код». Ўзор аксессора/мутатор часам прыходзіць з невялікім коштам прадукцыйнасці, у залежнасці ад таго, як вы ўсталявалі код, пагадзіўся. Тым не менш, многія дарагія аперацыі могуць быць аптымізаваныя шляхам кампілятарам.
дададзена аўтар gebeyaw, крыніца
Як даўні ўбудаваны кадавальнік, я даволі рэгулярна даводзіцца навучаць людзей <�я> з правіла чыгунны «глабальных зменных Bad». Перадача аргументаў <�я> заўсёды </я> робіць код больш павольна. На ПК гэта ў значнай ступені неістотнае, але ва ўбудаваным свеце гэта ўсё яшчэ вельмі вялікую справу. Мадэлі аксессора/мутатор з'яўляецца спосабам гарантаваць гукавую інкапсуляцыю за кошт часу апрацоўкі. Гэта цалкам магчыма, каб напісаць добра інкапсуляванага код з глабальнымі зменнымі - але вы павінны ўжываць дысцыпліну, як вы яго дызайн, а таксама пазначыць ясна, як іншыя людзі павінны выкарыстоўваць яго.
дададзена аўтар Maxim Krizhanovsky, крыніца

Глабальныя зменныя ніколі не зло . Агульнае правіла супраць іх проста мыліца, каб дазволіць вам выжыць досыць доўга, каб атрымаць вопыт, каб прымаць больш абгрунтаваныя рашэнні.

Які глабальная пераменны, неад'емнае здагадку, што існуе толькі адна з рэчаў (гэта не мае значэння, калі мы гаворым пра глабальнае масіве або карце, якая можа ўтрымліваць некалькі рэчаў, якія да гэтага часу ўтрымлівае здагадка аб тым, што існуе толькі адзін напрыклад спіс або адлюстраванне, і ня некалькі незалежных з іх).

Таму, перш чым выкарыстоўваць у глабальным, вы хочаце спытаць сябе: мажліва, што я калі-небудзь захачу выкарыстоўваць больш чым адзін з гэтай рэчы? Калі гэта апынецца праўдай ўніз лініі, вы павінны змяніць код ААН-глабалізаваным гэтую рэч, і вы, верагодна, высветліць, па шляху, што і іншыя часткі вашага кода залежаць ад гэтай здагадкі аб адзінасці, так што вы будзе мець, каб выправіць іх, а таксама, і працэс становіцца стомным і схільнымі памылак. "Не выкарыстоўвай Глобал» выкладаюцца, таму што, як правіла, гэта даволі невялікі кошт, каб пазбегнуць Глобал з самага пачатку, і ён пазбягае патэнцыялу, каб плаціць вялікую цану пазней.

Але якія спрашчаюць здагадкі, што Глобалы таксама дазваляюць зрабіць код менш, хутчэй і выкарыстоўваць менш памяці, таму што ён не павінен абысці паняцце якога рэч ён выкарыстоўвае, не павінны рабіць вакольныя, не павінны разгледзець магчымасць жаданай рэчы, магчыма, не існую і г.д. на укаранёных вы больш верагодна, будзе абмежаваная па памеры коды і/або час цэнтральнага працэсара і/або памяці, чым вы на ПК, так што гэтая эканомія можа мець значэнне. І многія убудаваныя прыкладанні маюць вялікую жорсткасць у патрабаваннях - вы ведаць , што ваш чып мае толькі адзін з пэўных перыферыйных, карыстальнік можа не проста падключыць яшчэ адзін у порт USB ці нешта.

Яшчэ адна распаўсюджаная прычына для жадаючых больш, чым адна з чагосьці, што здаецца унікальным, тэставанне - тэставанне ўзаемадзеяння паміж двума кампанентамі лягчэй, калі вы можаце проста перадаць асобнік тэставання некаторага кампанента да функцыі, у той час як спрабуе змяніць паводзіны глабальнай складнікам з'яўляецца хітрэй прапанову. Але тэставанне ва ўбудаваным свеце, як правіла, моцна адрозніваецца ад іншых, так што гэта не можа ставіцца да вас. Наколькі я ведаю, Arduino не мае тэставую культуру наогул.

Так ісці наперад і выкарыстоўваць глобалам, калі яны, здаецца, варта. Код паліцыі не прыйдзе, і вы атрымаеце. Проста ведайце, што няправільны выбар можа прывесці да значна больш працы для вас ўніз па дарозе, так што калі вы не ўпэўненыя ...

2
дададзена
<�Р> глабальныя зменныя Зла ў Arduino?

нішто не з'яўляецца па сваёй прыродзе злы, у тым ліку і глабальных зменных. Я б ахарактарызаваў яго як «непазбежнае зло» - гэта можа зрабіць вашу жыццё нашмат прасцей, але варта падыходзіць з асцярожнасцю.

<�Р> Акрамя таго, якія метады можна выкарыстоўваць, каб паменшыць колькасць глобалов далей?

выкарыстоўваць функцыі абалонкі для доступу да глабальных пераменным. так што вы па крайняй меры, кіруеце яго з пункту гледжання вобласці бачнасці.

0
дададзена
Пры выкарыстанні функцыі абалонкі для доступу да глабальных пераменным, вы можаце таксама змясціць зменныя ўнутры гэтых функцый.
дададзена аўтар nreich, крыніца