|
||||||||||||||||||||||||||||||||||||||||||||||||
3-4 дәрістер. Программалық жабдықтардың технологиялық сипаттамаларын анықтауЖалпы «технологиялық тиімділік» деп, программалық жабдық тың жобасының сапасын тү сінеді. Программалық жабдық ты жасауғ а жә не оны кейіннен жетілдіріп отыруғ а кететін ең бек жә не материалдық ресурстар тікелей жобамен (проектімен) байланысты болады. Барынша жан-жақ ты, сауатты қ ұ рылғ ан жобаны кодтау, тестілеу, жө ндеу жә не жә не модификациялау да жең іл болады. Программисттердің жинақ талғ ан тә жірибелері бойынша программалық жабдық тың технологиялылығ ы келесі факторлармен анық талады: - модельдің жан-жақ ты қ арастырылғ андығ ы (проработанность моделей); - модульдердің ө зара тә уелсіздігінің дең гейі (уровень независимости модулей); - программалау стилі (стиль программирования); - кодтарды қ айталап қ олдану дә режесі (степень повторного использования кодов). Програрммалық жабдық тың моделі неғ ұ рлым толық зерттелген, жан-жақ ты ескеріліп жасалғ ан болса, онда жалпы есепке кіретін бө лек есептерді (подзадачаларды), мә ліметтердің қ ұ рылымын жә не т. б. анық тау да соғ ұ рлым нақ тырақ болады, оларды жобалау жә не жү зеге асыру жең іл болады, қ ателер азаяды. Ал модульдер неғ ұ рлым ө зара тә уелсіз болса, соғ ұ рлым олардың жү зеге асырылуы, модификациялануы, олардағ ы қ атені іздеу жә не т. б. жең іл болады. Программалау стилі деп программаны ә рлеу стилін жә не қ ұ рылымдылығ ын тү сінеді. Программаның қ ұ рылымдылығ ы оның оқ ылуына (читаемость программы) жә не программалауда қ ате жіберілмеуіне ә сер етеді. ХХ ғ асырдың 60-жылдарындағ ы кризис, яғ ни спагетти- программалар осы қ ұ рылымдылық тың болмауының нә тижесі. Кодтардың қ айта пайдаланылу дә режесі, бұ л бұ рыннан бар кітапханаларды, кластарды, подпрограммаларды пайдаланумен жә не жаң адан жасалғ ан кодтарды унификациялаумен анық талады. Бұ л барлық жағ дайда тиімді болмауы мү мкін, мысалы кодтарды қ айта пайдалану жасанды тү рде жоғ арылатылса, онда жобаның технологиялылығ ы да соғ ұ рлым тө мендеуі мү мкін. Программалық жабдық тың жалпы қ ұ рылымы анық талғ аннан кейін, ә детте ұ станым таң далынады: қ ұ рылымдық ұ станым немесе объектілік ұ станым немесе компоненттік ұ станым. Ұ станым анық талғ аннан кейін, жоғ арыдағ ы айтылғ ан программаның жалпы қ ұ рылымын жеке компоненттерге декомпозициялау басталады, бұ л декомпозиция мү мкін емес болғ анғ а дейін жү реді. Мұ ндай декомпозицияның нә тижесі, қ ұ рылымдық ұ станымда – подпрограммалар мен модульдердің иерархиясы болып шығ ады, ал объектілік ұ станымды пайдаланатын декомпозиялауда, класстар тү ріндегі иерархия алынады. Модуль (Unit) – жеке автономды тү рде компиляцияланатын программаның бірлігі. Модульдердің ө зара тә уелсіздігі екі критериймен анық талды: жабысу(сцепление) жә не байланысу (связность). Жабысу – бұ л модульдердің бір-бірінен неғ ұ рлым алшақ тығ ын анық тайды. Егер бір модульде екінші модуль туралы ешқ андай ақ парат берілмесе, онда олар тә уелсіз, ал олар бір-бірі туралы ақ парат сақ тайтын болса, онда жабысқ ан болып есептеледі. Жабысудың келесі тү рлері анық талғ ан: - мә ндер бойынша (по данным); - ү лгі бойынша (по образцу); - басқ ару бойынша (по управлению); - жалпы мә ліметтер орналасқ ан облыс бойынша (по общей областей данных); - ішкі компоненттері, мә ліметтері бойынша (по содержимому). Егер «жабысу» жеке-жеке модульдердің бір-біріне алшақ тық арақ атынасын анық таса, «байланысу» бір модуль ішіндегі программалық элементтердің ө зара байланысу дең гейін анық тайды. Ө зара тығ ыз байланыста болатын элементтерді бір модульге орналастырғ ан тиімді болады, ал егер оларды ә ртү рлі модульдерге орналастырса модульдердің бір-біріне тә уелділігі артады, бұ л қ иынырақ болады. Ә лсіз байланысқ ан элементтерді де бір модульде пайдалану оның технологиялылығ ын тө мендетеді. Ә зірге байланысудың келесі тү рлері анық талғ ан(кему дә режесіне қ арай): - функционалды (функциональная); - тізбектей (последовательная); - ақ параттық (коммуникативная или информационная); - процедуралық (процедурная); - уақ ытша (временная); - логикалық (логическая); - кездейсоқ (случайная). Программалық жабдық ты қ ұ руда қ олданылатын негізгі екі ә діс: - тө меннен жоғ ары қ арай жобалау (восходящий метод); - жоғ арыдан тө мен қ арай жобалау(нисходящий метод). «Жоғ ары қ арай жү ру» ә дісі бұ л бірінші пайда болды, мұ нда программаның ең тө мені элементтері, сонан соң одан жоғ ары элементтері т. с. сияқ ты жасалады. Бұ л ә дістің тиімсіз жағ ы, кейін біріктірген кезде компоненттер ө зара ү йлеспей қ алады, программа интерфейсі ең соң ынан жасалады, яғ ни оны алдын-ала кө рсетіп алу мү мкіндігі жоқ. Бұ л ә діс ө ндірісте қ олданылмайды, ә детте оқ ыту ү шін қ олданылады. «Тө мен қ арай» программалау мұ нда программаның бірінші жоғ ары дең гейдегі компоненттері жобаланады, ә рі қ арай біртіндеп тө менгі дең гейдегі компоненттері жасала береді, мұ нда программаның жасалғ ан бө лігін тестілеу ү шін ә лі жасалмағ ан тө мендегі компоненттерді арнайы модульдермен («заглушка» программа) алмастыра тұ рады. Қ ұ рылымдық программалауда, жалпы есептеу процесі ү ш тү рлі ұ йымдастырылады: ызық тық, тармақ талатын жә не қ айталанатын. Бұ л процесстерді жү зеге асыру ү шін жоғ ары дең гейдегі программалау тілдерінде арнаулы басқ арушы операторлар (if, while) қ олданылады, ал бұ рынғ ы тө менгі дең гейдегі тілдерде басқ ару жолғ а кө шу арқ ылы беріліп, спагетти- программалар шығ атын болды. Сонымен, 1960 жылдардан бастап осы ү ш конструкцияны «базалық қ ұ рылымдар» деп қ абылдау келісілген, оның жазылуының бірнеше тү рлі нотациялары бар: блок-схема, псевдокод, Flow-формалар, Насси-Шнейдерман диаграммасы жә не т. б. . Мысалы, базалық қ ұ рылымдардың блок-схема тү ріндегі жазылуы (3. 5- сурет):
3. 5- сурет. Базалық қ ұ рылымдардың блок-схема тү ріндегі жазылуы
Программада қ ұ рылымдық ә дісті кө рсету ү шін жоғ арыдағ ы блок-схемаларды пайдалану ө те ү лкен болады жә не кү рделі алгоритмдерді беруде оның мағ ынасын жоғ алтып алады, яғ ни детализациялау дең гейі тө мендеп кетеді, сондық тан программа қ ұ рылымын кө рсету ү шін блок-схемадан басқ а: псевдокодтар, Flow-формалар жә не Насси-Шнейдерман диаграммалары қ олданылады. Псевдокод – бұ л алгоритмді мә тін тү рінде (текстовая нотация) жазып шығ у. Псевдокодтарды жазудың бірнеше варианттары кездеседі. Мысалы, бір нұ сқ асы тө мендегі кестеде берілген (3. 6-сурет):
3. 6- сурет. Базалық қ ұ рылымдардың псевдокод тү ріндегі жазылуы
Flow-формалар қ ұ рылымдық алгоритмдерді жазуғ а арналғ ан графикалық нотация. Flow-форманың ә рбір символы – бір басқ арушы қ ұ рылымды білдіретін тө ртбұ рыш тү рінде болады (3. 7- сурет), мысалы:
3. 7- сурет. Базалық қ ұ рылымдардың Flow-форма тү ріндегі жазылуы
Насси-Шнейдерман диаграммасы (3. 8- сурет), бұ л Flow-формалардың жетілдірілген тү рі болып табылады, егер Flow-формада бә рі тө ртбұ рыш тү рінде берілсе мұ нда тармақ талу шарттары ү шбұ рыш тү рінде кө рсетіледі, мысалы:
3. 8- сурет. Базалық қ ұ рылымдардың Насси-Шнейдерман диаграммасы тү ріндегі жазылуы
Программаны ә рлеу стиліне тө мендегілер кіреді: - программадағ ы объектілерге, айнымалыларғ а, функцияларғ а дұ рыс, мағ ыналы атаулар беру, мысалы Max_Item, Next_Item; - модульді дұ рыс жазу ережесі: модульдің аты, қ ысқ аша сипаттамасы (не ү шін қ олданылады), кіріс жә не шығ ыс параметрлерінің қ ысқ аша сипаттамасы, оғ ан қ атысатын модульдер тізімі алгоритмнің қ ысқ аша сипаттамасы немесе шектеулер; - программаның авторы туралы мә ліметтер; - идентификациялаушы ақ парат (сериялық номер, нұ сқ а номері жә не т. б. ) - модульдің мә тінін ә рлеу стилі жә не т. б. Жалпы программалауда программаның тиімділігі оның жылдам орындалуымен жә не жады кө лемін аз пайдалануымен анық талады. Кейбір фрагменттердің дұ рыс жазылуы, мысалы, кө п қ айталануы тиіс циклдер программаның орындалу уақ ытына тікелей ә сер етеді. Қ азіргі программалау жү йелерінде программалық жабдық тың тиімділігін оптимизациялауды кө бінесе компиляторлар орындайды. Программаның орындалу уақ ытын азайту ү шін қ олданылатын тә сілдер де, бұ л ә сіресе кө п қ айталанатын циклдарды программалауда кездеседі: - цикл параметрлеріне тә уелсіз шамаларды, ө рнектерді циклдан шығ ару, мысалы: for (int i=0; i< 99; i++) for (int j=0; j< 99; j++) a[320*i+j]=s[k, l].
бұ л циклда *(кө бейту 320*i) 10000 рет жә не, s[k, l] элементін шақ ыру, яғ ни массивке сұ раныс жасау 10000 рет орындалады. Егер осы жазуды келесі тү рде жазсақ 320=28 +26 деп алсақ , сонда келесі тү рде жазуғ а болады: skl=s[k, l]; //массив элементін шақ ыруды цикл сыртына шығ ару for (int j=0; j< 99; j++) { KomAin=j< < 8+s< < 6 //320*i кө бейтуді жылжытумен алмастыру for (int i=0; i< 99; i++) a[KomAin+i]=skl; }… - ұ зақ «кө бейту» амалынан қ ұ тылу, ол ү шін оларды қ осумен, азайтумен, жылжытумен алмастыру; - ө рнектерде типтерді тү рлендіруді азайту; - шарттарды тексеруде, артық тексерулер жасамау; - массив элементіне индекстері бойынша сұ раныс жасамауғ а тырысу, себебі сол элементтің адресін табу ү шін индекстердің мә ніне кө бейту амалы орындалады, сондық тан жадыдан массив элементтерінің мә нін бір рет оқ ып алып, оны бір скаляр шамағ а меншіктеп, оны керек жерде пайдалана беруге болады. Программаны компиляциялау жә не жинау кезіндегі қ ателерден, яғ ни синтаксистік қ атеден басқ а программаның орындалу кезінде пайда болатын қ ателер болады, ә детте, оларды динамикалық қ ателер деп атайды. Олардың кө рінуі де тү рліше болады, мысалы жү йе қ ате туралы хабарлама береді немесе тұ рып қ алады, тү сініксіз нә тижелер де беруі мү мкін. Сондық тан программалауда кетуі мү мкін қ ателерді алдын ала ескеріп, оларды уақ ытында табу жә не жою ү шін арнаулы ә дістер қ олданылады. Мұ ның барлығ ы программалауда «ерекше жағ дайларды ө ң деу» (обработка исключительных ситуации) деп аталатын мә селеге ә келеді. Ерекше жағ дайларды ө ң деу механизмі арнаулы аппараттық немесе тілдік қ ұ ралдар кө мегімен қ ателерді тауып алып, оны ө ң деуге мү мкіндік береді, яғ ни программаның қ ауіпті жағ дайда қ алуына жол бермейді.
|
||||||||||||||||||||||||||||||||||||||||||||||||
|