Кіріспе
Бағдарламаның бастапқы кодына деректерді енгізу. Қатты кодтау (немесе қатты кодтау, қатты кодтау) – бағдарламалық жасақтаманы дамыту тәжірибесі, онда деректер бағдарламаның бастапқы кодына немесе басқа орындалатын нысандарға сыртқы көздерден алуға немесе орындалу кезінде жасауға қарағанда тікелей енгізіледі. Қатты кодталған деректерді әдетте бастапқы кодты өңдеу және орындалатын файлды қайта құрастыру арқылы ғана өзгертуге болады, бірақ оны түзету құралы немесе алтылық редактор арқылы жадта немесе дискіде өзгертуге болады. Қатты кодталған деректер физикалық тұрақтылар, нұсқа нөмірлері және статикалық мәтін элементтері сияқты өзгермейтін ақпарат үшін ең қолайлы. Ал softcoded деректер, керісінше, пайдаланушы енгізген мәліметтер, мәтіндік файлдар, INI файлдары, HTTP сервер жауаптары, конфигурациялық файлдар, алдын ала өңдеуші макростары, сыртқы тұрақтылар, деректер базалары, командалық жол аргументтері арқылы кез келген ақпаратты кодтайды және орындалу кезінде анықталады.
Hard coding (also hard coding or hardcoding) is the software development practice of embedding data directly into the source code of a program or other executable object, as opposed to obtaining the data from external sources or generating it at runtime. Hard coded data typically can only be modified by editing the source code and recompiling the executable, although it can be changed in memory or on disk using a debugger or hex editor. Data that is hard coded is best suited for unchanging pieces of information, such as physical constants, version numbers, and static text elements. Softcoded data, on the other hand, encodes arbitrary information through user input, text files, INI files, HTTP server responses, configuration files, preprocessor macros, external constants, databases, command line arguments, and is determined at runtime.
Шолу
Қатты кодтау бағдарламаның бастапқы кодын енгізу деректері немесе қажетті формат өзгерген сайын өзгертуді талап етеді, ал соңғы пайдаланушыға бағдарламадан тыс құралдармен егжей-тегжейлі өзгертулер жасау ыңғайлы болуы мүмкін. Қатты кодтау көбінесе қажет болады, бірақ сонымен бірге анти-үлгі ретінде қарастырылуы мүмкін. Бағдарламашылар соңғы пайдаланушы үшін динамикалық интерфейс шешімін әзірлемеген болуы мүмкін, бірақ олар мүмкіндікті немесе бағдарламаны іске қосуы керек. Бұл әдетте уақытша шешім, бірақ қысқа мерзімде кодты тапсыру қысымын азайтады. Кейіннен, нәтижелерді немесе оқиғаларды өзгертуге пайдаланушыға мүмкіндік беру үшін параметрлерді беруге рұқсат беретін жұмсақ кодтау қолданылады. "Қатты кодталған" термині бастапқыда аппараттық тізбектерге ұқсастық ретінде пайдаланылған және бағдарламалық жасақтаманы жобалау мен іске асыруда туындайтын икемсіздікті білдіруге арналған. MUD сияқты орындалу кезінде кеңейтілетін ынтымақтастық даму орталарында қатты кодтау жүйенің негізгі қозғалтқышын әзірлеуді білдіреді, ол төменгі деңгейдегі тапсырмалар мен скрипттерді орындау үшін жауапты, ал жұмсақ кодтау – мәтіндік файлдар, INI файлдары, препроцессор макростары, сыртқы тұрақтылар, деректер базалары, командалық жол аргументтері, HTTP сервер жауаптары, конфигурациялық файлдар және пайдаланушы енгізетін мәліметтер сияқты сыртқы көздерден алынған мәндермен түсіндірілетін жоғары деңгейдегі скрипттерді әзірлеуді білдіреді. Бұл жағдайда термин жағымсыз емес және нақты шығыс деректерін ендірудің орнына жалпы дамуды білдіреді.
Қатты кодтау және артқы есіктер
Тәуелсіздіктерді кодқа тікелей енгізу – артқы есік құрудың кең таралған тәсілі. Тікелей енгізілген тәуелсіздіктер әдетте конфигурациялық файлдарда немесе тіркелгіні санау командаларының нәтижесінде көрінбейді және пайдаланушылар оларды оңай өзгерте алмайды немесе айналып өте алмайды. Егер олар табылып қалса, пайдаланушы мұндай артқы есікті бағдарламаның бастапқы кодынан (егер ол қолжетімді болса) өңдеу және қайта құру, декомпиляциялау немесе бағдарламалық жасақтаманы кері инженериялау, бағдарламаның екілік кодын тікелей өңдеу, немесе күтпеген қол жеткізуді болдырмау үшін тұтастық тексеруін (мысалы, цифрлық қолтаңбалар, бұзылмауға қарсы және алдауға қарсы шаралар) енгізу арқылы жоюға тырысуы мүмкін, бірақ мұндай әрекеттерге көбінесе соңғы пайдаланушының лицензиялық шарты тыйым салады.
Қатты кодтау және DRM
Цифрлық құқықтарды басқару шарасы ретінде бағдарламалық жасақтаманы жасаушылар бірегей сериялық нөмірді бағдарламаға тікелей енгізе алады. Сонымен қатар, ашық кілтті енгізу арқылы DRM құру да кең таралған, онда кілт жасаушы бағдарламаны жасау мүмкін емес. Ал бағдарламаны бұзушылар бағдарламаға жарамды сериялық нөмірді енгізе алады, тіпті орындалатын файлдың пайдаланушыдан нөмір сұрауын тоқтатып, рұқсатсыз көшірмелерді жарамды нөмірді енгізбей таратуға мүмкіндік береді, осылайша барлық көшірмелер бір кілтті пайдаланады, егер ол кілт бағдарламаға енгізілген болса.
Белгіленген орнату жолы
Егер Windows бағдарламасы C:\Program Files\Appname мекенжайына орнатылған деп бағдарламаланған болса, және біреу оны орын үнемдеу немесе ұйымдастыру мақсатында басқа дискке орнатуға тырысса, орнату сәтсіз аяқталуы немесе орнатудан кейін іске қосылмауы мүмкін. Бұл мәселе сынақ процесінде анықталмауы мүмкін, себебі көптеген пайдаланушылар бағдарламаны әдепкі диск пен каталогқа орнатады, ал сынақтар орнату каталогын өзгерту мүмкіндігін қамтымайды. Дегенмен, бағдарламашылар мен әзірлеушілер бағдарламаның орнату жолын қатаң түрде белгілемеуі керек, өйткені әдепкі орнату жолы операциялық жүйеге, ОЖ нұсқасына және жүйелік әкімшінің шешімдеріне байланысты. Мысалы, Microsoft Windows-тың көптеген орнатулары C: дискісін негізгі қатты дискі ретінде пайдаланады, бірақ мұндай нәрсе кепілденбеген. Бұған ұқсас мәселе ерте компьютерлердегі микропроцессорларда да болды, олар жадта белгілі бір мекенжайдан орындалуды бастады.
Бастауыш дискі
Кейбір "көшірмеден қорғалған" бағдарламалар рұқсатсыз көшірмелер емес екенін тексеру үшін іске қосылғанда дискетада немесе флэш-дискідегі белгілі бір файлды іздейді. Егер компьютер жаңа машинамен ауыстырылса, онда дискета жетегі болмағандықтан, оны қажет ететін бағдарламаны іске қосу мүмкін болмайды. Осы мысал қатты кодтаудың, тіпті ол толыққанды жұмыс істейтіндей сезілсе де, кейде тиімсіз болуы мүмкін екенін көрсетеді. 1980-ші және 1990-шы жылдары көптеген дерлік компьютерлер кем дегенде бір дискета жетегімен жабдықталған, бірақ кейін дискеталар қолданыстан шықты. Егер осыдан 15 жыл бұрын осындай әдіспен жазылған бағдарлама жаңартылмаса, ол қиындықтарға тап болуы мүмкін.
Арнайы қапшықтар
Кейбір Windows операциялық жүйелерінде файлдарды қатты дискіде логикалық түрде ұйымдастыратын, «Арнайы қалталар» деп аталатын қалталар бар. Қатты кодтауға байланысты туындауы мүмкін мәселелер бар:
Профиль жолы
Кейбір Windows бағдарламалары профиль жолын әзірлеушілер анықтаған C:\Documents and Settings\Username сияқты белгілі бір орындарға тікелей енгізіп қояды. Бұл Windows 2000 және одан кейінгі нұсқаларының көп бөлігі үшін дұрыс жол болғанымен, егер профиль желіде сақталса немесе басқа жерге көшірілсе, қате тудыруы мүмкін. Оны дұрыс алу үшін GetUserProfileDirectory функциясын шақыру немесе %userprofile% орта айнымалысын анықтау қажет. Дамушылар көбінесе профиль жергілікті қатты дискіде орналасқан деп есептейді.
Менің Құжаттарым қапшығының жолы
Кейбір Windows бағдарламалары "Менің құжаттарым" жолын ProfilePath\My Documents түрінде тікелей кодқа енгізеді. Бұл бағдарламалар ағылшын тіліндегі Windows нұсқаларында жұмыс істейді, бірақ Windows-тың жергілікті тілге аударылған нұсқаларында бұл папка әдетте басқа атаумен болады. Мысалы, итальян тіліндегі нұсқаларда "Менің құжаттарым" папкасы Documenti деп аталады. Сондай-ақ, "Менің құжаттарым" Windows 2000 және одан кейінгі нұсқаларындағы топтық саясаттағы папканы қайта бағыттау арқылы басқа жерге көшірілуі мүмкін. Оны дұрыс алу үшін SHGetFolderPath функциясын шақыру керек.
Шешім
"FileName" деп аталатын бағдарлама ішіндегі айнымалы сияқты тікелей емес сілтеме, "файлды таңдау" диалог терезесін ашу арқылы кеңейтілуі мүмкін, ал файл көшсе де бағдарлама коды өзгертілмейді. Қатты кодтау, әсіресе бағдарламалық жасақтаманы басқа тілдерге аударуға дайындау кезінде үлкен қиындық тудырады. Көп жағдайда, бір ғана қатты кодталған мән, мысалы, массивтің мөлшері, бағдарламаның бастапқы кодында бірнеше рет кездесуі мүмкін. Мұндай мән – «сиқырлы сан» деп аталады. Егер мәннің кейбір тұстары өзгертіліп, бірақ барлығы емес, онда бағдарламада қате пайда болуы мүмкін. Мұндай қателерді табу қиын, және олар бағдарламада ұзақ уақыт бойы сақталуы мүмкін. Ұқсас мәселе, егер бір ғана қатты кодталған мән бірнеше параметр үшін қолданылса туындауы мүмкін, мысалы, 6 элементтен тұратын массив және кіріс жолының ең аз ұзындығы 6. Бағдарламашы, кодты тексермей, әрбір тұстың қалай қолданылатынын қарастырмай, қателікпен мәннің барлық тұстарын өзгерте алады (әдетте редактордың іздеу және алмастыру мүмкіндігін пайдаланады). Екі жағдайды да болдырмау үшін тұрақтыларды анықтау қажет, олар мәндермен атауларды байланыстырады, ал кодтың ішіндегі әрбір тұста тұрақтылардың атауларын қолдану керек. Қатты кодтаудың маңызды бір түрі – жолдарды тікелей файлға орналастыру, бұл аудармашыларды бағдарламаны аудару үшін бастапқы кодты өңдеуге мәжбүрлейді. (Дегенмен, gettext деп аталатын құрал бар, ол жолдарды файлдарда қалдыруға мүмкіндік береді, бірақ аудармашыларға бастапқы кодты өзгертпей оларды аударуға рұқсат етеді; ол жолдарды қатты кодтаудан шығарады.)
Конкурстардағы күрделі кодтау
Компьютерлік сайыстарда, мысалы, Халықаралық информатика олимпиадасында, қатысушылар сұрақтардың талаптарына сәйкес белгілі бір кіріс-шығыс форматымен бағдарлама жазуы тиіс. Мүмкін болатын кіріс саны өте аз болған сирек жағдайларда, қатысушы барлық мүмкін кірістерді олардың дұрыс нәтижелерімен байланыстыратын тәсілді қолдануды қарастыруы мүмкін. Бұл бағдарлама алгоритмдік бағдарламаға қарағанда қатты кодталған шешім болып есептеледі (дегенмен, қатты кодталған бағдарлама алгоритмдік бағдарламаның нәтижесі болуы мүмкін).
Жай кодтау
Softcoding – мәтіндік файлдар, INI файлдары, препроцессор макростары, сыртқы тұрақты шамалар, конфигурациялық файлдар, командалық жол аргументтері, деректер базалары, пайдаланушы енгізетін мәліметтер, HTTP сервер жауаптары сияқты сыртқы ресурстардан мән немесе функция алуды білдіретін компьютерлік кодтау термині. Бұл бастапқы кодқа тікелей енгізілген мәндер мен функцияларды білдіретін hardcoding-тің (қатты кодтаудың) қарама-қарсысы болып табылады.
Бағдарламалау тәжірибесі
Көбінесе өзгертілетін мәндерді тікелей кодқа енгізуден аулақ болу – жақсы бағдарламалау тәсілі. Бағдарлама қолданушылары бағдарламаның бастапқы кодын өзгертпестен, оны өз қажеттіліктеріне қарай, ақылға қонымды шектеулерде бейімдей алуы керек. Сол сияқты, сақты бағдарламашылар кодтың түсінікті болуын және күтімін жеңілдету үшін кодта "сиқырлы сандарды" пайдаланудан сақтанады. Мұндай тәсілдерді әдетте "жұмсақ кодтау" деп атамайды. Бұл термин көбінесе жұмсақ кодтау жаман үлгіге айналған жағдайларда қолданылады. Көптеген мәндер мен мүмкіндіктерді абстракциялау қажет болғанда, қажеттілік туғанда кодты өзгертуге қарағанда көбірек күрделілік пен күтімге байланысты мәселелер тудыруы мүмкін. Осы мағынадағы жұмсақ кодтау туралы мәліметтер The Daily WTF сайтындағы мақалада келтірілген.
Мүмкін болатын проблемалар
Соңғы сатыда, жұмсақ кодталған бағдарламалар нашар жобаланған және іске асырылған өзіндік скрипт тілдерін және түзету үшін жоғары деңгейде бағдарламалау білімі қажет болатын конфигурациялық файлдарды дамытады. Бұл бастапқы бағдарламаны конфигурациялауға көмектесетін қосымша құралдардың жасалуына алып келуі мүмкін, ал мұндай құралдар көбінесе өзі жұмсақ кодталған болып шығады. Нақты конфигурациялау мүмкіндігі мен проблемалық жұмсақ кодтау арасындағы шекара бағдарламаның стилі мен сипатына байланысты өзгереді. Жабық кодты бағдарламалар өте жақсы конфигурациялануы тиіс, себебі соңғы пайдаланушыға өзгерістер енгізу үшін бастапқы кодқа қол жеткізу мүмкіндігі жоқ. Ішкі пайдалануға арналған бағдарламалық жасақтама және шектеулі таралымдағы бағдарламалық жасақтама аз конфигурациялануы мүмкін, өйткені өзгертілген нұсқаларын тарату оңайырақ. Арнайы құрастырылған веб-қосымшалары көбінесе конфигурациялау мүмкіндігі шектеулі болғанда жақсырақ, себебі скрипттерді өзгерту конфигурациялық файлды өзгертуден әдетте қиын болмайды. Жұмсақ кодтаудан сақтану үшін, сіз ұсынатын қосымша икемділіктің соңғы пайдаланушы үшін қаншалықты пайдалы екенін қарастырыңыз және оны қосымша конфигурациялаумен байланысты күрделілік пен одан әрі техникалық қызмет көрсетуге кететін шығындармен салыстырыңыз.
Икемділікке қол жеткізу
Softcoding қамтамасыз етуге тырысатын икемділікке жету үшін бірнеше дұрыс жобалау үлгілері бар. Конфигурациялық файлға қарағанда көбірек икемділік қажет болса, қолданбаға скрипт тілін қосу пайдалы болуы мүмкін. Көп жағдайда, ең тиімді шешім – бұл қалыптасқан скрипт тіліне енгізілген салалық тіл. Тағы бір жол – қолданбаның көп бөлігін кітапханаға көшіріп, осыған байланысты қолданбаларды жылдам жасау үшін API ұсыну.