Ардуинодағы жаһандық айнымалылар жаман ма?

Мен бағдарламалау кезінде салыстырмалы түрде жаңа болып табыламын және оқып жатқан жақсы кодтау әдістерінің көпшілігі жаһандық айнымалы мәнді пайдаланудың өте жақсы себептері бар екенін дәлелдейді (немесе ең жақсы кодтың ешқандай глобальды болмауы).

Мен Ардуино интерфейсін SD-картамен жасауға, компьютермен әңгімелесуге және қозғалтқышты басқаруға арналған бағдарламаны жазғанда, мен оны есте ұстау үшін бар күшімді жасадым.

Мен қазіргі уақытта шамамен 1100 сызыққа арналған «бастауыш деңгей» кодына 46 глобальды (бірден көп әрекеті жоқ сызық). Бұл жақсы арақатынас ма, әлде оны азайтуға қарап ма? Сонымен қатар, жаһандық сандарды азайту үшін қандай практиканы қолдануға болады?

Мен мұнда сұраймын, себебі мен компьютерде бағдарламалаудан гөрі, Arduino өнімдерін кодтау бойынша озық тәжірибелерге ерекше көңіл бөлемін.

20
@LookAlterno: «Мен аулақ боламын» және «мүмкін емес» - әр түрлі нәрселер.
қосылды автор James Hopkin, көзі
Ардуинодағы жаһандық айнымалы мәндер ДК-дегідей жаман емес. Мен айнымалы айнымалыны жариялайтын адамдарды көрдім, i, ғаламдық айнымалы ретінде. ТББ мен оларды болдырмауға тырысамын, бірақ оларда жадты басқаруда орын бар.
қосылды автор Thomas Myron, көзі
@LookAlterno - Жаһандық айнымалылармен ең үлкен мәселе нашар программистер. Әрбір мәнді аргумент ретінде (5-тен кем ұстап көріңіз), өйткені бұл кодты бөліп, қайта пайдалануға мүмкіндік береді. Көшіру және қою функцияларын бағдарламаларға біріктіру оңай, бірақ егер сіз мүмкіндігінше жаһандық деңгейден аулақ болсаңыз. Ол сондай-ақ монолитті функцияларды болдырмайды, егер сіз 20 аргумен 2000 желі функциясына өтсеңіз, онда сіз оны қайта жоспарлауыңыз керек.
қосылды автор Thomas Myron, көзі
Шын мәнінде, кейбір енгізілген бағдарламашылар жергілікті ауыспалыларға тыйым салады және орнына жаһандық айнымалы мәндерді (немесе функцияның ауқымды статикалық айнымалы мәндерін) талап етеді. Бағдарламалар кішкентай болғанда, оны жай қарапайым машина ретінде талдауды жеңілдетуге болады; өйткені айнымалы мәндер бір-біріне үстінен жазылмайды (яғни, олар стек пен бөлінген айнымалылар сияқты).
қосылды автор Hououin Kyouma, көзі
@LookAlterno Err, сіз Ardunio-де сабақ жаза алмайсыз ба? Егер солай болса, әрбір айнымалы мән жаһандық емес. Және тіпті С-да, әдетте айнымалы мәндерді (мүмкін, ішіндегі құрылымдар) жаһандық айнымалыларға емес, функцияларға айналдыруды таңдауға арналған ең жақсы тәжірибе деп саналады. Кішігірім бағдарламаға қолайлы болуы мүмкін, бірақ бағдарлама үлкен әрі күрделі болғандықтан, әдетте төленеді.
қосылды автор sarath, көзі
Ардуинода сіз жаһандық айнымалылардан аулақ бола алмайсыз. Әрбір айнымалы декларация функцияның/әдісінің шеңберінен тыс жаһандық болып табылады. Мәселен, функциялардың арасында құндылықтарды бөлісу қажет болса, олар әр мәнді дәлел ретінде бергіңіз келмейінше, олар жаһандық болу керек.
қосылды автор user31481, көзі
@Muzer. Мен C ++ сабақтарын тек кітапхананы дамыту үшін, сонымен қатар үлкен бағдарламаларды қолданамын. Мен C ++-тан себептерден аулақ боламын.
қосылды автор user31481, көзі
қосылды автор Brian, көзі
@LookAlterno Бұл Arduino-ға мүлдем жатпайтын C/C ++ (аттар кеңістігіне қарамастан) шын мәніндегі шындықты және сіз көрсеткендей, ешқандай жағдайда ғаламдық айнымалылардан аулақ болу мүмкін емес деген қорытындыға әкелмейді; олар жиі болуы керек. Платформа Arduino болғанда, бұл сұраққа жауап әртүрлі болуы мүмкін, мұнда тіл деңгейінде емес, платформаға мағынасы бар және олар жаһандық тілектерді қажет ететіндей етіп жасайтын құрылымдық үлгілерде.
қосылды автор Not that Charles, көзі
@Muzer huh, әрқашан бұл Processing болды деп ойлады. TIL
қосылды автор Sonic Splasher, көзі
Статикалық және жаһандық айнымалы мәндер компиляция уақытында жадты пайдалануды білу артықшылығын ұсынады. Ардуино өте шектеулі жады бар, бұл артықшылығы болуы мүмкін. Жаңа бастағандарға қол жетімді жадты сарқып, қиындықсыз ақауларға кезігу оңай.
қосылды автор mgpugne, көзі
Hey All: Бұл күтілгеннен әлдеқайда танымал болды. Мен соңғы 9 айда көп нәрсені үйрендім және бұл мүмкіндікті мүмкіндігінше «басқаларым» үшін пайдалы деп санаймын. Мен бұл лауазымға жаңадан бастаған коды жақсартуға көмектесті оқулықтар/идеяларға сілтемелермен қоссам, адамдар оны бағалайтын ба? Мен стака биржасының иығына 100% сенімді емеспін, сол себепті мен 1 сұрағым келеді деп ойладым.
қосылды автор cocco, көзі

8 жауаптар

Олар « жамандық емес емес, бірақ оларды пайдаланудың ешқандай негізі болмаған жағдайда артық пайдаланылады.

Әлемдік айнымалылар тиімді болған кезде бірнеше рет бар. Әсіресе, Arduino бағдарламалау бағдарламасында, сорғыш астында, компьютерді бағдарламалауға мүлдем өзгеше.

Ғаламдық айнымалыларға ең үлкен пайда статистикалық бөлу болып табылады. Әсіресе үлкен және күрделі айнымалылар сияқты сынып даналары. Динамикалық бөлу ( new және т.б. пайдалану) ресурстардың жетіспеушілігінен басталды.

Сондай-ақ, сіз қалыпты С бағдарламасында (басқа функцияларды шақыратын жалғыз main() функциясы сияқты) бірдей қоңырау шырымын ала алмайсыз - орнына сіз екі түрлі ағаштарды ( setup() қоңырау функцияларын, содан кейін loop() қоңырау функцияларын), яғни кейде жаһандық айнымалы мәндер сіздің мақсатыңызға жетудің жалғыз жолы (яғни, оны setup() және loop() ).

Жоқ, олар зұлымдық емес, және Arduino-да олар компьютерден гөрі көп пайдаланады.

26
қосылды
Дұрыс, мен тым тез ойластырылып, сабақтарды қолданбау туралы мәселе бойынша түсініктемелердің кейбірін түсіндірдім.
қосылды автор JaanusSiim, көзі
Сыныптар стек бөлінген болуы мүмкін. Әрине, үлкен дестелерді стакаға қою дұрыс емес, бірақ бәрібір.
қосылды автор JaanusSiim, көзі
@JAB Кез келген бума бөлінген болуы мүмкін.
қосылды автор Majenko, көзі
Бұл жағдайда оларды циклда() анықтауға болады (егер мен оларды итерациялар арқылы олардың мәнін сақтап қалу үшін қажет болса static ) және оларды қоңырау тізбегіндегі функция параметрлері арқылы өткізуге болар еді.
қосылды автор Majenko, көзі
Бұл бір жол немесе сілтеме ретінде: void foo (int & var) {var = 4; } және foo (n); - n енді 4 болып табылады.
қосылды автор Majenko, көзі
Әлемдік айнымалы мәндерден аулақ болуды естіген себептердің бірі Arduino-ден басқа жүйеге байланысты, Жаһандық айнымалылар сыртқы бағдарламаға немесе бағдарламаның өзінен тыс жерде болуы мүмкін. Бұл C ++ мәлімдемесі жақсы деп белгілейді. «С тілінде жаһандық кілт сөз жоқ, функциядан тыс жарияланған айнымалылар» файл ауқымы «бар, яғни олар файл ішінде көрінеді.» Бұл өзгермелі кеңістікті іске қосылмай тұрып, бағдарламаның ауқымынан тыс өзгертуге мүмкіндік береді, мысалы, файл айнымалысы орыны жұмыс істемей тұрып, ықтимал қауіпсіздік қатерлерін тудыратын статикалық жағдайлар болған жағдайда
қосылды автор Clems, көзі
Жақсы, мен мұны істей аламын деп ойлаймын. loop() ішінде анықталған static var n болса (мысалы). foo (var) және foo (var) ішіне n өтетін болсам, n = [жаңа мән] . [new value] қайтару керек және loop() ішіндегі n = [new value] керек пе?
қосылды автор cocco, көзі
Жақсы, егер мен тек loop() (немесе loop() деп аталатын бірнеше функцияларда) пайдаланатын нәрсе болса не болады? оларды бастапқыда анықтаудан гөрі оларды басқа жолмен орнату жақсы болар ма еді?
қосылды автор cocco, көзі
setup() және loop() арасындағы ешқандай байланыс болмайды, ол өзі үшін стандартты құралдарды пайдаланудың жақсы себебі және жақсы ескі негізгі() немесе _main() енгізу нүктесі.
қосылды автор Megatron, көзі

Сіздің көзіңізді көрмей, нақты жауап беру өте қиын нақты код.

Жаһандық айнымалылар зұлымдық емес, олар жиі енгізілгенде мағынасы бар әдетте аппараттық құралдарды қолжетімді ететін орта. Сенде бар тек төрт UARTS, тек бір I2C порты және т.с.с. айнымалы мәндерге арналған жаһандықтар нақты аппараттық ресурстарға байланысты. Және, шынында да, Arduino негізгі кітапханасы: Serial , Serial1 және т.б. айнымалылар. Сондай-ақ, бағдарламаның жаһандық жағдайын білдіретін айнымалы әдетте жаһандық болып табылады.

Менде қазіргі уақытта шамамен 1100 жолға [код] 46 глобаль бар. Бұл а   жақсы ара [...]

Сандар туралы емес. Өзіңізден сұрайтын дұрыс сұрақ: осы жаһандықтардың әрқайсысы үшін оны жаһандық деңгейде ұстап тұруға бола ма? ауқымы.

Дегенмен, 46 жаһандық, меніңше, біршама жоғары. Егер олардың кейбірі тұрақты болса мәндерді const деп сәйкестендіреді: компилятор әдетте оңтайландырылады оларды сақтау. Егер осы айнымалылардың кез-келгені тек біреуінде қолданылса функцияны жергілікті етеді. Егер оның мәні қоңыраулар арасында қалуын қаласаңыз функцияға оны static ретінде сәйкестендіріңіз. Сіз сондай-ақ азайта аласыз айнымалы мәндерді бір-бірімен топтастыру арқылы «көрінетін» жаһандық сандар класс, және осы сыныптың бір жаһандық данасы бар. Бірақ мұны тек қана материалды біріктіру мағынасы бар. Үлкен GlobalStuff класын жасау бір ғана жаһандық айнымалы болуы үшін сізге көмектеспейді код анық.

16
қосылды
Жоқ. static мәнді сақтау қажет болғанда ғана. Егер функцияда бірінші болып айнымалы мән ағымдағы уақытқа орнатылған болса, ескі мәнді сақтаудың қажеті жоқ. Осы статистикалық жағдайдың бәрі жадты ысырап етеді.
қосылды автор Phil Hannent, көзі
Бұл жаһандық деңгейде екі жағы да, скептицизмді білдіретін өте жан-жақты жауап. +1
қосылды автор Not that Charles, көзі
Жақсы, түсініктеме бергеніңіз үшін рахмет.
қосылды автор cocco, көзі
Жарайды ма! Егер менде тек бір функцияда ғана пайдаланылатын айнымалы болса, бірақ функция шақырылған сайын жаңа мәнді алуға болатын болса, static туралы білмедім ( var = millis() ) static жасау керек пе?
қосылды автор cocco, көзі

Жаһандық айнымалылармен басты мәселе - кодты күтіп ұстау. Кодың жолын оқығанда, параметр ретінде берілген немесе жергілікті түрде жарияланған айнымалылардың декларациясын табу оңай. Әлемдік айнымалылардың декларациясын табу оңай емес (жиі талап етіледі және IDE).

Көптеген жаһандық айнымалылар болғанда (40-ы қазірдің өзінде көп), тым ұзын емес айқын атауға ие болу қиынға соғады. Аттар кеңістігін пайдалану - жаһандық айнымалылардың рөлін түсіндіру тәсілі.

С атау кеңістігін имитациялаудың кедей жолы:

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

Intel немесе қол процессорында жаһандық айнымалыларға қол жеткізу басқа айнымалыларға қарағанда баяуырақ. Бұл ардуинодағы керісінше болуы мүмкін.

5
қосылды
AVR бойынша жаһандық желілер ЖЖҚ-да, ал статистикалық емес жергілікті тұрғындар процессорлар регистрлеріне бөлінеді, бұл олардың қолжетімділігін тездетеді.
қосылды автор Sprogz, көзі
Мәселе шын мәнінде декларацияны табу емес; кодын тез түсіну қабілеті маңызды, бірақ сайып келгенде қайталама болып табылады - және нақты мәселе - кодының белгісіз бөлігі пайдалануға жаһандық декларацияны жасауға қабілетті екендігін анықтау заттардың бәрі ашық болғандықтан, олар қалаған нәрсені жасайды.
қосылды автор Not that Charles, көзі

ДК үшін бағдарламалау кезінде оларды пайдаланбайтын болсам да, Arduino үшін олардың кейбір артықшылықтары бар. Көп жағдайларда айтылған болса:

  • Динамикалық жадты пайдалану жоқ (Arduino-дің шектелген кеңістіктегі бос орындарын жасау)
  • Барлығында қол жетімді, сондықтан оларды аргументтер ретінде берудің қажеті жоқ

Сондай-ақ, кейбір жағдайларда, әсіресе өнімділікпен, қажет болғанда элементтерді жасаудың орнына жаһандық айнымалыларды пайдалану жақсы болуы мүмкін:

  • Кеңістіктегі бос орындарды азайту үшін
  • Жадты динамикалық түрде бөлу және/немесе босату айтарлықтай уақытты талап етеді
  • Көптеген себептер бойынша пайдаланылатын жаһандық тізім элементтерінің тізімі сияқты айнымалы мәндерді қайта пайдалану мүмкін, мысалы: SD үшін буфер ретінде, кейінірек уақытша аралық буфер ретінде.
5
қосылды

Қалай болғанда да (голостан басқа, шын мәнінде жаман) глобалдардың орны бар.

мысалы, Егер сізде кез-келген жерден жазу мүмкіндігіне ие болса, онда сіз оны жаһандық ету үшін жиі пайда болады. Сол сияқты сізде жүйелік мәртебе туралы кейбір мәліметтер бар болса, оны ғаламдық ету жиі ең оңай шешім болып табылады. Бағдарламада әрбір функцияға өтуге болатын мәнге ие болудың ешқандай мәні жоқ.

Басқалар айтқандай, 46-нің 1000-нан астам сызығы бар, бірақ сіз істеп жатқан нәрселер туралы білмей-ақ, сіз оларды қолданып жатсаңыз немесе айтамыз деп айту қиын.

Алайда әрбір жаһандық өзіңізге бірнеше маңызды сұрақ қойыңыз:

Мен атауды басқа бір жерде қолдануға тырыспайтыным үшін, атау айқын және нақты ме? Егер атау өзгермесе.

Мұның бәрі өзгеруі керек пе? Егер олай болмаса, оны конструктивтеуді қарастырыңыз.

Бұл функционалдық қоңыраулар арасындағы мәнді сақтау үшін, бұл тек қана жаһандық емес пе? Бұл функцияны функцияға жергілікті түрде жасап, кілт сөзді статистикалық пайдалануды қарастырыңыз.

Егер абай бола алмасаңыз, кодының бөлігімен өзгеретін болса, шын мәнінде жаман нәрсе істей ме? мысалы, егер сізде екі айнымалы айнымалы болса, атын және идентификаторын жаһандық (айталық, барлық жерде деректі қажет болған кезде жаһандық пайдалану туралы алдыңғы ескертуді қараңыз), егер олардың біреуі басқа жаман нәрселер болмаса, өзгеруі мүмкін. Ия, абай болу керек, бірақ кейде мұқият болуға тырысыңыз. мысалы, оларды басқа .c файлына қойып, екеуін бір уақытта орнатқан және оларды оқуға мүмкіндік беретін функцияларды анықтаңыз. Содан кейін ғана сіз өзіңіздің кодының қалған бөлігі айнымалы мәндерді белгілі функциялар арқылы ғана қолдана алады және осылайша шатастырмауыңыз мүмкін. Бұл, негізінен, c ++ класын жасауға мүмкіндік беретін таза әдіс болып табылады, бірақ сабақты анықтау және үйренудің қажеті жоқ, сондықтан сіз бірден үйреніп жатқан жоқсыз.

- Жаңарту - Мен сізді Arduino-дің жалпы кодтаудан гөрі ең үздік тәжірибе туралы сұрағанын түсіндім және бұл жалпы кодтауға көп жауап. Бірақ, шынында да, ешқандай айырмашылық жоқ, жақсы тәжірибе жақсы тәжірибе. Arduino-дің startup() және loop() құрылымы кейбір жағдайларда кейде басқа платформалардан глобаллерді пайдалану керек дегенді білдіреді, сіз платформаның қандай болмасын, платформаның шектеулері аясында жасай алатын ең жақсы мүмкіндіктерді әрдайым мақсат етіп отырасыз.

4
қосылды
goto деп ойласаңыз, зұлымдық, Linux кодын тексеріңіз. Мүмкін, олар пайдаланылған кезде try ... catch блоктары сияқты жаман сияқты.
қосылды автор nreich, көзі
Мен Arduinos туралы ештеңе білмеймін, бірақ көптеген жұмыс үстелін және серверді дамыту. goto үшін бір қолайлы пайдалану (IMHO) бар және бұл кірістірілген циклдардан шығу, бұл баламадан гөрі түсінікті және түсінікті.
қосылды автор sagelynaive, көзі

Олар зұлымдық ма? Мүмкін. Глобальды проблема кез-келген уақытта кез-келген нүктеде кез-келген функциямен немесе код бөлігімен шектеусіз қол жеткізуге және өзгертуге болады. Бұл жағдайды тудыруы мүмкін, айталық, артта және түсіндіру қиын. Мүмкіндігінше, бұл соманы нөлге дейін жеткізе отырып, жаһандық соманы азайту қажет.

Олардан аулақ бола аласың ба? Барлығына дерлік иә. Arduino проблемасы сізді setup() деп қабылдайтын және сіз loop() деп қабылдайтын сізді осы екі функционалдық тәсілге мәжбүрлейді. Бұл жағдайда сізде осы екі функцияның қоңырау шалу функциясының ауқымы (мүмкін, main() )) болмайды. Егер сізде болсаңыз, сіз барлық глобалдіктерден құтылуға және орнына жергілікті тұрғындарға қолдана аласыз.

Төмендегі суретті қараңыз:

int main() {
  setup();

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

Бұл, әрине, Arduino бағдарламасының басты функциясының неге ұқсайтыны. setup() және loop() функциясындағы қажет айнымалылар, одан кейін main() функциясының аумағында жарияланатын болады ғаламдық ауқаттан гөрі емес. Одан кейін оларды басқа екі функцияға дәлел ретінде беру арқылы (қажет болғанда көрсеткіштерді қолданумен) қол жеткізуге болады.

Мысалға:

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

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

Бұл жағдайда екі функцияның қолтаңбасын да өзгерту қажет.

Бұл мүмкін болмауы мүмкін, себебі мен бағдарламаның құрылымына мәжбүрлеп өзгертместен Arduino бағдарламасынан көптеген жаһандықтарды жоюдың бір ғана әдісін көремін.

Егер дұрыс есімде болсаңыз, сіз C ++ бағдарламасын C бағдарламасына бағдарламалау кезінде қолдана алсаңыз, C-ға емес, сіз OOP (Object Oriented Programming) немесе 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();
}

Воля, біз барлық глобалдіктерден құтылдық. Бағдарлама логикасын қосуды бастайтын функциялар Program :: setup() және Program :: loop() функциялары болады. Бұл функциялардың мысалы, myFirstSampleVariable және mySecondSampleVariable сияқты дәстүрлі setup() және loop() Бұл функциялар айнымалы сыныптар жеке сынып ретінде белгіленбегендіктен, функциялары жоқ. Бұл ұғым

деректерді инкапсуляциялау немесе деректерді жасыру деп аталады.

Сізге OOP және/немесе C ++ үйрету бұл сұрақтың жауабынан аздап, осында тоқтаймын.

Қорытындылай келе, жаһандықты болдырмау керек және бұл жаһандық ауқымды түбегейлі түрде әрдайым азайтуға болады. Сондай-ақ, Arduino бағдарламалау кезінде.

Ең бастысы менің жауапым сізге пайдалы болады деп үміттенемін :)

3
қосылды
Бағдарламаның кез келген жеріне қол жеткізуге болатын жаһандық мемлекет жай ғана globalProgram.setup() орнына Program :: instance (). Setup() арқылы қол жеткізе аласыз. >. Байланысты ғаламдық айнымалы мәндерді бір сыныпқа/құрылымға/аттар кеңістігіне енгізу, әсіресе, олар тек бірнеше қатысты функцияларға қажет болса, пайдалы болуы мүмкін, бірақ синглтон үлгісі ештеңе қосады. static бағдарлама p; жаһандық сақтауға ие және static Program & instance() жалпыға қолжетімділікке ие, бұл қарапайым Program globalProgram .
қосылды автор Tomas Andrle, көзі
Синглон - бұл тиімді, жаһандық, жаңадан шатастыратын әдіс. Онда бірдей құлдырау бар.
қосылды автор Tomas Andrle, көзі
Сіз қаласаңыз, нобайдағы өзіңіздің негізгі() мәніңізді анықтай аласыз. Бұл акцияның көрінісі: github.com/arduino/Arduino/blob/1.8.3/hardware/arduino/avr/…
қосылды автор per1234, көзі
@patstew Қалай ойлайсыз, ол дәл осындай төмендейді деп ойлайсыз ба? Менің ойымша, бұл деректерді инкапсуляцияны сіздің пайдаңызға қарай пайдалана алмайсыз.
қосылды автор gebeyaw, көзі
@ per1234 Рахмет! Мен, әрине, Arduino сарапшысы емеспін, бірақ менің бірінші ұсынысым сонда жұмыс істей алады деп ойлаймын.
қосылды автор gebeyaw, көзі
@patstew Мен осылай ойлаған емеспін. Сіз дұрыс деп ойлаймын. Мен өз лауазымымды өзгерте аламын. Бұл түсіну оңайырақ болады.
қосылды автор gebeyaw, көзі
@Graham Сіз туралы қандай тәртіп туралы сөйлескеніңізді білгім келеді? Менің ойымша, мен сіз туралы не айтасыз деп ойлаймын, бірақ тәртіп «жақсы кодталған кодексті» жасамайды. Accessor/mutator үлгісі кейде кодын реттегеніңізге байланысты төменгі өнімділік шығындарымен бірге келеді. Алайда, көптеген қымбат операцияларды компилятор арқылы оңтайландыруға болады.
қосылды автор gebeyaw, көзі
Ұзақ уақыт бойы енгізілген кодер ретінде мен «Global Variables Bad» шойын ережесін адамдардан үйренуге тиіспін. әрдайым аргументтерін өту кодты жасайды. ДК-де бұл өте маңызды емес, бірақ ендірілген әлемде бұл өте үлкен мәміле. Accessor/mutator үлгісі өңдеу уақытының құны бойынша дыбыстық инкапсуляцияны кепілдендірудің әдісі болып табылады. Жақсы инкапсулаланған кодты жаһандық айнымалы мәндермен жазу өте жақсы, бірақ сіз тәртіпті оны қалай жасайтындығыңызды қолдануға және басқа адамдар оны қалай қолдану керектігін анық көрсетуге тиіс.
қосылды автор Maxim Krizhanovsky, көзі

Жаһандық айнымалылар ешқашан жамандық емес . Оларға қарсы жалпы ереже - жақсы шешімдер қабылдау үшін тәжірибе алу үшін жеткілікті ұзақ өмір сүруіңізге мүмкіндік береді.

Қандай жаһандық айнымалы - бұл тек бір нәрсенің бар екеніне негізделген болжам, (біз жаһандық массив немесе бірнеше нәрсені қамтуы мүмкін карта туралы сөйлесіп жатқанымыздың маңызы жоқ, ол әлі де тек бір сияқты тізім немесе салыстыру, бірнеше тәуелсіз емес).

Сондықтан сіз жаһандық ауқымды пайдаланбас бұрын, өзіңізден сұрағыңыз келеді: бұл нәрсенің біреуін қолданғым келеді деп ойлаймын ба? Егер ол сызықтан шықса, онда сіз кодты өзгерткіңіз келуі керек және сіз кодтың басқа бөліктері бірегейлікке қатысты екенін білесіз. оларды да түзетуге тура келеді, және процесс епті және қателеседі. «Глобальды қолдануға болмайды» дегенді үйренеді, өйткені әдетте бұл басынан глобалды болдырмау үшін өте аз шығындар және кейінірек үлкен ақы төлеуге мүмкіндіктен құтылу мүмкін емес.

Бірақ жаһандық кодтар сіздің кодты кішірек, тезірек және еске түсіруді азайтуға мүмкіндік беретін жорамалдарды оңайлатады, себебі ол қолданатын нәрсені ұғымнан өткізудің қажеті жоқ, инжирацияны жасаудың қажеті жоқ, қажет емес мүмкіндігінше мүмкін емес нәрсе мүмкіндігін қарастырыңыз және т.б. бар. Ендірілгенде Сіз компьютерде болғаныңызға қарағанда код өлшеміне және/немесе CPU уақытына және/немесе жадына шектеу жасай аласыз, сондықтан бұл жинақ маңызды болуы мүмкін. Көптеген ендірілген қосымшалардың талаптары бойынша қатаңдығы да бар - сіз білесіз , чипте белгілі бір периферияның біреуі бар, пайдаланушы басқа біреуін USB порты немесе біреуіне қосуға бола алмайды.

Бірегей болып көрінетін нәрселердің біреуінің артықшылығына ие болудың тағы бір қарапайым себебі - екі компоненттің арасындағы өзара әрекеттестікті тестілеу қарапайым компоненттің сынақ данасын функцияға жібере аласыз, ал жаһандық құрамдас бөліктің мінез-құлқын өзгертуге тырысқанда жалған ұсыныс. Енгізілген әлемде тестілеу басқа жерлерде өте ерекшеленеді, сондықтан бұл сізге қолданылмауы мүмкін. Менің білуімше, Arduino-де тестілік мәдениет жоқ.

Мәселен, алға жылжытыңыз және глобальды қолданыңыз. Кодекс полициясы сізге келмейді және сізді алады. Тек дұрыс таңдау сіз үшін жолда көп жұмыс істеуге әкелуі мүмкін екенін біліңіз, сондықтан сенімді болмасаңыз ...

2
қосылды

Ғаламдық айнымалы мәндер Arduino-де жаман ма?

ешқандай зұлымдық, оның ішінде ғаламдық айнымалылар жоқ. Мен оны «қажетті зұлымдық» ретінде сипаттайтын едім - бұл сіздің өміріңізді жеңілдете алады, бірақ оған сақтықпен қарау керек.

Сонымен қатар, жаһандық сандарды азайту үшін қандай практиканы қолдануға болады?

жаһандық айнымалы мәндерге қол жеткізу үшін қабықша функцияларын пайдаланыңыз. сондықтан кем дегенде оны ауқымды перспективада басқару.

0
қосылды
Егер жаһандық айнымалы мәндерге қол жеткізу үшін қабық функциясын қолдансаңыз, айнымалы мәндерді осы функциялардың ішіне қоюға болады.
қосылды автор nreich, көзі