Кіріспе
Жетіспеушілік туралы сигнал беру екіжақты болатын шеткі жағдай Компьютерлік бағдарламалауда жартылай болжамды мәселе пайда болады, егер пайдалы мәнді қайтаруға арналған ішкі бағдарлама сәтсіз аяқталса, бірақ сәтсіздік туралы сигнал беру қайтарудың дұрыс мәнін қолданады. Мәселе, бұл жағдайда, субпрограмманы шақырушы нәтиженің не екенін айта алмайды.
In computer programming, a semipredicate problem occurs when a subroutine intended to return a useful value can fail, but the signalling of failure uses an otherwise valid return value. The problem is that the caller of the subroutine cannot tell what the result means in this case.
Мысал
Бөліну операциясы нақты санды береді, бірақ бөлгіш нөлге тең болған кезде сәтсіз болады. Егер біз бөліністі орындайтын функция жазсақ, 0 қайтаруды таңдауымыз мүмкін. Алайда, егер дивиденд 0 болса, онда нәтиже де 0 болады. Бұл дегеніміз, біз қайтара алатын нақты сан жоқ, өйткені барлық нақты сандар бөлу диапазонында.
Практикалық әсері
Алғашқы бағдарламалаушылар, мүмкін, ерекше жағдайларды, мысалы, бөлінуді, бөліну функциясын шақырудан бұрын, шақыру реттілігін енгізуді тексеруді талап ететін конвенцияны пайдалану арқылы жүргізді. Бұл екі проблемаға әкелді: бірінші, ол бөлуді орындаған барлық кодты (өте кең таралған операция) ауырлады; екінші, ол қайталамау және капсулалау принциптерін бұзды, оның біріншісі қайталанған кодты жоюды ұсынды, ал екіншісі деректерге байланысты кодты бір жерде қамтуды ұсынды (бұл бөлімнің мысалында енгізуді тексеру бөлек жасалды). Бөлуден күрделі есептеу үшін шақырушыға жарамсыз енгізуді тану қиын болуы мүмкін; кейбір жағдайларда енгізудің жарамдылығын анықтау бүкіл есептеуді орындау сияқты қымбат болуы мүмкін. Мақсатты функция да өзгертілуі мүмкін және содан кейін шақырушыдан басқа алғышарттар күтеді; мұндай өзгерту функция шақырылған әрбір жерде өзгерістерді қажет етеді.
Шешімдер
Жартылай болжамды проблема сәтсіздікке ұшырауы мүмкін функциялардың арасында жалпыға бірдей емес.
Қайту мәртебесіне арналған жалпы айнымалы
"Қалған" аргументіне ұқсас, жаһандық айнымалы қандай қате пайда болғанын (немесе жай ғана қате пайда болғанын) сақтай алады. Мысалы, егер қате пайда болса және белгіленсе (әдетте жоғарыда көрсетілгендей, заңсыз мәнмен, мысалы, -1) Unix errno айнымалысы қай мәннің пайда болғанын көрсету үшін орнатылады. Глобалды пайдаланудың әдеттегі кемшіліктері бар: желі қауіпсіздігі алаңдатады (заманауи операциялық жүйелер errno желі қауіпсіз нұсқасын қолданады), ал егер тек бір қателік глобалды қолданса, оның түрі жүйедегі барлық мүмкін қателер туралы барлық қызықты ақпаратты қамтуға жеткілікті кең болуы керек.
Ерекшеліктер
Ерекшеліктер - бұл мәселені шешу үшін кеңінен қолданылатын схемалардың бірі. Қате жағдайы функцияның қайтарылатын мәні болып саналмайды; қалыпты басқару ағыны бұзылады және қатеге қатысты нақты өңдеу автоматты түрде жүргізіледі. Олар жолақты сигнал берудің үлгісі.
Қолмен жасалған гибридтік типтер
C-де мүмкін болған жағдайда жалпы тәсіл функцияға қатаң қажеттіден кеңірек деректер түрін пайдалану болып табылады. Мысалы, getchar стандартты функциясы int түрін қайтарумен анықталады және сәттілік кезінде [0, 255] диапазонындағы мәнді (белгісіз char диапазоны) немесе кірудің соңында EOF мәнін (атқару анықталды, бірақ белгісіз char диапазонынан тыс) немесе оқу қатесін қайтарады.
Нөлге жатқызылған анықтама түрлері
Пойнтерлер немесе сілтемелер бар тілдерде бір шешім - құндылықтың өзіне емес, құндылыққа сілтемені қайтару. Бұл қайтару көрсеткіші қателіктерді көрсету үшін нөлге қойылуы мүмкін. Бұл әдетте, anyway сілтемесі қайтарылатын функцияларға сәйкес келеді. Бұл OOP ерекшеліктерді өңдеу стиліне қарағанда өнімділік артықшылығы бар, абайсыз бағдарламашылар қайтару мәнін тексермеуі мүмкін, нәтижесінде жарамсыз сілтемеші қолданылған кезде апат болады. Пойнтердің нөлдік немесе нөлдік еместігі - бұл предикат проблемасының тағы бір мысалы; нөлдік сәтсіздікті көрсететін жалауша болуы мүмкін немесе көрсеткінің мәні сәтті қайтарылады. UNIX ортасында қате себептерін көрсету үшін бөлек айнымалыны орнату кең таралған үлгі болып табылады. Бұған мысал ретінде C стандартты кітапханасының fopen функциясы келтіріледі.
Имплицитті гибридтік типтер
PHP және Lisp сияқты динамикалық типтелген тілдерде, әдеттегі тәсіл функцияны шақыру сәтсіз аяқталғанда false, none немесе null қайтару болып табылады. Бұл қалыпты қайтарым түрінен өзгеше түрді қайтару арқылы жұмыс істейді (осылайша түрді кеңейту). Бұл нөлдік сілтемені қайтарумен тең келетін динамикалық типті. Мысалы, сандық функция әдетте санды қайтарады (int немесе float), ал нөл дұрыс жауап болуы мүмкін, ал жалған емес. Сол сияқты, әдетте тізбекті қайтаратын функция кейде бос тізбекті жарамды жауап ретінде қайтарады, бірақ қателік кезінде жалғанды қайтарады. Бұл типті жонглирлеу процесі қайтару мәнін тексеруде мұқият болуды қажет етеді: мысалы, PHP-де тек === (яғни, тең және бірдей типті) емес, == (яғни, автоматты түр түрлендіруден кейін тең) пайдаланыңыз. Бұл тек бастапқы функция бульдік мәнді қайтару үшін емес болған кезде ғана жұмыс істейді және қате туралы ақпаратты басқа құралдармен жеткізуді талап етеді.
Айқын гибридтік типтер
Хаскелл және басқа да функционалдық бағдарламалау тілдерінде кез келген мүмкін болатын нәтижені көрсету үшін қажетті мөлшерде үлкен дерек түрін пайдалану кең таралған. Мысалы, біреу Maybe Real түрін қайтарған бөліну функциясын және Either String Char қайтаратын getchar функциясын жаза алады. Біріншісі - опция түрі, оның бір ғана қате мәні бар, Ешнәрсе. Екінші жағдай - белгіленген одақ: нәтижесі сипаттамалық қате хабарламасы бар немесе сәтті оқылған таңбалы кейбір тізбек. Хаскеллдің типтік тұжырымдау жүйесі шақырушылардың мүмкін болатын қателермен айналысуын қамтамасыз етуге көмектеседі. Қате жағдайлары функция түрінде айқын бола бастағандықтан, оның қолтаңбасына қарап, бағдарламашыға қателерді қалай емдеу керектігін дереу айтады. Сонымен қатар, белгіленген одақтар мен опция түрлері тиісті функцияларға ие болған кезде монодалар құрайды: бұл кодты автоматты түрде өңдеусіз қате жағдайларын тарату арқылы таза ұстау үшін пайдаланылуы мүмкін.