Кіріспе

Компьютерлік жүйелердің күрделілігін ұйымдастыру техникасы

Бағдарламалық инженерия және компьютерлік ғылымда абстракция – бұл объектілер мен жүйелерді зерттеу кезінде атрибуттар сияқты нақты егжей-тегжейлерден алыстау және маңыздырақ мәліметтерге назар аудару процесі. Абстракция – компьютерлік ғылым мен бағдарламалық инженерияның, әсіресе объектіге бағытталған бағдарламалау парадигмасының негізгі ұғымы. Мысалдары:

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

Негізгі себептері

Компьютерлік технология көбінесе нақты әлемнен тәуелсіз жұмыс істейді. Аппараттық құрал басқалармен алмастырылатын есептеу моделін іске асырады. Бағдарламалық жасақтама архитектураға сәйкес құрылған, бұл адамдарға бір уақытта бірнеше мәселеге назар аудару арқылы үлкен жүйелерді құруға мүмкіндік береді. Бұл архитектуралар абстракцияның нақты таңдауларынан тұрады. Гринспанның оныншы қағидасы – мұндай архитектураның қажеттілігі мен күрделілігі туралы айтқан афоризм. Тілдік абстракция – компьютерлік технологиядағы маңызды абстракция түрі: жүйенің нақты аспектілерін бейнелеу үшін жаңа жасанды тілдер жасалады. Модельдеу тілдері жоспарлауға көмектеседі. Компьютерлік тілдерді компьютермен өңдеуге болады. Бұл абстракция процесінің мысалы – бағдарламалау тілінің машина тілінен ассамблер тіліне және жоғары деңгейдегі тілге қадамдық дамуы. Әрбір кезең келесі кезеңге көшу үшін негіз ретінде пайдаланылуы мүмкін. Тілдік абстракция, мысалы, сценарийлік тілдерде және салалық бағдарламалау тілдерінде де жалғасады. Бағдарламалау тіліндегі кейбір мүмкіндіктер бағдарламашыға жаңа абстракциялар жасауға мүмкіндік береді. Оларға кіші бағдарламалар, модульдер, полиморфизм және бағдарламалық компоненттер кіреді. Басқа абстракциялар, мысалы, бағдарламалық жасақтаманы жобалау үлгілері мен архитектуралық стильдер аудармашыға көрінбейді және жүйенің жобасында ғана қолданылады. Кейбір абстракциялар бағдарламашының назарында болуы тиіс ұғымдардың шегін қысқартуға тырысады, олар негізделген абстракцияларды толығымен жасырады. Бағдарламалық инженерия және жазушы Джоэл Спольски осы әрекеттерді сынға алып, барлық абстракциялар «тесікті» (leaky) дейді, олар төмендегі егжей-тегжейлі ақпаратты толығымен жасыра алмайды; алайда, бұл абстракцияның пайдалылығын жоққа шығармайды. Кейбір абстракциялар басқа абстракциялармен өзара әрекеттесу үшін жасалған – мысалы, бағдарламалау тілінде төменгі деңгейдегі тілге шақырулар жасау үшін сыртқы функция интерфейсі болуы мүмкін.

Бағдарламалау тілдері

Бағдарламалау тілдері тілдің арналған қолданысына байланысты абстракцияның әртүрлі түрлерін ұсынады. Мысалы: C++, Object Pascal немесе Java сияқты объектіге бағытталған бағдарламалау тілдерінде абстракция ұғымы өзі декларативтік мәлімдемеге айналады – синтаксис функция((параметрлер) = 0; (C++) немесе түйінді сөздер абстракт және интерфейс (Java) арқылы. Мұндай мәлімдемеден кейін, декларацияның нысанын құру үшін бағдарламашы сыныпты іске асыруға жауапты болады. Функционалдық бағдарламалау тілдері көбінесе функциялармен байланысты абстракцияларды көрсетеді, мысалы, лямбда абстракциялары (бір терминді кейбір айнымалының функциясы етіп жасау) және жоғары ретті функциялар (параметрлер функциялар болады). Clojure, Scheme және Common Lisp сияқты Lisp бағдарламалау тілдері отбасының қазіргі мүшелері синтаксистік абстракцияға мүмкіндік беру үшін макро жүйелерін қолдайды. Scala сияқты басқа бағдарламалау тілдерінде де макростар немесе оған өте ұқсас метапрограммалау мүмкіндіктері бар (мысалы, Haskell-де Template Haskell, ал OCaml-де MetaOCaml бар). Бұл бағдарламашыға үлгі кодты жоюға, маңызды емес функция шақыру тізбектерін абстракциялауға, жаңа басқару ағыны құрылымдарын іске асыруға және доменге арналған тілдерді (DSL) іске асыруға мүмкіндік береді, олар доменге арналған нақты ұғымдарды қысқа және әдемі түрде білдіруге мүмкіндік береді. Бұлардың барлығы дұрыс қолданылса, бағдарламашының тиімділігін және кодтың түсініктілігін арттырады, себебі мақсатты мақсатты анықтайды. Синтаксистік абстракцияның салдарынан кез келген Lisp диалектісі және, шын мәнінде, кез келген бағдарламалау тілі, Python, C немесе Java сияқты «дәстүрлі» бағдарламалау тілдерімен салыстырғанда, айтарлықтай төмендеуімен (бірақ көбінесе әлі де маңызды емес) қазіргі заманғы Lisp-те іске асырылуы мүмкін.

Анықтама тілдері

Анықтама тілдері әдетте бір немесе басқа абстракцияларды қолданады, себебі ерекшеліктер жобаның басында (және одан да жоғары деңгейде) анықталады, ал нақты іске асыру кейін жасалады. Мысалы, UML анықтама тілі абстрактілі сыныптарды анықтауға мүмкіндік береді, және шарлау жобасында олар жобаның архитектурасы мен ерекшеліктерді жобалау кезеңінде абстрактілі күйде қалады.

Құрылымдық бағдарламалау

Құрылымдық бағдарламалау күрделі бағдарламалық міндеттерді нақты ағын бақылауымен және компоненттер арасындағы интерфейстері бар кішірек бөліктерге бөлуді қамтиды, бұл жанама әсерлердің күрделігін азайтады. Жай бағдарламада бұл циклдардың бір немесе айқын шығу нүктелеріне және (мүмкін болған жағдайда) функциялар мен процедуралардың бір шығу нүктесіне ие болуын қамтамасыз етуді мақсат етеді. Үлкен жүйеде бұл күрделі міндеттерді көптеген модульдерге бөлуді қамтуы мүмкін. Кемедегі және жағажайдағы кеңселерде еңбекақыны басқаратын жүйені қарастырайық: ең жоғарғы деңгейде әдеттегі соңғы пайдаланушы операцияларының мәзірі болуы мүмкін. Оның ішінде қызметкерлерді тіркеу және тіркеуден шығару немесе чектерді басып шығару сияқты міндеттер үшін жеке орындалатын файлдар немесе кітапханалар болуы мүмкін. Осы дербес компоненттердің әрқайсысында бағдарламаның бір бөлігін шешуге арналған бағдарламалық кодты қамтитын көптеген әртүрлі бастапқы файлдар болуы мүмкін, бағдарламаның басқа бөліктеріне тек таңдалған интерфейстер ғана қол жетімді. Тіркеу бағдарламасында әр деректерді енгізу экраны үшін және деректер базасы интерфейсі үшін бастапқы файлдар болуы мүмкін (ол өзі жеке үшінші тарап кітапханасы немесе кітапхана процедураларының статикалық байланысты жиынтығы болуы мүмкін). Деректер базасы немесе еңбекақы бағдарламасы кеме мен жағажай арасындағы деректерді алмасу процесін бастауы керек, ал бұл деректерді беру міндеті көбінесе көптеген басқа компоненттерді қамтиды. Бұл қабаттар бір компоненттің іске асыру егжей-тегжейін және оның ішкі әдістерін басқалардан оқшаулау әсерін тудырады. Объектіге бағытталған бағдарламалау осы ұғымды қабылдайды және кеңейтеді.

Деректерді абстракциялау

Деректерді абстракциялау дерек типінің абстрактілі қасиеттері мен оның іске асылуының нақты егжей-тегжейлері арасында нақты айырмашылықты қамтамасыз етеді. Абстрактілі қасиеттер – дерек типін пайдаланатын клиенттік кодқа көрінетін қасиеттер, яғни дерек типіне қол жеткізу интерфейсі, ал нақты іске асылу толығымен жасырын күйде сақталады және, мысалы, уақыт өте келе тиімділікті арттыру мақсатында өзгеруі мүмкін. Мұндай өзгерістер клиенттік кодқа ешқандай әсер етпеуі керек, себебі олар абстрактілі мінез-құлықта ешқандай өзгеріс жасамауы тиіс. Мысалы, кілттерді мәндермен бірегей байланыстыратын және кілттері бойынша мәндерді алуға мүмкіндік беретін іздеу кестесі деп аталатын абстрактілі дерек типін анықтауға болады. Мұндай іздеу кестесі түрлі тәсілдермен іске асырылуы мүмкін: хэш-кесте, екілік іздеу ағашы немесе тіпті (кілт: мән) жұптарының қарапайым тізімі ретінде. Клиенттік код тұрғысынан, типтің абстрактілі қасиеттері барлық жағдайда бірдей болады. Әрине, бұл интерфейстің егжей-тегжейлерін дұрыс анықтауға байланысты, өйткені кез келген өзгеріс клиенттік кодқа елеулі әсер етуі мүмкін. Мұны бір қарапайым мысалмен түсіндіруге болады: интерфейс дерек типі мен клиенттік код арасындағы келісілген мінез-құлық бойынша шартты құрайды; шартта көрсетілмеген нәрсе ешбір хабарламасыз өзгеруі мүмкін.

Деректерді қолмен алу

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

Нысанға бағдарланған жобалау

Объектіге бағытталған жобалау мен домендік талдаудың басты мәселесі – нені абстракциялауға және нені кодтаушының бақылауында қалдыруға қатысты шешімдерді қабылдау болып табылады. Нақты әлемдегі тиісті қатынастарды анықтау, шындығында, объектіге бағытталған талдау немесе ескі жүйелерді талдау мәселесі. Жалпы, тиісті абстракцияны анықтау үшін, алдымен ауқым туралы көптеген шағын шешімдер қабылдау керек (домендік талдау), содан кейін қандай басқа жүйелермен ынтымақтасу қажеттігін анықтау (ескі жүйелерді талдау) және жобаның уақыты мен бюджеті шектеулі болғанда объектіге бағытталған жобалау ретінде көрінетін егжей-тегжейлі объектіге бағытталған талдау жүргізу қажет. Біздің қарапайым мысалымызда, домен – шаруа қожалығы, тірі шошқалар мен сиырлар және олардың тамақтану әдеттері – ескі жүйелердің шектеулері, егжей-тегжейлі талдау – кодтаушылар қолда бар нәрсемен жануарларды тамақтандыруға мүмкіндікке ие болуы керек, сондықтан тамақ түрін сыныптың өзіне енгізудің қажеті жоқ, ал жобалау – шошқалар мен сиырлардың бірдей функцияларды орындайтын жағдайлары бар бір қарапайым «Жануар» класы. «Сүттен тамақтанатын жануар» (DairyAnimal) класын бөліп қарау шешімі егжей-тегжейлі талдауды өзгертеді, бірақ домендік және ескі жүйелерді талдау өзгеріссіз қалады – сондықтан бұл бағдарламашының толық бақылауында болады және объектіге бағытталған бағдарламалауда абстракция деп аталады, бұл домендік немесе ескі жүйелерді талдаудағы абстракциядан өзгеше.

Қарастырылатын мәселелер

Бағдарламалау тілдерінің формальды семантикасын, формальды әдістерді немесе абстрактілі интерпретацияны талқылау кезінде абстракция – байқалатын бағдарлама мінез-құлқының бәрінен гөрі егжей-тегжейсіз, бірақ қауіпсіз анықтамасын қарастыру амалы. Мысалы, бағдарлама орындалуының барлық аралық қадамдарын ескерудің орнына, тек орындалудың соңғы нәтижесін қарастыруға болады. Абстракция нақты (дәлірек) орындалу моделіне қатысты анықталады. Егер нақты немесе абстрактілі модель бойынша белгілі бір қасиет туралы сұраққа бірдей жауап беруге болады, онда абстракция сол қасиетке қатысты дәл немесе сенімді болуы мүмкін. Мысалы, егер тек толық сандарды (+, -, ×) қолданатын математикалық өрнектің бағалау нәтижесі n модулі бойынша қандай екенін білгіңіз келсе, барлық амалдарды n модулі бойынша орындау жеткілікті (осы абстракцияның таныс түрі – тоғызды шығару). Дегенмен, абстракциялар міндетті түрде дәл болмаса да, сенімді болуы керек. Яғни, абстракция шешілмейтін нәтижеге әкелсе де, одан дұрыс жауаптар алуға болады. Мысалы, сыныптағы студенттерді олардың ең кіші және ең үлкен жастары арқылы абстракциялауға болады; егер белгілі бір адам сол сыныпқа жата ма деп сұралса, оның жасын ең кіші және ең үлкен жастармен салыстыруға болады; егер жасы осы диапазоннан тыс болса, адам сол сыныпқа жатпайды деп сенімді жауап беруге болады; әйтпесе, тек «Білмеймін» деп жауап беруге болады. Бағдарламалау тіліндегі абстракция деңгейі оның жалпы қолдануына әсер ете алады. Когнитивтік өлшемдер аясында формализмде абстракция градиенті ұғымы бар. Бұл аяқ шеңбері бағдарламалау тілінің дизайнеріне абстракция мен дизайнның басқа да ерекшеліктері арасындағы компромистерді зерттеуге және абстракциядағы өзгерістер тілдің қолдануына қалай әсер ететінін анықтауға мүмкіндік береді. Абстракция компьютерлік бағдарламалармен жұмыс істегенде пайдалы болуы мүмкін, себебі компьютерлік бағдарламалардың тривиальды емес қасиеттері негізінен шешілмейді (Райс теоремасын қараңыз). Осының салдарынан, компьютерлік бағдарламалардың мінез-құлқы туралы ақпаратты алудың автоматты әдістері тоқтатуды (кейде сәтсіздікке ұшырауы, құлауы немесе нәтиже бермеуі мүмкін), сенімділікті (қате ақпарат беруі мүмкін) немесе дәлдікті (кейбір сұрақтарға «Білмеймін» деп жауап беруі мүмкін) құрбан етуге мәжбүр. Абстракция – абстрактілі интерпретацияның негізгі ұғымы. Модельді тексеру әдетте зерттеліп отырған жүйелердің абстрактілі нұсқаларында жүзеге асырылады.

Абстракциялау деңгейлері

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