التعليم
التكنولوجيا
الأعمال
البرمجة
تطوير البرمجيات
تصميم النطاق الموجه
أنظمة المحاسبة
برمجة موجهة للكائنات
قيمة الكائن
OOP
لماذا لدينا انظمة محاسبية في ظل وجود محاسبين و دفاتر محاسبية ؟ المشكلة هي السرعة و الدقة و التكلفة ولذا حاكيناها بأنظمة. كلمة Object "شيء" في ال Object Oriented Programming تعني كل ما حولنا من أشياء في الحياة و الهدف من الOOP هو حل مشاكل الواقع من خلال محاكاتها برمجياً.
(سلسلة)
(سلسلة)
مجرد استخدامنا للغات الOOP مثل جافا و سي شارب و PHP و غيرها لا يعني بالضرورة ان حلنا و برنامجنا نُفذ بطريقة الOOP. تلك اللغات هي فقط مجرد لغات داعمه لنا إن اردنا كتابة برامجنا بطريقة صحيحة تحقق "محاكاة الأشياء في الواقع".
من الطرق التي تدعمنا في تحقيق الOOP هي الDomain Driven Design. كلمة Domain هنا "العمل" او البزنس. سواء كان مدرسة , مطار , بنك , مطعم , محل تجاري .. أي عمل له خصائص و اجراءات يُدار بها. في هذه السلسلة سأركز على مفهوم واحد مهم من مفاهيم الDDD هو الValue Object.
ذكرت في البداية ان هدف الOOP هو المحاكاة , لدينا في بزنس المطار "تذكرة" سنقابلها Class اسمه Ticket مثلاً و هناك رحلة Flight و مسافر Passenger هذه الأشياء الأساسية المحسوسة و التي لها عادة رقم تعريفي تسمى Entity في الDDD. اعتذر سأعود للValue Object
لو أخذنا تذكرة معينة و تفحصنا محتوياتها سنجد مثلاً رقم الرحلة و لنقل كانت مثلاً "SV 1040". كمبرمج ستقول بسيطة نعرف متغير اسمه FlightNo من نوع String لانها احرف مع ارقام و انتهينا. لكن لحظة!.
هل رقم الرحلة هو حقيقة مجرد نص او رقم ؟؟ هل هناك رحلة اسمها مثلا "SVRIYADH" كلاهما نصوص لكن جرب و اتصل بمكتب الخطوط الجوية و اسألهم عن تلك الرحلة ؟ سيقول لك هذا رقم رحلة غير صحيح قبل ان يبدأ بالبحث عنها .. مع أنه نص String.
موظف الخطوط يعرف ان رقم الرحلة مكون من حرفين ثم مسافة ثم 4 ارقام , و حتى ذلك التشكيل لابد أن تكون الحروف SV و لا شيء غيرها و وأن تكون ال4 ارقام في حدود معروف فلا توجد رحلة رقمها SV 9999!.
اذاً رقم الرحلة ليس مجرد رقم بل Object متكامل له تشكيل و تنسيق خاص و مدى معين و له ايضاً مجموعة Rules اخرى يجب تطبيقها ليصبح رقم رحلة صحيح و إلا فليس رقم رحلة!!. لكن في الأخير له قيمة Value تظهر لنا هي "SV 1040" لها معنى خاص في سياق "الطيران". و من هنا أتت التسمية Value Object.
هل كان مثال بعيد ؟ لدينا امثلة اخرى , العمر Age هو ايضاً رقم و الأغلب يعرفه على انه int. الint مداه يصل الى 2 مليار فهل هناك كائن بهذا العمر ؟؟ لذا نحتاج إلى Value Object تحكم لنا ذلك المدى و أن لا يكون بقيمة سالبة و يمكن تشكيله بأن يضاف له السنة والشهر و حتى اليوم.
مثال اخر : رقم الهوية , هو ايضاً رقم لكن له ايضاً Rules من حيث العدد الثابت لخاناته او حتى طريقة كتابة الأرقام ففي الأغلب الرقم الأخير من الهوية هو Checksum للتأكد من صحة الرقم هو حاصل نتيجة Algorithm يطبق على كل رقم من ارقام الهوية بتسلسل معين.
الإسم كذلك فهو عادة مركب من اسم اول وثاني و عائلة و لا يوجد اسم أول لشخص به 255 حرف !! فهو قطعاً ليس مجرد String !. و قس على ذلك البقية.محاكاة الواقع مطلوبة في الOOP و لهذا السبب أوجدت و إلا لبقينا على الStructured و الProcedural Programming حيث اننا لم نحقق الفائدة من الOOP.
و ايضاً علينا أن نتذكر أن لكل واقع او Domain سياقه و لغته الخاصة فالتذكرة في الطيران غير التذكرة في القطار و غير تذكرة المواقف و صيغة ارقام التذاكر تختلف فيما بينهم و علينا في نفس الوقت أن نتحاشى الData Types البدائية و نقابل كل Object واقعي في الحياة بObject في البرنامج.
احرص على ان لا يكون في الEntity Class مثل الTicket او Person انواع بيانات Data Type بدائية مثل int او bool او string بل Value Objects و لتكن لديك كمبرمج مكتبتك الخاصة منها لتستخدمها و تعيد استخدامها في جميع مشاريعك.
ليس بالضرورة أن تطبق كل مفاهيم الDDD. إن فهمت مبدأ الValue Object فهي خطوة كبيرة للأمام نحو الOOP. ابحث الآن كيف تطبقها في لغة البرمجة التي تستخدمها و حاول التفكير في كل الFields التي يمكنك تحويلها إلى Value Object. و بالتوفيق.
جاري تحميل الاقتراحات...