---
title: "الترميز الثابت"
type: "antipattern"
slug: "hard-coding"
url: "http://localhost:3000/ar/antipatterns/hard-coding.md"
description: "تضمين البيانات في الشيفرة المصدرية للبرنامج"
---
# الترميز الثابت

> تضمين البيانات في الشيفرة المصدرية للبرنامج

**الترميز الثابت** (Hard coding) هو ممارسة تطوير البرمجيات المتمثلة في تضمين البيانات مباشرةً في [الشيفرة المصدرية](https://en.wikipedia.org/wiki/Source%5Fcode "Source code") لـ[برنامج](https://en.wikipedia.org/wiki/Computer%5Fprogram "Computer program") أو كائن قابل للتنفيذ آخر، بدلاً من الحصول على البيانات من مصادر خارجية أو توليدها في [وقت التشغيل](https://en.wikipedia.org/wiki/Run%5Ftime%5F%28program%5Flifecycle%5Fphase%29 "Run time (program lifecycle phase)").

يمكن تعديل البيانات المُرمَّزة ثابتاً في العادة فقط عن طريق تحرير الشيفرة المصدرية و[إعادة تصريفها](https://en.wikipedia.org/wiki/Compiling "Compiling") للملف القابل للتنفيذ، وإن كان بالإمكان تغييرها في [الذاكرة](https://en.wikipedia.org/wiki/Volatile%5Fmemory "Volatile memory") أو على القرص باستخدام [المُنقِّح](https://en.wikipedia.org/wiki/Debugger "Debugger") أو [محرر HEX](https://en.wikipedia.org/wiki/Hex%5Feditor "Hex editor").

تُعدّ البيانات المُرمَّزة ثابتاً أنسب لقطع المعلومات التي لا تتغير، مثل [الثوابت الفيزيائية](https://en.wikipedia.org/wiki/Physical%5Fconstant "Physical constant") و[أرقام الإصدار](https://en.wikipedia.org/wiki/Version%5Fnumber "Version number") وعناصر النص الثابت.

أما البيانات المُرمَّزة مرنةً (Soft-coded)، فتُشفِّر معلومات تعسفية عبر [مدخلات المستخدم](https://en.wikipedia.org/wiki/User%5Finput "User input") و[ملفات النص](https://en.wikipedia.org/wiki/Text%5Ffiles "Text files") وملفات [INI](https://en.wikipedia.org/wiki/INI%5Ffile "INI file") واستجابات خادم HTTP وملفات الضبط وماكرو المعالج المسبق والثوابت الخارجية وقواعد البيانات و[وسيطات سطر الأوامر](https://en.wikipedia.org/wiki/Command-line%5Fargument "Command-line argument")، ويُحدَّد مضمونها في وقت التشغيل.

## نظرة عامة

يستلزم الترميز الثابت تغيير الشيفرة المصدرية للبرنامج في كل مرة تتغير فيها بيانات الإدخال أو الصيغة المطلوبة، في حين قد يكون أكثر ملاءمةً للمستخدم النهائي تغيير التفاصيل بطريقة ما خارج البرنامج.

كثيراً ما يكون الترميز الثابت ضرورياً، غير أنه يمكن أن يُعدَّ [نمطاً مضاداً](https://en.wikipedia.org/wiki/Anti-pattern "Anti-pattern"). فقد لا يكون لدى المبرمجين حلٌّ لواجهة مستخدم ديناميكية جاهزة للمستخدم النهائي، ولكنهم مع ذلك يجب أن يُسلِّموا الميزة أو يُصدِروا البرنامج. يكون هذا في العادة مؤقتاً، ولكنه يحلّ على المدى القريب ضغطَ تسليم الشيفرة. يُجرى لاحقاً الترميز المرن للسماح للمستخدم بتمرير معاملات تُتيح له تعديل النتائج أو المخرجات.

استُخدم مصطلح "الترميز الثابت" في الأصل استعارةً من توصيل الدوائر الكهربائية بصلابة، وكان يُعبِّر عن الجمود الناتج عن استخدامه في تصميم البرمجيات وتنفيذها. وفي سياق [بيئات التطوير التعاوني](https://en.wikipedia.org/wiki/Collaborative%5Fdevelopment%5Fenvironment "Collaborative development environment") القابلة للتمديد في وقت التشغيل مثل [MUDs](https://en.wikipedia.org/wiki/Multi-user%5Fdungeon "Multi-user dungeon")، يُشير الترميز الثابت أيضاً إلى تطوير المحرك الأساسي للنظام المسؤول عن المهام منخفضة المستوى وتنفيذ [السكريبتات](https://en.wikipedia.org/wiki/Scripting%5Flanguage "Scripting language")، في مقابل **الترميز المرن** الذي يعني تطوير السكريبتات عالية المستوى التي يُفسِّرها النظام في [وقت التشغيل](https://en.wikipedia.org/wiki/Execution%5F%28computing%29 "Execution (computing)")، بقيم من مصادر خارجية كـ[ملفات النص](https://en.wikipedia.org/wiki/Text%5Ffiles "Text files") وملفات [INI](https://en.wikipedia.org/wiki/INI%5Ffile "INI file") وماكرو [المعالج المسبق](https://en.wikipedia.org/wiki/Macro%5F%28computer%5Fscience%29 "Macro (computer science)") والثوابت الخارجية و[قواعد البيانات](https://en.wikipedia.org/wiki/Database "Database") و[وسيطات سطر الأوامر](https://en.wikipedia.org/wiki/Command-line%5Fargument "Command-line argument") واستجابات [HTTP](https://en.wikipedia.org/wiki/HTTP "HTTP") [الخادم](https://en.wikipedia.org/wiki/Server%5F%28computing%29 "Server (computing)") و[ملفات الضبط](https://en.wikipedia.org/wiki/Configuration%5Ffile "Configuration file") و[مدخلات المستخدم](https://en.wikipedia.org/wiki/User%5Finput "User input"). في هذا السياق، لا يُعدّ المصطلح تحقيرياً، بل يُشير إلى التطوير العام لا إلى تضمين بيانات الإخراج تحديداً.

## الأبواب الخلفية

يُعدّ ترميز بيانات الاعتماد ثابتاً طريقةً شائعة لإنشاء [باب خلفي](https://en.wikipedia.org/wiki/Backdoor%5F%28computing%29 "Backdoor (computing)"). لا تظهر بيانات الاعتماد المُرمَّزة ثابتاً في العادة في ملفات الضبط أو مخرجات أوامر تعداد الحسابات، ولا يمكن للمستخدمين تغييرها أو تجاوزها بسهولة. وإن اكتُشفت، قد يتمكن المستخدم من تعطيل هذا الباب الخلفي عن طريق تعديل البرنامج وإعادة بنائه من [شيفرته المصدرية](https://en.wikipedia.org/wiki/Source%5Fcode "Source code") [(إن كان المصدر متاحاً للعموم)](https://en.wikipedia.org/wiki/FLOSS "FLOSS")، أو [فكّ التصريف](https://en.wikipedia.org/wiki/Decompiling "Decompiling")، أو [الهندسة العكسية](https://en.wikipedia.org/wiki/Reverse-engineering "Reverse-engineering") لـ[البرنامج](https://en.wikipedia.org/wiki/Software "Software")، أو [التحرير المباشر](https://en.wikipedia.org/wiki/Hex%5Feditor "Hex editor") لـ[الشيفرة الثنائية](https://en.wikipedia.org/wiki/Binary%5Fcode "Binary code") للبرنامج، أو إقامة فحص تكامل (كالتوقيعات الرقمية وآليات مكافحة التلاعب و[مكافحة الغش](https://en.wikipedia.org/wiki/Anti-cheat "Anti-cheat")) لمنع الوصول غير المتوقع؛ غير أن مثل هذه الإجراءات كثيراً ما تكون محظورة بموجب [اتفاقية ترخيص المستخدم النهائي](https://en.wikipedia.org/wiki/End-user%5Flicense%5Fagreement "End-user license agreement").

## إدارة الحقوق الرقمية

كإجراء من إجراءات [إدارة الحقوق الرقمية](https://en.wikipedia.org/wiki/Digital%5Frights%5Fmanagement "Digital rights management") (DRM)، قد يُرمِّز مطورو البرمجيات [رقماً تسلسلياً](https://en.wikipedia.org/wiki/Serial%5Fnumber "Serial number") فريداً مباشرةً في البرنامج. أو يشيع ترميز [مفتاح عام](https://en.wikipedia.org/wiki/Public%5Fkey "Public key") ثابتاً، مما يُنشئ آلية DRM يتعذّر إنشاء مُولِّد مفاتيح (keygen) لها.

في المقابل، قد يُرمِّز [كاسر البرمجيات](https://en.wikipedia.org/wiki/Software%5Fcracker "Software cracker") رقماً تسلسلياً صالحاً مباشرةً في البرنامج أو يمنع الملف القابل للتنفيذ من طلبه من المستخدم، مما يُتيح إعادة توزيع النسخ غير المرخصة دون الحاجة إلى إدخال رقم صالح، فتتشارك كل النسخ المفتاح ذاته إن كان مُرمَّزاً ثابتاً.

## مسار التثبيت الثابت

إذا كان برنامج Windows مبرمجاً للافتراض بأنه دائماً مُثبَّت في C:\\Program Files\\Appname وحاول شخص ما تثبيته على محرك أقراص مختلف لأسباب تتعلق بالمساحة أو التنظيم، فقد يفشل في التثبيت أو التشغيل بعد التثبيت. قد لا تُكتشف هذه المشكلة في عملية الاختبار، إذ يُثبِّت المستخدم العادي على محرك الأقراص والدليل الافتراضيين ولا يشمل الاختبار عادةً خيار تغيير دليل التثبيت. غير أنه يُنصح المبرمجون والمطورون بعدم تثبيت مسار تثبيت البرنامج، إذ يعتمد المسار الافتراضي على نظام التشغيل وإصداره وقرارات [مسؤول النظام](https://en.wikipedia.org/wiki/Sysadmin "Sysadmin"). فمثلاً، تستخدم كثير من تثبيتات [Microsoft Windows](https://en.wikipedia.org/wiki/Microsoft%5FWindows "Microsoft Windows") [المحرك C:](https://en.wikipedia.org/wiki/Drive%5Fletter%5Fassignment#Common%5Fassignments "Drive letter assignment") باعتباره [القرص الصلب](https://en.wikipedia.org/wiki/Hard%5Fdisk "Hard disk") الرئيسي، لكن هذا غير مضمون.

كانت ثمة مشكلة مماثلة مع [المعالجات الدقيقة](https://en.wikipedia.org/wiki/Microprocessor "Microprocessor") في الحواسيب المبكرة، التي كانت [تبدأ التنفيذ](https://en.wikipedia.org/wiki/Reset%5F%28computing%29 "Reset (computing)") عند [عنوان](https://en.wikipedia.org/wiki/Address%5Fspace "Address space") ثابت في الذاكرة.

## قرص الإقلاع

تبحث بعض البرامج "[المحمية من النسخ](https://en.wikipedia.org/wiki/Copy%5Fprotection "Copy protection")" عن ملف معين على [قرص مرن](https://en.wikipedia.org/wiki/Floppy%5Fdisk "Floppy disk") أو محرك أقراص فلاش عند بدء التشغيل للتحقق من أنها ليست نسخاً غير مرخصة. إذا استُبدل الحاسوب بجهاز أحدث لا يحتوي على مشغّل للأقراص المرنة، فلن يمكن تشغيل البرنامج الذي يتطلبه لأنه لا يمكن إدراج القرص المرن.

يُبيِّن هذا المثال الأخير سبب إمكانية أن يتبيَّن عدم جدوى الترميز الثابت حتى حين يبدو في وقته أنه سيعمل تماماً. في الثمانينيات والتسعينيات، كانت الغالبية العظمى من أجهزة PC مزودة بمشغّل قرص مرن واحد على الأقل، غير أن مشغّلات الأقراص المرنة خرجت لاحقاً من الاستخدام. قد يواجه برنامج مُرمَّز بهذه الطريقة منذ 15 عاماً مشكلات إن لم يُحدَّث.

## المجلدات الخاصة

تحتوي بعض أنظمة تشغيل Windows على ما يُسمى [المجلدات الخاصة](https://en.wikipedia.org/wiki/Special%5Ffolders "Special folders") التي تُنظِّم الملفات منطقياً على القرص الصلب. ثمة مشكلات يمكن أن تنشأ جراء الترميز الثابت:

### مسار الملف الشخصي

تُرمِّز بعض برامج Windows مسار الملف الشخصي ثابتاً إلى مواقع يُحددها المطور مثل `C:\Documents and Settings\_Username_`. هذا هو المسار المعتمَد في الغالبية العظمى من أنظمة [Windows 2000](https://en.wikipedia.org/wiki/Windows%5F2000 "Windows 2000") وما فوق، لكنه سيُسبِّب خطأ إذا كان الملف الشخصي مخزَّناً على شبكة أو منقولاً بطريقة أخرى. الطريقة الصحيحة للحصول عليه هي استدعاء الدالة `GetUserProfileDirectory` أو حلّ [متغير البيئة](https://en.wikipedia.org/wiki/Environment%5Fvariable "Environment variable") `%userprofile%`. افتراض آخر يشيع لدى المطورين وهو أن الملف الشخصي موجود على قرص صلب محلي.

### مسار مجلد المستندات

تُرمِّز بعض برامج Windows مسار `[My Documents](https://en.wikipedia.org/wiki/My%5FDocuments "My Documents")` ثابتاً على هيئة `_ProfilePath_\My Documents`. ستعمل هذه البرامج على الأجهزة التي تشغّل الإصدار الإنجليزي، لكن في الإصدارات [المحلية](https://en.wikipedia.org/wiki/Internationalization%5Fand%5Flocalization "Internationalization and localization") من Windows يحمل هذا المجلد في العادة اسماً مختلفاً. فمثلاً، في الإصدارات الإيطالية يُسمَّى مجلد `My Documents` باسم _Documenti_. وقد يكون مجلد `My Documents` أيضاً قد أُعيد توجيهه باستخدام ميزة Folder Redirection في [Group Policy](https://en.wikipedia.org/wiki/Group%5FPolicy "Group Policy") في Windows 2000 وما فوق. الطريقة الصحيحة للحصول عليه هي استدعاء الدالة `SHGetFolderPath`.

## الحل

يمكن توسيع مرجع غير مباشر، كمتغير داخل البرنامج يُسمى "FileName"، عبر الوصول إلى نافذة حوار "استعراض ملف"، ولا يلزم عندئذٍ تغيير شيفرة البرنامج إن تحرَّك الملف.

يُعدّ الترميز الثابت مشكلةً بالغة الأثر تحديداً عند إعداد البرنامج للترجمة إلى لغات أخرى.

في حالات كثيرة، قد تظهر قيمة واحدة مُرمَّزة ثابتاً، كحجم مصفوفة، عدة مرات في الشيفرة المصدرية للبرنامج. سيكون هذا ما يُعرف بـ[الرقم السحري](https://en.wikipedia.org/wiki/Magic%5Fnumber%5F%28programming%29 "Magic number (programming)"). وقد يُسبِّب هذا خطأً في البرنامج إذا عُدِّل بعض مواضع ظهور القيمة دون بعضها الآخر. مثل هذا الخطأ يصعب اكتشافه وقد يبقى في البرنامج فترةً طويلة. قد تنشأ مشكلة مماثلة إذا استُخدمت القيمة المُرمَّزة ثابتاً ذاتها لأكثر من قيمة معامل واحدة، مثل مصفوفة مؤلفة من 6 عناصر وطول حد أدنى لسلسلة الإدخال يبلغ 6 أحرف. قد يُغيِّر المبرمج خطأً جميع نسخ القيمة (باستخدام ميزة بحث واستبدال في المحرر) دون فحص الشيفرة لمعرفة كيفية استخدام كل نسخة. يُتجنَّب كلا الأمرين بتعريف [الثوابت](https://en.wikipedia.org/wiki/Constant%5F%28programming%29 "Constant (programming)")، التي تربط الأسماء بالقيم، واستخدام أسماء الثوابت لكل ظهور في الشيفرة.

حالة مهمة من حالات الترميز الثابت هي عندما تُوضَع السلاسل النصية مباشرةً في الملف، مما يُجبر المترجمين على تحرير الشيفرة المصدرية لترجمة البرنامج. (ثمة أداة تُسمى `[gettext](https://en.wikipedia.org/wiki/Gettext "Gettext")` تُتيح ترك السلاسل في الملفات بينما تُمكِّن المترجمين من ترجمتها دون تغيير الشيفرة المصدرية؛ إذ تُلغي في الفعل ترميزها الثابت.)

## مسابقات الحوسبة

في مسابقات الحوسبة كـ[أولمبياد المعلوماتية الدولي](https://en.wikipedia.org/wiki/International%5FOlympiad%5Fin%5FInformatics "International Olympiad in Informatics")، يُطلب من المتسابقين كتابة برنامج وفق نمط إدخال وإخراج محدد بحسب متطلبات الأسئلة.

في حالات نادرة يكون فيها عدد المدخلات المحتملة صغيراً بما يكفي، قد يفكر المتسابق في اعتماد نهج يُعيِّن فيه جميع المدخلات المحتملة إلى مخرجاتها الصحيحة. سيُعدّ هذا البرنامج حلاً مُرمَّزاً ثابتاً لا [خوارزمياً](https://en.wikipedia.org/wiki/Algorithm "Algorithm") (حتى وإن كان ناتج برنامج خوارزمي).

## الترميز المرن

**الترميز المرن** (Soft coding) مصطلحٌ في برمجة الحاسوب يُشير إلى الحصول على قيمة أو دالة من مورد خارجي، مثل [ملفات النص](https://en.wikipedia.org/wiki/Text%5Ffiles "Text files") وملفات [INI](https://en.wikipedia.org/wiki/INI%5Ffile "INI file") وماكرو [المعالج المسبق](https://en.wikipedia.org/wiki/Preprocessor "Preprocessor") ") والثوابت الخارجية و[ملفات الضبط](https://en.wikipedia.org/wiki/Configuration%5Ffile "Configuration file") و[وسيطات سطر الأوامر](https://en.wikipedia.org/wiki/Command-line%5Fargument "Command-line argument") وقواعد البيانات ومدخلات المستخدم واستجابات خادم HTTP. وهو نقيض الترميز الثابت الذي يُشير إلى ترميز القيم والدوال في الشيفرة المصدرية.

### ممارسة البرمجة

تجنُّب الترميز الثابت للقيم التي تُعدَّل عادةً ممارسةٌ برمجية جيدة. ينبغي لمستخدمي البرنامج أن يتمكنوا من تخصيصه وفق احتياجاتهم، في حدود المعقول، دون الحاجة إلى تحرير الشيفرة المصدرية. وبالمثل، يتجنب المبرمجون المتأنون [الأرقام السحرية](https://en.wikipedia.org/wiki/Magic%5Fnumber%5F%28programming%29#Unnamed%5Fnumerical%5Fconstants "Magic number (programming)") في شيفرتهم لتحسين قابليتها للقراءة والمساعدة في صيانتها. لا يُشار عادةً إلى هذه الممارسات بمصطلح _الترميز المرن_.

يُستخدم المصطلح عادةً حين يصبح الترميز المرن [نمطاً مضاداً](https://en.wikipedia.org/wiki/Anti-pattern "Anti-pattern"). قد يُفضي تجريد قيم وميزات كثيرة جداً إلى تعقيد أكبر ومشكلات صيانة أكثر مما كان يُعانى منه عند تغيير الشيفرة عند الحاجة. عُرض الترميز المرن بهذا المعنى في مقال على [The Daily WTF](https://en.wikipedia.org/wiki/The%5FDaily%5FWTF "The Daily WTF").

### مشكلات محتملة

في أقصى الحالات، تطور البرامج المُرمَّزة مرنةً لغاتها النصية الخاصة المُصمَّمة والمُنفَّذة بشكل سيئ، وملفات ضبط تستلزم مهارات برمجية متقدمة لتحريرها. قد يؤدي هذا إلى إنتاج أدوات مساعدة في ضبط البرنامج الأصلي، وغالباً ما تنتهي هذه الأدوات بأن تكون هي أيضاً مُرمَّزة مرنةً.

يتغير الحد الفاصل بين قابلية الضبط السليمة والترميز المرن الإشكالي وفق أسلوب البرنامج وطبيعته. يجب أن تكون البرامج مغلقة المصدر قابلة للضبط إلى حد كبير، إذ لا يمتلك المستخدم النهائي وصولاً إلى المصدر لإجراء أي تغييرات. يمكن أن تكون البرامج الداخلية وذات التوزيع المحدود أقل قابلية للضبط، إذ يُعدّ توزيع النسخ المعدَّلة أبسط. غالباً ما تكون تطبيقات الويب المخصصة أفضل مع قابلية ضبط محدودة، إذ نادراً ما يكون تعديل السكريبتات أصعب من تعديل ملف الضبط.

لتجنب الترميز المرن، فكِّر في قيمة أي مرونة إضافية تقدمها للمستخدم النهائي، وقارنها بزيادة التعقيد وتكاليف الصيانة المستمرة المرتبطة بقابلية الضبط المضافة.

### تحقيق المرونة

تتوفر عدة أنماط تصميم مشروعة لتحقيق المرونة التي يسعى إليها الترميز المرن. قد تستفيد التطبيقات التي تحتاج مرونة أكبر مما هو مناسب لملف الضبط من دمج [لغة نصية](https://en.wikipedia.org/wiki/Scripting%5Flanguage "Scripting language"). في كثير من الحالات، يكون التصميم المناسب هو [لغة خاصة بالمجال](https://en.wikipedia.org/wiki/Domain-specific%5Flanguage "Domain-specific language") مُدمجة في لغة نصية راسخة. نهج آخر هو نقل معظم وظائف التطبيق إلى مكتبة، مما يُوفِّر واجهة API لكتابة التطبيقات ذات الصلة بسرعة.
