Bog'liq Amaliy matematika fakulteti amaliy matematika va informatika kaf
Modulli dasturlash masalalari
Modullardan foydalanish g'oyasi kodni juda soddalashtirmaydi, ular orasidagi to'g'ridan-to'g'ri ulanish sonini minimallashtirish muhimdir. Bu erda biz "nazorat inversiyasi" (IoC) kontseptsiyasiga kelamiz. Soddalashtirilgan - bu kodning individual tarkibiy qismlari bir-biridan iloji boricha ajratilgan dasturiy tamoyil. Ya'ni bitta modulning tafsilotlari boshqasining bajarilishiga ta'sir qilmasligi kerak. Bunga modulli kodga to'g'ridan-to'g'ri kirishni ta'minlamaydigan interfeyslar yoki boshqa vakillik turlari yordamida erishiladi.
Kundalik hayotda bunday misollar ko'p. Samolyot chiptasini sotib olish yoki jo'nash vaqtini bilish uchun siz uchuvchini chaqirishingiz shart emas. Sut ichish uchun siz qishloqqa yoki zavodga borishingiz va sigirning joni ustidan turishingiz shart emas. Buning uchun har doim vositachilar mavjud.
Modulli dasturlashda uchta asosiy dastur mavjud:
Qarindoshlik in'ektsiyasi Har bir elementning o'z interfeysi mavjudligi, modullarning o'zaro ta'siri interfeyslar orqali sodir bo'ladi.
Zavod usuli. Boshqa ob'ektlarni yaratish uchun mo'ljallangan, ma'lum bir ob'ekt mavjudligiga asoslanadi. Boshqacha qilib aytganda, ko'pgina ob'ektlar uchun umumiy xususiyatlarni birlashtirgan prototip dasturiga kirish. Modullar o'rtasida to'g'ridan-to'g'ri shovqin yo'q, barcha parametrlar "zavod" dan meros bo'lib o'tgan.
Xizmat usuli. Bitta umumiy interfeys yaratiladi, bu ob'ektlarning o'zaro ta'siri uchun buferdir. Haqiqiy hayotda shunga o'xshash funktsiyani call-markazlar, do'konlar, reklama maydonchalari va boshqalar bajaradi.
Birinchi IoCni amalga oshirish eng ko'p ishlatiladigan bo'lishiga qaramay, qolgan ikkitasini modulli dasturlashning birinchi bosqichlarida qo'llash yaxshiroqdir. Buning sababi shundaki, oddiy interfeyslarni yaratish faqat modullarga kirishni cheklaydi va kodning murakkabligini kamaytirish uchun ulanishlar sonini kamaytirish kerak. Tasodifiy ravishda boshqa interfeyslarga ulanadigan interfeyslar faqatgina kodni murakkablashtiradi.
Ushbu muammoni hal qilish uchun kod arxitekturasini ishlab chiqish kerak. Qoida tariqasida, u har qanday dasturning fayl tuzilishiga o'xshash:
Shunday qilib, modulli dasturlash, boshqarish inversiyasi va aniq arxitektura tamoyillarini qo'llab-quvvatlash uchta toshni bitta tosh bilan o'ldirishga yordam beradi:
Kodning aniq funktsional ajratilishini ta'minlang. Agar xatolar yuzaga kelsa, siz tezda manbani aniqlab olishingiz mumkin va tuzatishlar yangi muvaffaqiyatsizliklarning paydo bo'lishiga olib kelmaydi.
Havolalar sonini kamaytirish. Bu rivojlanishni soddalashtiradi va bir nechta ishlab chiqaruvchilarning rahmatiga turli modullarni taqdim etadi. Yoki har bir blokni boshqalarga qaramasdan mustaqil ravishda ishlab chiqishingiz mumkin, bu ham vaqt va kuchni tejaydi.
Aniq vertikal merosga ega bo'lgan ierarxiyani yarating. Bu kodning ishonchliligini oshiradi, chunki sinov yanada sodda va natijalari ko'proq ma'lumotga ega.
Katta loyihalarda modullik tamoyiliga rioya qilish vaqtni tejaydi va boshlang'ich g'ayratni to'kmaydi. Bundan tashqari, siz nihoyat eng qiziqarli narsaga - kodda asl g'oyalarni amalga oshirishga e'tibor qaratishingiz mumkin. Ammo har birimiz dasturlashda aynan shu narsa qidiramiz.
Modulli dasturlashning asosiy printsipi bo'lingan va bo'lingan emas. Modulli dasturlash bu dasturni tuzilishi va xatti-harakati ma'lum qoidalarga bo'ysunadigan modullar deb nomlangan kichik mustaqil bloklar to'plami sifatida tashkil qilishdir.
E'tibor bering, dasturlash tillarining sintaktik tuzilishini nazarda tutganimizda va "katta hajmli dasturni" alohida bloklarga "ajratish uchun" modul "so'zini ishlatishni farqlash kerak (protsedura sifatida ham, ularni amalga oshirish ham mumkin). funktsiyalar shakli).
Modulli dasturlashdan foydalanish dasturlarni sinash va xatolarni aniqlashni osonlashtiradi. Apparat bilan bog'liq quyi qismlarni boshqa pastki qismlardan qat'iy ravishda ajratish mumkin, bu esa yaratilgan dasturlarning harakatchanligini yaxshilaydi.
Dasturlarning samaradorligini oshirish jarayoni soddalashtirilgan, chunki vaqtga bog'liq bo'lgan modullar boshqalardan mustaqil ravishda ko'p marta o'zgartirilishi mumkin. Bundan tashqari, modulli dasturlarni tushunish ancha oson va modullardan boshqa dasturlarda qurilish bloki sifatida foydalanish mumkin.
Dasturlashda "modul" atamasi dasturlarni yaratishda modulli tamoyillar joriy qilinishi munosabati bilan qo'llanila boshlandi. 70-yillarda modul deganda ma'lum qoidalarga muvofiq yozilgan protsedura yoki funktsiya tushuniladi. Masalan, "Modul sodda, yopiq (mustaqil), ko'rinadigan (50 tadan 100 tagacha satrgacha), vazifaning faqat bitta funktsiyasini bajaradigan, bitta kirish va bitta chiqish nuqtasiga ega bo'lishi kerak." Biroq, umume'tirof etilgan talablar mavjud emas va modul odatda 50 satrgacha bo'lgan har qanday protsedura deb ataladi.
Birinchidan, dasturiy modulning asosiy xususiyatlari Parnas tomonidan ko'proq yoki kamroq aniq ifodalangan: "Bitta modulni yozish uchun boshqasining matni haqida minimal ma'lumot etarli bo'lishi kerak." Shunday qilib! Parnassus birinchi bo'lib dasturlashda ma'lumotni yashirish tushunchasini ilgari surdi.
Parnassus ta'rifiga ko'ra, modul eng past ierarxiya darajasining (amalga oshirish darajasi) yoki faqat boshqa modul protseduralariga murojaat qilinadigan har qanday alohida protsedura (funktsiya) bo'lishi mumkin.
Biroq, faqat 70-yillarning tillarida mavjud bo'lgan sintaktik inshootlar, masalan protsedura va funktsiya, ishonchli ma'lumotlarni yashirishni ta'minlay olmadi, chunki ularga murakkab dasturlarda xatti-harakatlarini oldindan aytish qiyin bo'lgan global o'zgaruvchilar ta'sir qiladi. Ushbu muammoni faqat global o'zgaruvchilar ta'sir qilmaydigan yangi sintaksis tuzilishini ishlab chiqish orqali hal qilish mumkin edi. Ushbu dizayn yaratilgan va modul deb nomlangan.
Modulning ixtisoslashtirilgan sintaktik qurilishi birinchi marta 1975 yilda N. Virt tomonidan taklif qilingan va uning yangi tiliga - Modula kiritilgan. Xuddi shu yili Modula tilini eksperimental ravishda amalga oshirish amalga oshirildi. Bir oz ishlov berilgandan so'ng 1977 yilda ushbu yangi til nihoyat amalga oshirildi va Modula-2 nomini oldi. Keyinchalik, bir-biridan farqli bo'lgan shunga o'xshash inshootlar boshqa dasturlash tillariga kiritildi: Paskal Plus (Uels va Bastard, 1979), Ada (1980), Turbo Paskal versiyasi 4.0 va boshqalar.
Dastlab, murakkab dasturiy tizimlarni amalga oshirishda modul protseduralar va funktsiyalar bilan birga ma'lum bir pastki qismni amalga oshirish tafsilotlarini birlashtiradigan va ishonchli yashiradigan dizayn sifatida ishlatilishi kerak deb taxmin qilindi. Biroq, Borland (Turbo) Paskal tili modulning barcha nazariy imkoniyatlarini amalga oshira olmadi. Xususan, ushbu til ichki modullarni qo'llab-quvvatlamaydi (ichki protseduralar va funktsiyalarga o'xshash), import (foydalanish qoidalari) moslashuvchan emas, bu esa boshqa modullardan ob'ektlarni tanlab olib kirishga imkon bermaydi. Ushbu holat, shuningdek shaxsiy kompyuterlarning paydo bo'lishi bilan dasturchilar bilan ishlash doirasi keskin kengayganligi (va bu dasturchilarning nazariy tayyorgarligining o'rtacha darajasini sezilarli darajada kamaytirdi), ushbu ob'ektning Paskalning oldingi versiyasida dasturlarni ishlab chiqishda asosan modullarning tili ishlatilganligiga olib keldi. protseduralar va funktsiyalarning muammoli kutubxonalarini yaratish vositasi sifatida. Va o'z loyihalarini tuzishda ushbu tilning to'liq kuchidan faqat eng malakali dasturchilar foydalanadilar. Object Pascal-da modullarni amalga oshirishda ko'rsatilgan cheklovlar saqlanib qolmoqda, ammo Delphi-dagi har bir shakl albatta o'z moduliga ega va vizual bo'lmagan algoritmik harakatlar ham odatda alohida modul sifatida taqdim etiladi, modul qurilishi asl maqsadi uchun ishlatilgan malakasidan qat'i nazar, barcha dasturchilar.
Delphi muhiti Object Pascal-da modulli dasturlash kontseptsiyasini qo'llab-quvvatlaydi, bu modullardan keng foydalanish bilan progressiv va ishonchli dasturiy uslubni rag'batlantiradi va shu bilan Delphi va Object Pascal-ni boshqa zamonaviy dasturlarni ishlab chiqarish vositalaridan ajratib turadi.
Shunday qilib, loyihadagi modullar soni vazifani mustaqil pastki qismlarga ajratish orqali aniqlanishi kerak. Favqulodda holatlarda, modul hatto bitta protsedurani tuzish uchun ishlatilishi mumkin, agar kerak bo'lsa, u bajaradigan mahalliy harakat dasturning boshqa qismlarining ta'siriga, loyiha kodiga har qanday o'zgartirish kiritilishiga qaramasdan kafolatlanishi kerak. Xususan, moduldan foydalanish real vaqt rejimidagi vazifalar sinfiga xos bo'lib, unda dastur xatti-harakatlarining ishonchliligi va oldindan aytib berish mezoni hal qiluvchi ahamiyatga ega.
Modulli dasturlashdan foydalanish bilan bog'liq yana bir nazariy masalani ko'rib chiqing. Ushbu savol modulli dizayn shakliga tegishli.
Modulli loyihaning ierarxik tuzilishini yaxshi shakli bilan ta'minlash uning rivojlanishi jarayonini yaxshilashga imkon beradi. Modul tomonidan ulangan modullar soni va uni bog'laydigan modullar soni loyihaning murakkabligiga ta'sir qiladi. Jordan (Yourdon) ushbu modulga ulangan modullar sonini, boshqarish modullarining ko'lamini yoki kengligini chaqirdi. Modulning katta o'lchamlari bilan bir qatorda, juda kichik yoki juda katta boshqaruv kengligi ham yomon modul joylashuvining belgisidir. Umuman olganda, modulning boshqaruv kengligi 10 dan oshmasligi kerak. Ushbu raqam 7-sonli "sehrli" raqam bilan bog'liq bo'lib, bu psixologiyaning qoidalariga, xususan, ma'lumotni "siqish" nazariyasiga asoslangan. Qisqa muddatli inson xotirasi ma'lumotlarning "bo'laklarini" saqlash uchun cheklangan qobiliyatga ega. Psixologik tajribalar shuni ko'rsatdiki, bizning qisqa muddatli xotira qobiliyatimiz 5-11 "dona" oralig'ida (o'rtacha - 7). U bir vaqtning o'zida 7 ta "ma'lumot" ma'lumotlarini ishlatishi mumkin. Biror kishi ushbu chegaradan oshib ketganda, u xatolarga ko'proq moyil bo'ladi. Ma'lumotni tegishli qismlarga ajratish insonning qisqa muddatli xotirasidan samarali foydalanish va materialni tushunishni yaxshilash uchun muhim qadamdir. Hayotning ko'pgina holatlaridagi odamlar bunday qayta tashkil etishni behush holda qiladilar. Biroq, dasturchi 7-raqamdan sezilarli darajada oshib ketadigan boshqaruv modullarining kengligiga ruxsat bermasdan o'z-o'ziga yordam berishi mumkin.
Delphi muhitida dasturlashga kelsak, modulli loyiha shakli bo'yicha ko'rib chiqilgan tavsiyalar asosan foydalanuvchi tomonidan yaratilgan modullarga taalluqli bo'lishi kerak, chunki Delphi avtomatik ravishda shakllarni qayta ishlash bilan bog'liq kodning asosiy qismini yaratadi va dastur dasturchisiga standart plaginlar haqida o'ylashning hojati yo'q.
Bundan tashqari, xuddi shu printsiplar sinf ierarxiyasini ishlab chiqishda qo'llanilishi kerak. Masalan, oldindan belgilangan Object Pascal sinflari ierarxiyasida TObject va Istisno faqat ikkita sinf, 7 avloddan sezilarli darajada katta bo'lgan bir nechta avlod sinflariga ega. Buni TObject global darajadagi asosiy roli va Istisno sinfining "sanab o'tilgan" tabiati bilan izohlash mumkin. Uchta sinflar uchun bu raqam 8–9 oralig'ida, qolgan sinflarda esa 7 tadan kam bo'lgan avlodlar mavjud.
Dasturiy ta'minot tizimining murakkabligini kamaytirish uchun u ko'plab kichik, juda mustaqil modullarga bo'linadi. Modul - bu tizimdagi istalgan boshqa moduldan chaqirilishi mumkin bo'lgan yopiq dastur. Bu dasturning bir qismi, bu tizimning jismoniy tuzilishi uchun qurilish blokidir. Qoidaga ko'ra, modul interfeys va amalga oshirish qismlaridan iborat. Modullar turli xil dasturlash tillarida ishlab chiqilishi va alohida kompilyatsiya qilinishi mumkin. Dasturiy ta'minot tizimi modullarining yuqori darajada mustaqilligiga ikkita optimallash usulini qo'llash orqali erishish mumkin: har bir modulda ichki ulanishlarni mustahkamlash va ular o'rtasidagi aloqani susaytirish. Modulli dasturlash 60-yillarning boshlarida paydo bo'ldi. XX asr . Dasturiy tizimlarni yaratishda quyidagi afzalliklar mavjud:
dasturiy ta'minot tizimini ishlab chiqish va joriy etish soddalashtirilgan;
ijrochilarning bir vaqtning o'zida (parallel) ishlashi imkoniyati mavjud, bu esa podstansiyalarni yaratish uchun zarur bo'lgan vaqtni kamaytirishga imkon beradi;
PS-ni sozlash va o'zgartirishni soddalashtiradi;
loyihaning borishini kuzatish uchun ko'plab tabiiy bosqichlar mavjud;
Siz eng keng tarqalgan dasturlarning kutubxonalarini yaratishingiz mumkin;
dasturni o'qish va tushunish osonlashadi;
to'liqroq test taqdim etiladi;
Katta PS ni tezkor xotiraga yuklash tartibi osonlashadi (virtual xotirada ishlashda dasturni sahifalarga tarqatish samaradorligi uning modullarga qanday bo'lishiga bog'liq).
Ushbu afzalliklar bilan bir qatorda, dasturiy ta'minot tizimining narxining oshishiga olib keladigan bir qator kamchiliklar mavjud:
dasturni bajarish vaqti ko'payishi mumkin;
kerakli xotiraning hajmi oshishi mumkin;
kompilyatsiya va yuklash vaqtlari ko'payishi mumkin;
intermodular o'zaro ta'sirni tashkil etish muammolari juda murakkab bo'lishi mumkin.
Modullar uchun asosiy xususiyatlar va talablarni sanab o'tamiz.
1. Modul natijasi: alohida kompilyatsiya yoki qo'shma kompilyatsiya natijasining bir qismidir. U operatsion tizim tomonidan faollashtirilishi yoki boshqa modul tomonidan chaqiriladigan kichik dastur bo'lishi mumkin.
2. Modulning tarkibi bo'lishi mumkin murojaat qiling ismidan foydalanib.
3. Modul qaytish nazorati kerak uni chaqirgan kishiga.
4. Modul mumkin ishlov bermoq boshqa modullarga
5. Modulga ega bo'lishi kerak bitta kirish va bitta chiqish. Ba'zan bir nechta kirishli dastur qisqaroq bo'lishi mumkin va kam xotirani egallaydi. Ammo modulli dasturlash tajribasi shuni ko'rsatadiki, ishlab chiquvchilar bir nechta o'xshash modullarga ega bo'lishni afzal ko'rishadi, lekin bitta modulda bir nechta kirish va chiqishlardan foydalanmaslik. Buning sababi, kirish va chiqishning noyobligi modulning izolyatsiyasini kafolatlaydi va dasturiy ta'minot tizimiga xizmat ko'rsatishni soddalashtiradi.
6. Modul nisbatan kichik. Modulning o'lchamlari dastur elementlarining mustaqillik darajasiga, uni o'qish va sinovdan o'tkazish qulayligiga ta'sir qiladi. Kichik modullar sizga osonroq o'zgartirishga imkon beradigan dasturlarni yaratishga imkon berishi aniqlandi. Bunday modullardan ko'proq foydalaniladi, ular rivojlanishni baholash va boshqarishni osonlashtiradi, ularni tajribali va tajribasiz dasturchilarga tavsiya qilish mumkin. Dasturni bir nechta yirik modullar sifatida loyihalash orqali yuqori kuch va minimal tortishish mezonlarini qondirish mumkin edi, ammo shu tarzda yuqori darajada mustaqillikka erishish mumkin emas. Qoida tariqasida, modul yuqori darajadagi 10 dan 100 gacha operatorlarni o'z ichiga olishi kerak (ba'zi nashrlarda 200 tagacha).
Boshqa tomondan, kichik modullar uzoqroq mo'ljallangan, sekinroq ishlaydi. Birgalikda ular boshlang'ich matnning ko'p sonli jumlalaridan iborat bo'lib, ko'proq hujjatlarni talab qiladi, ularni yozish dasturchi uchun yoqimli bo'lmasligi mumkin.
7. Modul o'z faoliyatini boshqarish uchun qo'ng'iroqlar tarixini saqlamasligi kerak. Bunday modul deyiladi bashoratli O'z holatlarining izlarini ketma-ket qo'ng'iroqlarda saqlaydigan modul oldindan aytib bo'lmaydi. Barcha PS modullari oldindan aytib berilishi kerak, ya'ni. oldingi qo'ng'iroq haqida hech qanday ma'lumot saqlamasligi kerak. Vaqtga bog'liq xatolar, oldindan aytib bo'lmaydigan modulni qayta-qayta chaqirishga harakat qiladigan dasturlarda qiyinchiliklarga olib keladi.
8. Qaror qabul qilish tarkibi modulda qaror to'g'ridan-to'g'ri ta'sir etadigan modullar qaror qabul qilish moduliga bo'ysunadigan tarzda tashkil etilishi kerak. Shunday qilib, odatda qabul qilinishi kerak bo'lgan qarorlarni ifodalovchi maxsus ko'rsatkich parametrlarini uzatishni istisno qilish, shuningdek, dastur ierarxiyasida yuqori darajadagi dasturni boshqarishga ta'sir qiladigan qarorlarni qabul qilish mumkin.
9. Ma'lumotlarga kirishni minimallashtirish. Modul murojaat qilishi mumkin bo'lgan ma'lumotlar miqdorini minimallashtirish kerak. Umumiy maydonga, tashqi ma'lumotlarga va formatga e'tibor bermaslik bu yo'nalishdagi yaxshi qadamdir. Dizayner, ma'lum bir ma'lumotlarning tuzilishi yoki ma'lumotlar bazasidagi yozuvlarni alohida modulda (yoki kichik modullar to'plamida), ehtimol ma'lumotga bardoshli modullardan foydalangan holda ajratib olishga harakat qilishi kerak.
10. Ichki tartib. Ichki protsedura yoki subroutin, uni chaqiradigan modulda joylashgan fizik jihatdan yopiq subroutin. Bir necha sabablarga ko'ra bunday tartiblardan qochish kerak. Ichki protseduralarni sinash uchun ajratish qiyin va ularni o'z ichiga olgan modullardan boshqa modulga chaqirish mumkin emas. Bu qayta foydalanish g'oyasiga mos kelmaydi. Albatta, muqobil variant mavjud - ichki protsedura nusxalarini kerakli barcha modullarga qo'shish. Biroq, bu ko'pincha xatolarga olib keladi (nusxalari ko'pincha "juda aniq emas") va dasturga xizmat ko'rsatishni murakkablashtiradi, chunki protsedura o'zgarganda barcha modullarni qayta to'ldirish kerak.
Xulosa;
Katta dasturlar odatda qismlarni ishlab chiqadi va tuzatadi. Shu bilan birga, har bir kichik dastur deb nomlangan ushbu qismni xuddi shu dasturda yoki hatto boshqa muammolarni echishda ham shunga o'xshash pastki qismni echishda foydalanish mumkin bo'lgan tarzda ishlab chiqish tavsiya etiladi. Borland Paskal ikki xil tartibni amalga oshiradi: protseduralar va funktsiyalar.