Arduinoda global o'zgaruvchilar yomonmi?

Men dasturlashda nisbatan yangi bo'lganman va o'qiyotgan eng yaxshi kodlash usullarining ko'pchiligi global o'zgaruvchan (yoki eng yaxshi kod hech globallashuvi yo'q) foydalanish uchun juda kam sabablar borligini aniq ko'rsatib turibdi.

Men SD-karta bilan Arduino interfeysini yaratish, kompyuter bilan suhbatlashish va motorni boshqarish vositasini boshqarish uchun dasturiy ta'minotni yozishda buni eslash uchun qo'lidan kelgan barcha ishni qildim.

Hozirda taxminan 1100 satr "boshlang'ich darajasi" kodi bo'yicha 46 global bor (bir nechta harakatga ega bo'lmaydigan satr). Bu yaxshi raqammi yoki uni qisqartirishga qarashim kerakmi? Bundan tashqari, globallashuvlar sonini kamaytirish uchun qanday amallarni qo'llashim mumkin?

Men bu yerda so'rayman, chunki men umuman kompyuter dasturlarini emas, balki Arduino mahsulotlarini kodlash bo'yicha eng yaxshi amaliyotlar bilan shug'ullanyapman.

20
@LookAlterno: "Men qochib ketaman" va "qila olmaysiz" juda ko'p har xil narsalar.
qo'shib qo'ydi muallif James Hopkin, manba
Arduino global o'zgaruvchilari kompyuterda kamroq yomonlik. Men globallashgan o'zgaruvchiga aylantiriluvchi o'zgaruvchini i ko'rgan odamlarni ko'rdim. Men TBH ularni sinab ko'rishga harakat qilaman, lekin ular xotira boshqaruvida o'z o'rnini egallaydi.
qo'shib qo'ydi muallif Thomas Myron, manba
@LookAlterno - Global o'zgaruvchan eng katta masala kambag'al dasturchilardir. Har bir qiymatni argument sifatida qabul qilishingiz kerak (5dan kamroq tutishga harakat qiling), chunki bu sizning kodingizni ajratadi va qayta ishlatishga imkon beradi. Dasturlarni nusxalash va joylashtirish vazifalari birgalikda juda oson, lekin faqat imkon qadar global miqyosda harakat qilishdan qochsangiz. Bundan tashqari, monolitik funktsiyalarni oldini oladi, agar siz 20 args bilan 2000 satr funktsiyasiga o'tib ketsangiz, uni qayta ishlashingiz kerak.
qo'shib qo'ydi muallif Thomas Myron, manba
Aslida, ba'zi bir o'rnatilgan dasturchilar mahalliy o'zgaruvchilarni taqiqlashadi va buning o'rniga global parametrlarga (yoki funktsiya o'zgaruvchan statik o'zgaruvchilarga) ehtiyoj sezadilar. Dasturlar kichik bo'lganda, uni oddiy davlat mashinasi sifatida tahlil qilishni osonlashtiradi; chunki o'zgaruvchilar hech qachon bir-birining ustiga yozilmaydi (ya'ni, ular to'plamda va yig'ilgan o'zgaruvchilardan iborat).
qo'shib qo'ydi muallif Hououin Kyouma, manba
@LookAlterno Err, Ardunio darslarini yoza olmaysizmi, chunki u odatiy makrolar va kutubxonalar bilan faqat C ++? Agar shunday bo'lsa, har bir o'zgaruvchiga global emas. Va hatto C da odatda o'zgaruvchan parametrlarni (ehtimol ichidagi tarkibiy qismlar) global o'zgaruvchiga ega emas, balki funktsiyalarga o'tishni afzal ko'radi. Kichkina dastur uchun kamroq qulay bo'lishi mumkin, lekin odatda dastur katta va murakkab holga kelishi sababli odatda to'lanadi.
qo'shib qo'ydi muallif sarath, manba
Arduino-da siz global o'zgaruvchilardan qochib qutula olmaysiz. Funktsiya/uskuna doirasidan tashqaridagi har bir o'zgaruvchan deklaratsiya globaldir. Shunday qilib, funktsiyalar o'rtasidagi qiymatlarni taqsimlashingiz kerak bo'lsa, ular har qanday qiymatni argument sifatida qabul qilishni istamasangiz, ular global miqyosda bo'lishi kerak.
qo'shib qo'ydi muallif user31481, manba
@Muzer. Men C ++ darslarini faqat kutubxonani rivojlantirish uchun, shuningdek, katta dasturlarni ishlataman. Men C ++ sabablaridan kelib chiqaman.
qo'shib qo'ydi muallif user31481, manba
qo'shib qo'ydi muallif Brian, manba
@LookAlterno Bu Arduinoga xos bo'lmagan C/C ++ (ism-sharoiti) ning ochiq dunyosidir va siz o'zingiz ko'rsatganidek, global o'zgaruvchanlarga yo'l qo'ymaslik mumkin emas degan xulosaga olib kelmaydi; ular ko'pincha bo'lishi mumkin. Bu savolga javob beradigan platforma Arduino bo'lsa, til darajasida emas, balki platformada mantiqiy va global miqyosda kerakli joylarni yaratadigan dizayn modellarida farq qilishi mumkin.
qo'shib qo'ydi muallif Not that Charles, manba
@Muzer huh, har doim ishlov berishni o'yladim. TIL
qo'shib qo'ydi muallif Sonic Splasher, manba
Statik va global o'zgaruvchilar kompilyatsiya vaqtida xotira hajmini bilishning afzalliklarini taqdim etadi. Juda kam xotira mavjud bo'lgan arduino bilan bu afzallik bo'ladi. Ajam uchun mavjud bo'lgan xotiradan foydalanish va untraceable xatolarni boshdan kechirish juda oson.
qo'shib qo'ydi muallif mgpugne, manba
Hey All: Bu kutilganidan ancha mashhur bo'ldi. Men so'nggi 9 oy ichida juda ko'p narsalarni o'rgandim va buni imkon qadar "boshqasi" uchun qilishni istayman. Agar men ushbu kodni yangi boshlovchi kodni yaxshilashga ko'maklashgan darslik/g'oyalar bilan bog'langan bo'lsam, odamlar buni qadrlaydilarmi? Men stack exchange edikate bo'yicha 100 foiz ishonchli emasman, shuning uchun 1-chi savolni beraman deb o'yladim.
qo'shib qo'ydi muallif cocco, manba

8 javoblar

Ular o'zlariga emas, balki yovuz emas, lekin ularni ishlatish uchun hech qanday asos yo'q ekan, haddan tashqari foydalanishga moyil.

Jahon miqyosidagi o'zgaruvchilardan foydali bo'lgan ko'p miqdor mavjud. Ayniqsa, Arduino dasturiy ta'minoti, kaput ostida, kompyuterni dasturlash uchun juda farq qiladi.

Global o'zgaruvchilar uchun katta foyda statik ajratish hisoblanadi. Ayniqsa, katta va murakkab o'zgaruvchilar, masalan, sinf namunalari. Dinamik ajratish ( new dan foydalanish va hokazo) resurslar etishmasligi tufayli yuzaga kelgan.

Boshqa funktsiyalarni chaqiradigan oddiy C dasturida (yagona main() funktsiyasi) funktsiyani bajarish kabi siz ham bitta qo'ng'iroq daraxtini olmaysiz - buning o'rniga ikkita alohida daraxtni ( setup() chaqiradigan funktsiyalar, keyin loop() chaqiradigan funktsiyalar), ya'ni ba'zida global o'zgaruvchilardan maqsadga erishishning yagona yo'li (ya'ni setup() va pastadir() ).

Xullas, ular yomon emas va Arduino-da ular kompyuterdan ko'ra ko'proq va yaxshiroq foydalanishadi.

26
qo'shib qo'ydi
To'g'ri, men juda tezkor ishladim va darslardan foydalanmaslik haqidagi savolga sharhlarning ayrimlarini tasdiqladim.
qo'shib qo'ydi muallif JaanusSiim, manba
Sinflar stack-allocated bo'lishi mumkin. Ehtimol, katakdagi katta misollarni qo'yish yaxshi emas, lekin baribir.
qo'shib qo'ydi muallif JaanusSiim, manba
@JAB Har narsa ajratilgan bo'lishi mumkin.
qo'shib qo'ydi muallif Majenko, manba
Bunday holatda, ehtimol ularni loop() da belgilashim mumkin (agar ularni Iteration orqali o'z qiymatini saqlab qolish uchun zarur bo'lsa, static ) va ularni chaqiruv zanjirining pastki qismidagi funktsiyalar parametrlaridan o'tkazib yuboring.
qo'shib qo'ydi muallif Majenko, manba
Buning bir usuli yoki uni havola qilib yuborish: void foo (int & var) {var = 4; va foo (n); - n hozir 4 ni tashkil etadi.
qo'shib qo'ydi muallif Majenko, manba
Global o'zgaruvchilardan qochish uchun eshitgan sabablarimdan biri Arduino tashqari boshqa tizim bilan bog'liq bo'lib, global o'zgaruvchilar tashqi yoki dastur tashqarisida bo'lishi mumkin. Ushbu C ++ arizasida eng yaxshisi. "C tilida global kalit so'z yo'q, vazifadan tashqarida e'lon qilingan o'zgaruvchilar" fayl hajmi "bo'ladi, ya'ni fayl ichida ko'rinadi." Bu o'zgarmaydigan maydonni ishlashdan oldin dastur doirasidan tashqariga o'zgartirishga yo'l qo'yadi, chunki fayl o'zgaruvchan bo'shliqni ishga tushirishdan oldin tartibga solinishi mumkin bo'lgan holatlarda, potentsial xavfsizlik xavflarini yaratadi
qo'shib qo'ydi muallif Clems, manba
OK, men buni qila olaman deb o'ylayman. loop() da belgilangan static var n bo'lsa (misol uchun). foo (var) va foo (var) da n kodini kiritganimda n = [new value] . [new value] loop() n = [yangi qiymat] ga ega bo'lishni istaysizmi?
qo'shib qo'ydi muallif cocco, manba
OK, faqatgina loop() (yoki loop() deb atalgan bir nechta funktsiyalarda ishlatadigan narsa bo'lsa) nima bo'lsa? ularni dastlab ularni belgilashdan ko'ra boshqacha tarzda o'rnatish yaxshiroq bo'lar edi?
qo'shib qo'ydi muallif cocco, manba
setup() va loop() o'rtasida hech qanday muloqot qilish mumkin emas, aslida, ko'proq standart uskuna foydalanish va yaxshi eski main() yoki _main() kirish nuqtasi.
qo'shib qo'ydi muallif Megatron, manba

Sizni aniq ko'rmaganda, javob berish juda qiyin haqiqiy kod.

Global o'zgaruvchilar yomon emas va ular ko'pincha ko'milgan joyda mantiqiydir odatda apparatdan foydalanish imkoniyatini yaratadigan muhit. Senda bor faqat to'rt UARTS, faqat bitta I2C porti, va hokazo. Shuning uchun foydalanish mantiqan muayyan apparat resurslariga bog'langan o'zgaruvchan globallar. Va, albatta, Arduino yadro kutubxonasi quyidagicha ishlaydi: Serial , Serial1 va hokazo. o'zgaruvchilar. Bundan tashqari, dasturning global holatini ifodalovchi o'zgaruvchi odatda global hisoblanadi.

Hozirda taxminan 1100 satr [globallashuv] uchun 46 globus bor. Bu a   yaxshi raqam [...]

Raqamlar haqida emas. O'zingizga quyidagi savolni berasiz: bu globallashuvning har biriga, global miqyosda ega bo'lishni anglatadi doirasi.

Shunday bo'lsa-da, 46 global miqyosda menga o'xshab ketadi. Agar ulardan ba'zilari qattiq tursa qiymatlari, ularni const deyiladi. Derleyici odatda optimallashtiradi ularni saqlash. Agar ushbu o'zgaruvchilardan biri faqat bittagina ishlatilsa funktsiyasi, uni mahalliy qilish. Agar siz uning qiymatini qo'ng'iroqlar o'rtasida davom etishini xohlasangiz funktsiyaga static sifatida to'g'ri kelishi kerak. Siz ham kamaytirishingiz mumkin o'zgaruvchining guruhini birlashtiruvchi "ko'rinadigan" global miqdori bu sinfning global bir namunasiga ega. Biroq, faqat shunday paytda narsalarni bir joyga qo'yish mantiqan. Katta GlobalStuff sinfini yaratish faqat bir global o'zgaruvchiga ega bo'lish uchun sizning yordamingiz bo'lmaydi kodi aniqroq.

16
qo'shib qo'ydi
Yo'q. static faqat qiymatni saqlab qo'yishingiz kerak. Agar funktsiyadagi birinchi narsa o'zgaruvchining qiymati joriy vaqtga o'rnatilgan bo'lsa, eski qiymatni saqlab qo'yishning hojati yo'q. Bunday holatlarning barchasi xotirani behuda sarflaydi.
qo'shib qo'ydi muallif Phil Hannent, manba
Bu juda yaxshi javob bo'lib, ikkala fikrni ham foydasiga, ham globallashuvga shubha bilan qarash. +1
qo'shib qo'ydi muallif Not that Charles, manba
OK, tushuntirish uchun rahmat.
qo'shib qo'ydi muallif cocco, manba
Ok! Men faqat bitta funktsiyada ishlatiladigan o'zgaruvchiga ega bo'lsam, har bir funktsiya chaqirilganda (masalan, var = millis() ), bu static qilishim kerakmi?
qo'shib qo'ydi muallif cocco, manba

Global o'zgaruvchilari bilan bog'liq asosiy masala - bu kodni saqlash. Agar kod satrini o'qiyotganda, parametr sifatida qabul qilingan yoki mahalliy sifatida e'lon qilingan parametrlarni e'lon qilish oson. Global o'zgaruvchanlikni e'lon qilish oson emas (ko'pincha talab qilinadi va IDE).

Ko'p global o'zgaruvchiga ega bo'lganingizda (40-da juda ko'p), juda uzoq bo'lmagan aniq ismga ega bo'lish qiyin bo'ladi. Nom maydonini ishlatish global o'zgaruvchilar rolini aniqlashning bir usuli hisoblanadi.

Javob nomini taqqoslashning kambag'al yo'li:

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

Intel yoki arm protsessorida global o'zgaruvchiga kirish boshqa o'zgaruvchilardan asta-sekin. Ehtimol, Arduino qarama-qarshidir.

5
qo'shib qo'ydi
AVRda globaliyalar RAMda, ko'pchilik statik bo'lmagan mahalliylar protsessor registrlariga joylashtirilgan, bu esa ularning tezroq kirishini ta'minlaydi.
qo'shib qo'ydi muallif Sprogz, manba
Muammo, albatta, deklaratsiyani topa olmaydi; Kodni tezda tushunish muhim, lekin oxir-oqibatda u nima uchun ikkinchi darajali bo'ladi - u erda haqiqiy muammo sizning kodingizning noma'lum qismini i ixtiyoriy ishlatish uchun global deklaratsiyani ishlatishga qodirligini aniqlaydi har bir kishi uchun xohlagan narsani qilish uchun ochiq qoldirgan narsalar bilan narsalar.
qo'shib qo'ydi muallif Not that Charles, manba

Kompyuterga dasturlashda ularni ishlatmasligimga qaramay, Arduino uchun ular ba'zi afzalliklarga ega. Ko'pincha allaqachon aytgan bo'lsa:

  • Dinamik xotira ishlatilmaydi (Arduino cheklangan yig'im maydonida bo'shliqlar yaratish)
  • Hamma joyda mavjuddir, shuning uchun argumentlar (bu bo'shliqqa xarajat bo'lgan) sifatida o'tishga hojat yo'q.

Bundan tashqari, ayrim hollarda, ayniqsa, ishlashga asoslangan holda global o'zgaruvchilardan foydalanish kerak, kerak bo'lganda elementlarni yaratish o'rniga:

  • Uydagi bo'shliqlarni kamaytirish uchun
  • Dinamik ravishda ajratish va/yoki xotirani bo'shatish ancha vaqt talab qilishi mumkin
  • Argumentlar bir necha sabablarga ko'ra foydalaniladigan global ro'yxat elementlari ro'yxati, masalan, "qayta ishlatilishi mumkin", masalan. bir marta SD uchun bufer sifatida va keyinchalik vaqtinchalik mag'lubiyat tampon sifatida.
5
qo'shib qo'ydi

Hamma narsada bo'lgani kabi (haqiqatdan ham yovuz bo'lgan Gotoslardan tashqari) globallerlar o'z o'rnini egallaydi.

Masalan, Agar sizda disk raskadrovka uchun ketma-ket port yoki har bir joydan yozish imkoniyatiga ega bo'lishingiz kerak bo'lgan jurnal fayli bo'lsa, unda u butun dunyo bo'ylab buni amalga oshirish uchun mantiqan bo'ladi. Shunga o'xshab, tizimning ba'zi bir muhim ma'lumotlariga ega bo'lsangiz, unda global miqyosda uni amalga oshirish eng oson echim hisoblanadi. Dasturning har bir funktsiyasiga o'tishingiz kerak bo'lgan qiymatga ega bo'lishning hech qanday ahamiyati yo'q.

Boshqalarning ta'kidlashicha, 46 faqatgina 1000dan ortiq kodlar uchun juda o'xshaydi, lekin nima qilayotganingizni batafsil bilmasangiz, ularni ishlatishingiz yoki yo'qmi deb aytish qiyin.

Ammo har bir global o'zingiz uchun bir nechta muhim savolni so'rang:

Ism aniq va o'ziga xosmi, shuning uchun tasodifan bir joyda shu nomni ishlatishga harakat qilmaymanmi? Agar nomini o'zgartirmasangiz.

Buning o'zgarishi kerakmi? Agar u bo'lmasa, uni konst qilishni ko'rib chiqing.

Bu har joyda ko'rinadigan bo'lishi kerakmi yoki faqatgina global bo'lib, funksiya chaqiruvlari orasida qiymat saqlanib qolishi kerakmi? Buni mahalliy funktsiya va statik kalit so'zdan foydalanishni hisobga oling.

Ehtiyot bo'lmayotganda, bu narsa kodning bir qismi tomonidan o'zgartirilsa, albatta, yomon narsalar buziladi? Masalan, Agar sizda ikkita o'zgaruvchiga ega bo'lsangiz, ism va identifikator raqamini ayting (agar global miqyosda kerakli ma'lumotlar kerak bo'lsa, avvalgi eslatmani qarang). Agar ulardan biri boshqa yomon narsalarsiz o'zgarishi mumkin. Ha, ehtiyot bo'lishingiz mumkin, lekin ba'zan diqqatni ehtiyotkorlik bilan bajarish yaxshi. masalan, ularni turli xil .c faylga qo'yib, keyin ikkalasini bir vaqtning o'zida o'rnatgan va ularni o'qishga ruxsat beruvchi funktsiyalarni belgilang. Shundan keyin siz faqat tegishli nom faylidagi funktsiyalarni o'z ichiga olasiz, shundan keyingina kodingiz qolgan funktsiyalarga faqat ma'lum funktsiyalar orqali kirish imkoniyatiga ega bo'ladi va shu sababli tartibsizliklarni bartaraf eta olmaydi. Bu, asosan, c ++ sinfining ruxsat berishiga imkon beradi, lekin sinchkovlik bilan belgilashni va o'rganishni o'rganmasdan, bir vaqtning o'zida juda ko'p o'rganmaysiz.

- Yangilanish - Sizga ma'lumki, siz umumiy kodlashdan ko'ra Arduinoga xos eng yaxshi amaliyot haqida so'ragansiz va bu umumiy kodlashdan ko'proq javobdir. Ammo halollik bilan farq juda katta emas, yaxshi amaliyot yaxshi amaliyotdir. Arduino ning startup() va loop() tuzilishi, ba'zi hollarda global miqyosda boshqa platformalardan foydalanish kerakligini anglatadi, siz platforma nima bo'lishidan qat'i nazar, platforma cheklovlari ichida qila oladigan eng yaxshi narsalarni maqsad qilib olasiz.

4
qo'shib qo'ydi
Agar goto ni yomon deb hisoblasangiz, Linux kodini tekshiring. Ehtimol, xuddi shunday foydalanilganda ular Ushalar ... catch bloklari kabi yomon.
qo'shib qo'ydi muallif nreich, manba
Men Arduinolar haqida hech narsa bilmayman, lekin juda ko'p ish stoli va serverlarni ishlab chiqyapman. goto lar uchun IMHO (IMHO) mavjud va u ichki o'tgan looplardan chiqib ketishi kerak, u muqobillardan ko'ra ancha toza va tushunarli.
qo'shib qo'ydi muallif sagelynaive, manba

Ular yomonmi? Balki. Jahon miqyosidagi muammolar shundan iboratki, ularni har qanday nuqtada vaqtincha o'zgartirishi va o'zgartirishi mumkin bo'lgan har qanday funktsiya yoki kod bajarilishi mumkin. Bu vaziyatni, masalan, orqaga surish va tushuntirish qiyin bo'lgan vaziyatlarga olib kelishi mumkin. Global miqdori kamaytiriladi, iloji bo'lsa, miqdori nolga keltirilsa, shuning uchun kerak bo'ladi.

Ulardan qutulish mumkinmi? Deyarli har doim ha. Arduino bilan bog'liq muammo sizni setup() va loop() deb atagan ikkita funktsional yondashuvga majbur qilishlari kerak. Bunday holda siz ushbu ikki funktsiyaning chaqiruvchining funktsiyasi doirasiga kira olmaysiz (ehtimol main() )). Agar shunday bo'lsa, siz o'zingizdan butun dunyodan xalos bo'lib, o'rniga mahalliy aholi foydalanasiz.

Quyidagiga rasm bering:

int main() {
  setup();

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

Bu, ehtimol, Arduino dasturining asosiy funktsiyasi nimaga o'xshash degani. setup() va loop() funktsiyalarida kerak bo'lgan o'zgaruvchilar keyinchalik main() funktsiyasi doirasida e'lon qilinadi global miqyosda emas, balki. Keyinchalik ularni boshqa dalillarga argumentlar sifatida yuborish orqali (agar kerak bo'lsa, ko'rsatgichlardan foydalanib) foydalanish mumkin.

Misol uchun:

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

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

Shuni e'tiborga olish kerakki, bu holatda ham ikkala funksiyaning imzosini o'zgartiring.

Buning imkoni bo'lmasligi yoki kerak bo'lmaganligi sababli, Arduino dasturidan eng ko'p globallashuvlarni dastur strukturasiga majburan o'zgartirmasdan olib tashlashning faqat bitta usulini ko'raman.

Agar men to'g'ri eslay oladigan bo'lsam, C dan tashqari, Arduino uchun dasturiy ta'minotni C ++ dan foydalanishga qodir emassan. Agar OOP (ob'ektni yo'naltirilgan dasturlash) yoki C ++, ba'zi narsalarni o'rganish va ba'zan o'qish kerak bo'ladi.

Mening taklifim Dastur sinfini yaratish va ushbu klassning yagona global namunasini yaratishdir. Sinf ob'ektlar uchun rejani hisobga olish kerak.

Quyidagi namuna dasturini ko'rib chiqing:

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();
}

Afsuski, biz deyarli barcha globallerlardan xalos bo'ldik. Ilova mantig'ini qo'shadigan funktsiyalar Program :: setup() va Program :: loop() funktsiyalari bo'ladi. Ushbu funktsiyalarda myFirstSampleVariable va mySecondSampleVariable misoli muayyan a'zo parametrlariga kirish mumkin. Holbuki, an'anaviy setup() va loop() Funktsiyalarda ushbu parametrlarga sinfning maxfiyligi belgilanganligi sababli kirish imkoni yo'q. Ushbu kontseptsiya Ma'lumotlarni inkassulyatsiyasi yoki ma'lumotlar yashirish deb ataladi.

Sizni OOP va/yoki C ++ o'qitish ushbu savolga berilgan javobning bir qismidan iborat bo'lib, men bu erda to'xtab qolaman.

Xulosa qilish kerakki, globallashishdan qochish kerak va globallashuv miqdorini sezilarli darajada kamaytirish deyarli mumkin. Bundan tashqari, Arduino uchun dasturiy ta'minot.

Eng muhimi, mening javobim siz uchun bir oz foydali bo'ladi deb umid qilaman :)

3
qo'shib qo'ydi
Dasturning istalgan nuqtasiga kira olishingiz mumkin bo'lgan global davlat hali ham globalProgram.setup() o'rniga Program :: instance (). Setup() orqali kirishingiz mumkin. >. Bilan bog'liq global o'zgaruvchilarni bitta sinfga/struct/nom maydoniga qo'yish foydali bo'lishi mumkin, ayniqsa ular faqat bir nechta funktsional funktsiyalarga muhtoj bo'lsa ham, faqat bitta nusxa hech narsa qo'shmaydi. Boshqacha aytganda static program p global xotiraga ega va statik Dastur & instance() umumiy foydalanishga ega, bu oddiygina Program globalProgram; >.
qo'shib qo'ydi muallif Tomas Andrle, manba
A singleton samarali global miqyosda, oddiygina kiyinib, qo'shimcha chalkashlikda. Xuddi shu hodisa.
qo'shib qo'ydi muallif Tomas Andrle, manba
O'zingiz xohlagan holda sketchda o'zingizning asosiy() belgini belgilashingiz mumkin. Bu aktsiyalar bir xil ko'rinadi: github.com/arduino/Arduino/blob/1.8.3/hardware/arduino/avr/…
qo'shib qo'ydi muallif per1234, manba
@paststew Sizning fikringizcha, sizda aynan shu kamchiliklar borligini qanday tushunasiz? Menimcha siz ma'lumotingizning ixlos bilan sizning manfaatlaringiz uchun foydalana olmaysiz.
qo'shib qo'ydi muallif gebeyaw, manba
@ per1234 Rahmat! Men mutlaqo Arduino mutaxassisi emasman, lekin mening birinchi taklifim o'sha paytda ham ishlashi mumkin deb o'ylayman.
qo'shib qo'ydi muallif gebeyaw, manba
Men buni shunday deb o'ylamagan edim. Siz haqsiz deb hisoblayman. Men lavozimni o'zgartiraman. Bu ham tushunishni osonlashtiradi.
qo'shib qo'ydi muallif gebeyaw, manba
@Graham Siz qanday tartib-intizom haqida gapirayotganingizni bilishni xohlayapmanmi? Men nima haqida gaplashayotganingizni bilaman deb o'ylayman, ammo intizom "yaxshi kodlangan kod" yaratmayapti. Accessor/mutator naqshini ba'zida kodni qanday o'rnatganingizga qarab, engil ishlash qiymatiga ega bo'ladi. Biroq, juda qimmat operatsiyalar ko'plab derleyici tomonidan optimallashtirilishi mumkin.
qo'shib qo'ydi muallif gebeyaw, manba
Uzoq vaqtdan beri o'rnatilgan kodlayıcı sifatida, men " tashqi dan" Global o'zgaruvchan toifalar "ning quyi temir qoidasini yetarlicha muntazam ravishda o'qitishga majbur bo'ldim. har doim argumentini o'tish kodni sekinroq qiladi. Kompyuterda bu juda mo''jizaviy emas, lekin ko'milgan dunyoda bu juda katta bitim. Aksessor/mutator naqshlari - bu ishlov berish vaqtida tovushli inkassulyatsiyani kafolatlashning bir usuli. Umumjahon o'zgaruvchilari bilan yaxshi kodlangan kodni yozish juda yaxshi, lekin siz uni qanday tasarlayacağınıza intizomni qo'llashingiz va boshqa odamlar uni qanday ishlatishi kerakligini aniq ko'rsatishlari kerak.
qo'shib qo'ydi muallif Maxim Krizhanovsky, manba

Global o'zgaruvchilar hech qachon yomon emas. Ularga nisbatan umumiy qoida - yaxshi qarorlar qabul qilish uchun tajriba orttirish uchun etarlicha uzoq vaqt yashab qolishingiz uchun faqatgina bir tayanch.

Qanday global o'zgarmaydigan narsa, faqat bitta narsaning mavjudligidan kelib chiqadigan xulosa hisoblanadi (agar biz global satr yoki xarita haqida gapiradigan bo'lsak, bir nechta narsalarni o'z ichiga olishi mumkin, bu hali hammasi bir kabi ro'yxat yoki xaritalash, bir nechta mustaqil emas).

Shunday ekan, siz global miqyosda foydalanishdan oldin, o'zingizdan so'rashni xohlaysizmi: bu narsalarning bir nechtasidan ko'proq foydalanmoqchi bo'layapmanmi? Agar u chiziqdan chiqsa, siz kodni bu narsani globalizatsiya qilish uchun o'zgartirishingiz kerak bo'ladi va siz kodning boshqa qismlari o'xshashlik taxminiga bog'liq bo'lishi mumkin, shuning uchun siz ularni ham tuzatish kerak, va jarayon zerikarli va xatolarga aylanadi. "Globallardan foydalanmang" deb o'rgatiladi, chunki odatda bu global miqyosda boshidan qochish uchun juda kam xarajat va undan keyin katta xarajatlarni to'lash imkoniyatidan qochadi.

Ammo globallashuvlar sizning kodingizni kichikroq, tezroq va xotiradan kamroq foydalanishga imkon beradigan taxminlarni soddalashtiradi, chunki u foydalanadigan narsaning kontseptsiyasidan o'tishi shart emas, indirektni qilish kerak emas, kerakli narsalarni ehtimol yo'qligi va hokazo deb hisoblashingiz mumkin. O'rnatilgan kompyuterda sizning kompyuteringizdan ko'ra kod hajmi va/yoki CPU vaqti va/yoki xotirasi uchun cheklash ehtimoli ko'proq, shuning uchun bu tejamkorlik muhimdir. Ko'pgina ilovalar ham talablarga ko'proq qat'iylik bilan ega - siz bilasiz , sizning chipingiz faqat ma'lum bir atrof-muhitga ega ekanligi, foydalanuvchi boshqa USB portiga yoki boshqa qurilmaga ulanishi mumkin emas.

Noyob ko'rinib turgan bir narsadan ko'proq narsani talab qilishning yana bir keng tarqalgan sababi - bu ikki qismning o'zaro ta'sirini sinab ko'rish, agar siz oddiy komponentning xatti-harakatlarini o'zgartirishga harakat qilsangiz, ba'zi bir tarkibiy qismlarning sinab nusxasini faqat funksiyaga o'tkazishingiz osonroq bo'ladi noqulay taklif. Biroq, kattalar dunyosida test qilish boshqa joylardan juda farq qiladi, shuning uchun bu sizga tegishli bo'lmasligi mumkin. Bilib olganimdek, Arduino hech qanday test madaniyatiga ega emas.

Shunday ekan, ular qimmatbaho ko'rinishda globallashuvlardan foydalaning. Kodeks politsiyasi sizga kelmaydi. Faqat bilingki, noto'g'ri tanlov yo'lda siz uchun ko'proq ish olib borishi mumkin, shuning uchun siz ishonchingiz komil bo'lmasa ...

2
qo'shib qo'ydi

Global o'zgaruvchilar Arduinoda yomonmi?

hech qanday yomon narsa, jumladan, global o'zgaruvchilar. Buni "kerakli yovuzlik" deb ta'riflayman, bu sizning hayotingizni ancha osonlashtirishi mumkin, ammo ehtiyotkorlik bilan murojaat qilish kerak.

Bundan tashqari, globallashuvlar sonini kamaytirish uchun qanday amallarni qo'llashim mumkin?

global parametrlarga kirish uchun sariq vazifasini bajaring. shuning uchun hech bo'lmaganda sizni uning doirasi nuqtai nazaridan boshqarasiz.

0
qo'shib qo'ydi
Agar siz global o'zgaruvchiga kirish uchun sarmalovchi funktsiyalardan foydalansangiz, siz o'zingizning parametrlarini bu funktsiyalar ichida joylashtirishingiz mumkin.
qo'shib qo'ydi muallif nreich, manba