تحويل حالة النص الحالة المُستخدمة (snake_case)، وحالة الكابيتال (camelCase)، وسبب أهميتها في واجهات برمجة التطبيقات

نُشرت في
تحويل حالة النص: snake_case، camelCase، وسبب أهميتها في واجهات بروتوكول 1
إعلان · حذف؟

تُعد حالة النص من تلك الأمور التي لا يفكر فيها المطورون حتى تُسبب تلفًا سلبيًا في البيئة الإنتاجية. تُرسل واجهة برمجة مكتبة جافاسكريبت userId لكن المُدخل البرمجي باللغة بايثون يتوقع user_id. يُعيد تسمية عمود قاعدة البيانات SQL بشكل سري. يفشل مهمة التحقق (CI) لأن متغير البيئة كان مكتوبًا بشكل خاطئ.

تُوجد معايير حالة النص لأن اللغات والمنصات والأنظمة تطورت بشكل منفصل — كل منها يمتلك مصطلحاته الخاصة. فهم أي صيغة تنتمي إلى مكان معين، وعرف كيف تُحول بينها، هو مهارة عملية تُقلل من وقت التصحيح.

الصيغ الأساسية للحالة

إليك ملخصًا سريعًا لما ستجدُه في الواقع، وما هي الصيغة المناسبة لكل حالة:

سياقمؤتمرمثالملحوظات
متغيرات جافاسكريبت / مفاتيح JSONcom.camelCaseuserId, firstNameتتبع معظم واجهات برمجة بروتوكول REST هذه
متغيرات بايثون / مفاتيح JSONSnake_caseuser_id, first_nameمُتَّسِق دايجو، فاستأبي، سايكالابي بالافتراض
أسماء الفئات (في معظم اللغات)باسكال كيسUserProfile, ApiResponseتُعرف أيضًا باسم UpperCamelCase
مسارات الروابطkebab-case/user-profile, /api-docsأفضل من استخدام الـ underscores من حيث التحسين في محركات البحث
المتغيرات البيئيةSCREAMING_SNAKEDATABASE_URL, API_KEYمتوافقة على مستوى الشells وبيئات التحقق التلقائي (CI)
أوامر بروتوكول HTTPTrain-CaseContent-Type, X-Api-Keyمُعيار HTTP/1.1
أعمدة ومسارات قواعد البيانات SQLSnake_caseuser_id, created_atمُمارسة بروتوكول بلوغت، ميكيسي

لماذا تُسبب حالة التسمية غير المطابقة تلفًا في تكامل واجهات بروتوكول

أكبر سبب لحدوث تلف هو الحدود بين جافاسكريبت وبايثون. تُنتج أنظمة جافاسكريبت — مثل ريتاكس، نود، وواجهات المتصفح — نمطًا يُعرف بـ camelCase. أما أنظمة بايثون — مثل فاستأبي، دايجو، سايكالابي — فهي تتوقع نمطًا يُعرف بـ snake_case.

عندما يُرسل عميل جافاسكريبت هذا المحتوى:

{
  "firstName": "Alice",
  "userId": 42
}

يُستقبله خادم بايثون عند الوصول إلى request.json["first_name"] يُحصل على KeyError. لا يوجد تحذير، ولا تبديل — فقط توقف. يمكن لفاستأبي تجاوز هذا باستخدام alias_generator = to_camel في نماذج بيدانتيك، لكن ذلك هو إعداد اختياري يُستخدمه معظم الفرق فقط بعد أن يواجهون خطأ.

يظهر نفس المشكلة عند الحدود بين جافاسكريبت وـ GraphQL، بين ميكرو سيرفيسات مكتوبة بلغات مختلفة، وحيثما تقوم بتحويل بيانات JSON دون تعيين تطابق حقل محدد.

التحويل برمجيًا

تُحل معظم اللغات هذه المشكلة، لكن الطرق تختلف.

جافاسكريبت: الخيار الأفضل هو change-case (مُبسط) أو lodash (_.camelCase, _.snakeCase). إذا كنت تفضل تجنب الاعتماد على مكتبة:

// camelCase → snake_case
const toSnakeCase = str =>
  str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);

toSnakeCase('userName');   // 'user_name'
toSnakeCase('createdAt');  // 'created_at'

بايثون: ال re تُعالجها المكتبة، لكن النسخة المُختصرة تفشل عند الأسماء المختصرة مثل HTTPSProxy. استخدم النهج المُستند إلى خطوتين:

import re

def to_snake_case(name):
    s1 = re.sub(r'(.)([A-Z][a-z]+)', r'\1_\2', name)
    return re.sub(r'([a-z0-9])([A-Z])', r'\1_\2', s1).lower()

to_snake_case('userName')    # 'user_name'
to_snake_case('HTTPSProxy')  # 'https_proxy'

Go: لا توجد مكتبة في المكتبة القياسية تُحول حالة النص. github.com/iancoleman/strcase هي الخيار الشائع:

import "github.com/iancoleman/strcase"

strcase.ToSnake("UserName")  // "user_name"
strcase.ToCamel("user_name") // "UserName"
strcase.ToKebab("UserName")  // "user-name"

إذا كنت بحاجة إلى تحويل سريع دون كتابة كود، فإن مُحول نص الحالة IO Tools يُعالج نمط camelCase، PascalCase، snake_case، kebab-case، SCREAMING_SNAKE، وغيرها — دون الحاجة إلى تثبيت.

ممارسات قواعد البيانات والمشاكل المرتبطة بالـ ORM

تُستخدم قواعد البيانات SQL مثل بلوغت، ميكيسي، سيليتي في تسمية الأعمدة والجداول باستخدام نمط snake_case. user_id, created_at, payment_method. هذا هو النمط المتوقع، وستُظهر استعلامات SQL الخام هذا النمط.

تُستخدم أنظمة إدارة قواعد البيانات (ORMs) غالبًا لتحويل التسمية بين نمط اللغة ونمط قاعدة البيانات، وهو مريح حتى يصبح غير مريح. تُحول سايكالابي نمط camelCase في جافاسكريبت إلى نمط snake_case بشكل افتراضي في بعض الإعدادات — إلا أن هذا لا يحدث في حالات أخرى، حسب إعدادات النموذج، أو نوع النظام، أو النسخة. تُولّد بريسم نمط camelCase للحقول التي تُقابل أعمدة نمط snake_case. تُضخم أسماء الجداول في أكسيكتيف ريب، وتُحول كل شيء إلى نمط snake_case.

الإجراء المُمارس: أن تكون واضحًا. اُعرِّف أسماء الأعمدة في تعريفات النموذج بدلاً من الاعتماد على التحويل التلقائي. هذا يُظهر التماثل في مراجعة الكود ويمنع المفاجآت عند تشغيل استعلامات خارجية أو الانتقال إلى أنظمة إدارة قواعد بيانات مختلفة.

مسارات الروابط: استخدم kebab-case بدل الـ underscores

لمسارات الروابط، يُوصى بوضوح باستخدام kebab-case. تُعتبر الوثائق من غوغل تُعتبر الهيكل المُستخدم للمسافات كمُقسّم للكلمات، والـ underscores كمُجمّع للكلمات. مثال مثل /string-case-converter يُشير إلى كلمتين منفصلتين؛ /string_case_converter يُقرأ ككلمة واحدة.

التأثير العملي: تُحسّن مسارات kebab-case من التوجيه في التصفح المُركّز على الكلمات المُتعددة. ليست هذه العامل المُهم جدًا، لكنها لا تُكلف شيئًا لتصحيحها منذ اليوم الأول.

تتفق معظم الواجهات الرئيسية — مثل غوغل، ستريو، تويليو — على استخدام kebab-case لمسارات الروابط. تُظهر أقسام مثل /api/v1/user-profiles سهولة القراءة، سهولة الكتابة، وتناسق مع معايير الويب.

ملفات التكوين: استخدام SCREAMING_SNAKE للبيئة، وcamelCase للـ YAML

تُستخدم متغيرات البيئة بشكل عالمي باستخدام SCREAMING_SNAKE_CASE. DATABASE_URL, AWS_SECRET_ACCESS_KEY, REDIS_HOST — تُحافظ هذه المعايير على مستوى لينكس، دوكيير، كيرنوس، وكل منصات التحقق التلقائي (CI/CD) التي ستجدُها. تُصدر الأنظمة المتعددة هذه الصيغة. لا تُعارضها.

تُظهر ملفات التكوين بالـ YAML قصة مختلفة. تُستخدم ملفات كيرنوس، دوكيير، ومسارات وظائف غوغل أكشن باستخدام camelCase للعناصر — apiVersion, containerPort, imagePullPolicy. أنسيلي هو الاستثناء المُلحوظ، حيث يستخدم نمط snake_case في كل مهامه.

القاعدة هنا بسيطة: اطابق الصيغة التي تتوقعها الأداة. لا تجرب التوحيد بين جميع ملفات التكوين — فهي تُنتج عدم التوازن دون أن تُوفر جهدًا.

الحصول على التحويلات الصحيحة

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

لتحويلات سريعة، مُخصصة، دون كتابة كود، فإن مُحول نص الحالة IO Tools تُعالج جميع الصيغ الرئيسية في مكان واحد. ضع نصًا، اختر الصيغة المستهدفة، وانتهِ.

هل تريد حذف الإعلانات؟ تخلص من الإعلانات اليوم

تثبيت ملحقاتنا

أضف أدوات IO إلى متصفحك المفضل للوصول الفوري والبحث بشكل أسرع

أضف لـ إضافة كروم أضف لـ امتداد الحافة أضف لـ إضافة فايرفوكس أضف لـ ملحق الأوبرا

وصلت لوحة النتائج!

لوحة النتائج هي طريقة ممتعة لتتبع ألعابك، يتم تخزين جميع البيانات في متصفحك. المزيد من الميزات قريبا!

إعلان · حذف؟
إعلان · حذف؟
إعلان · حذف؟

ركن الأخبار مع أبرز التقنيات

شارك

ساعدنا على الاستمرار في تقديم أدوات مجانية قيمة

اشتري لي قهوة
إعلان · حذف؟