تسمية الأشياء جيدًا
تسمية العناصر: أساسيات التوجه الكائني
تسمية الأشياء: أساسيات البرمجة الكائنية
لننظر إلى تصميم الكائنات/الفئات من خلال مثال…
الموقف
هل سبق لك أن صممت نموذج بيانات (في الكود، أو SQL، أو جداول إكسل)؟
هل يبدو ما يلي مألوفًا؟
*** نمط مضاد - لا تنسخ والصق **** مستخدم - id - avatarUrl - name - email - password
* وكيل - id - primaryPhoto - name - email - agentEmail - agentPhoneMain - agentEmailPrimary - agentPhonePrimary - agentAddressFull - agentCompanyName - agentCompanyAddress - *userEmail* - 'مؤشر' إلى جدول المستخدمين ^^^أين الخلل؟
حسنًا، من الناحية الفنية لا يوجد خلل، بل مجرد بيانات تحتاج إلى إعادة تنظيم.
هل يبدو ما يلي مألوفًا؟
- أي تغيير في تطبيقك سيستلزم ساعات من التصحيح المضني.
- أي متطلبات متغيرة ستؤدي إلى:

لماذا تسمية حقل agentEmailPrimary سيئة جدًا؟
بادئ ذي بدء، أنت لا تخلق شيئًا جديدًا كليًا في الكون. التخصيص المفرط يحمل بعض الفخاخ:
- التقيّد باسم شديد الخصوصية يعني أن
agentEmailPrimaryسيجعل وجهات نظرك ورمزك المرتبط بها غير قابلة لإعادة الاستخدام بنسبة 0%، وسيؤدي إلى أخطاء متكررة مزعجة مثل:
- عدم مزامنة البيانات بين الجداول (ليس واضحًا ما إذا كان
user.emailيحتاج إلى الانتشار إلىagent.agentEmailأو العكس - ناهيك عن تعقيد التنفيذ اليدوي لمكان وكيفية فرض هذا “المنطق”…) - قواعد/منطق التحقق من الصحة مكرر على الأرجح وغير متسق.
- بشكل متزايد، سيصبح مشروعك أشبه ببرج جينجا مهتز.
- تتراكم الهشاشة مع كل ملف جديد، حيث يتطلب الأمر درجة عالية جدًا من الانتباه للتفاصيل حتى للتغييرات التافهة.
agentEmailPrimaryقد يعني عدة أشياء مختلفة. تجنب الغموض باستخدام أسماء أقصر.
- احترس من الكلمات الزائدة السخيفة.
Primary؟ يؤدي فقط إلى مزيد من الأسئلة: هل هناك ثانوي؟ هل هو لصلة القرابة الأساسية؟
كفى كلامًا يا دان، كيف ينبغي أن يبدو بدلًا من ذلك؟
حل
// Consolidated Schema:
User - id - role: ['agent', 'lead', 'admin'] - name - phone - address - email - password - company - name - addressلقد أزلت جدول Agent، لأنه لم يحتوي على حقول فريدة للوكلاء. وظهر كائن User.company (مع .name و .address) بمجرد تنظيف التسمية.
بعض المبادئ التوجيهية:
- تخلص من الجداول غير الضرورية. هل تحتاج حقًا إلى جدول
statuses؟ بينما يمكنك إضافة حقلstatus::VARCHAR(8)على جدولUser؟ لا بأس، استخدم البايتات الإضافية لكل صف. - حاول دمج الجداول المرتبطة. البيانات
- احذف جمع البيانات المكرر (مثل إزالة جدول
ActivityLogsإذا تم استبداله بحل تحليلي). - حاول الاحتفاظ بجميع أسماء الحقول ككلمة/اسم/ضمير واحد. لا بأس بالاعتماد على السياق الذي يوفره الجدول. (مثل
PersonalAccount.emailمقابلBusinessAccount.email- السياق مقدم من اسم الجدول.) - لا يوجد شيء اسمه
Agent.agentEmailأوAgent.agentPhonePrimary. نقطة. قل معي: “إنهاemailوphone.” - باستخدام أسماء شديدة الخصوصية، فإنك تحدد مستوى معينًا من
قابلية إعادة الاستخداموالمتانة، وبالتحديد صفر بالمائة. - أنت لا تقدم لنفسك معروفًا بمثل هذه الهراءات مثل
User.profileSummaryEmail. 💞
القراءات الموصى بها تشمل:
- ربما التطبيع ليس طبيعيًا
- المقايضات بين تطبيع قاعدة البيانات وإلغاء التطبيع
- http://phlonx.com/resources/nf3/
- https://en.wikipedia.org/wiki/Database_normalization