الوراثة:
حينما يتحدث الكل عن مفهوم الوراثة فإنهم يقصدون نقطة صُنع صنفٍ class من الأصناف، ثم وراثة محتوياته فى صنفٍ آخر و التغيير فيها بالإضافة و التعديل، أما مفهوم الوراثة عندى فهو أمرٌ يتجاوز ذلك إلى معنىً أوسع و أشمل، فيكاد يحتوى على أى طريقةٍ لإعادة استخدام الأكواد فى البرامج بأى شكلٍ من الأشكال يضمن تأثر الكود الوارث بالتغييرات التى تطرأ بعد الوراثة على الكود الموروث، و بالطبع فإن هذا يستثنى طريقة النسخ و اللصق التقليدية لأنه فيها تنقطع العلاقة بين الوارث و الموروث تماماً بمجرد انتهاء العملية.
لذلك فمفهوم الوراثة عندى يتضمن الأمور التالية:
1- الوراثة العادية لصنفٍ من الأصناف لصنفٍ آخر، و هو التعريف النمطى الذى يعطيه الكل للوراثة فى البرمجة الكائنية المنحى (oop).
2- الإعلان عن كائن object أو نسخة instance من صنفٍ ما، فلو فكرنا فيها جيداً لوجدنا أن الكائنات التى نُعلن عنها ما هى إلا إعادة استخدامٍ لكود الصنف بدون الحاجة إلى كتابته مرةً أخرى لكل كائنٍ كما يحدث فى منهجيتى البرمجة الوظائفية functional و الإجرائية procedural، و كذلك فإن أى تغييرٍ يطرأ على كود الصنف سيكون مطبقاً على كافة النسخ المنتجة منه. و بذا يتحقق شرطى الوراثة عندى على هذه العملية.
3- استخدام المكتبات البرمجية ذاته، و هذا الأمر قد يدفع إلى الظن بأن الوراثة عندى ما هى إلا مسمىً آخر لعملية إعادة الإستخدام علي عكس ما نوهت قبلاً، و لكننى أعود لأؤكد أن هذا الظن خاطئٌ تماماً؛ ففى عملية إعادة الإستخدام يكون الشرط الرئيس لكى يمكنك أن تقول أن ما حدث هو إعادة استخدام هو: أن يقوم المبرمج باستخدام كودٍ برمجىٍٍ ما مرةً أخرى فقط، أى أنه لا يُشترط لكى تكون العملية ضمن نطاق إعادة الاستخدام أن تكون التغييرات الجديدة فى الأصل (و التى تمت بعد إعادة الاستخدام) ذات أثرٍ على الفروع المستخدمة للأصل البرمجى، فى حين أن هذا شرطٌ أساسىٌ عندى لكى أُطلق على العملية لقب الوراثة.
و حينما ننظر إلى عملية النسخ و اللصق التقليدية فسنجد أنها خير مثالٍ يوضح الفارق بين الوراثة عندى و إعادة الاستخدام، لأنها يَصْدُق عليها وصف إعادة الاستخدام بكل قوة، فى حين أنه لا ينطبق عليها مفهومى للوراثة و لا يمكننى أن أعدها لوناً من ألوان التوراث؛ لعدم تطبيق التغيرات المُحْدَثة إلا على الأصل المنسوخ فقط.
و قد أفضت فى شرح الفارق بين نظرتى للوراثة و بين النظرة الحالية لها لكى أستطيع بعد ذلك أن أتحدث بحريةٍ عن مدى أهمية الوراثة عندى، و ذلك بدون خوف الإلتباس على القارئ لهذه الأسطر.
و الحق أن للوراثة عندى أهميةً فى الحدود القصوى لها، فأنا أعتقد اعتقاداًً جازماً أن أى كودٍ مُهَنْدَسٍ جيداً قد يكون قابلاً لإعادة الاستخدام التوارثى بطريقةٍ تُمَكِّنُنا من حل المشاكل الجديدة بطرقٍ أسرع و أفضل بكثير.
و جديرٌ بالذكر أن الوراثة تدخل فى أغلب المواضيع الهامة التى تتعلق بالمفاضلة بين لغات البرمجة إن لم يكن فيها كلها؛ و ذلك لأن لها من الفوائد الكثير و الكثير، و يمكننى أن أعد هنا طرفاً من هذه الفوائد فيما يلى:
1- سرعة الإنتاج: و القول المنتشر بين معاشر البرمجين و الذى يصف هذه النقطة جيداً هو (عدم إعادة اختراع العجلة)، حيث لن يكون على المبرمج كتابة الآلاف من الأسطر فى كل مرةٍ يحتاجها فى عمله، بل يكتبها مرةً واحدةً فقط ثم يقوم باستدعائها كل مرةٍ بمنتهى السرعة، مما يعنى التركيز على المشكلة الحقيقية و عدم هدر الجهد فى أمرٍ فُعِل من قبل و هو ما يؤدى إلى الإنتاجية الكبيرة فى النهاية.
2- الأمن: الأكواد التى ستُستخدم فى الوراثة ستكون قد اختُبرت جيداً قبل وضعها فى الخدمة التوارثية، مما يعنى أن المبرمج المستخدم لهذه الأكواد الموروثة يستطيع الإطمئنان إلى كون الكود الموروث ذي أمانٍ عال، فلا يحتاج إلى إعادة اختباره مرةً أخرى، و ذلك على العكس من الأكواد الجديدة التى يكتبها إن لم يستخدم الوراثة، حيث سيكون عليه التأكد من أمن تلك الأكواد فى كل مرة.
3- توفير التكلفة: عند إنتاج البرمجيات بصورةٍ تُجارية يكون من أهم الأمور إنتاج التطبيق المراد بأقل التكاليف الممكنة، و قد قام علم هندسة البرمجيات من الأصل ليصل إلى هذا الهدف من ضمن الأهداف الرئيسة التى قام لأجلها. و نحن حينما نعيد استخدام الأكواد التى صنعناها من قبل فإننا نوفر الوقت و الجهد و المال بصورةٍ كبيرةٍ للغاية تظهر أكبر ما تظهر فى المشاريع البرمجية العملاقة.
4- توارث الكفاءة: حينما يتم اكتشاف خوارزمٍ algorithm جديدٍ أكثر كفاءةً للقيام بالعملية التى كان يُستخدم فيها خوارزمٌ أقل كفاءةً: يكون إحلال الجديد محل القديم مكسباً كبيراً، ليس فقط للتطبيقات التى ستستخدم الخوارزم بعد الإحلال بل حتى للتطبيقات التى تستخدم الخوارزم من أيامه الأولى قبل التجديد، أى أن التغييرات الجديدة لن تجد طريقها فقط للمستخدمين الجدد بل سيتم توارثها هى الأخرى.
5- التجرد الأقصى و بساطة حل المشاكل: حينما تتوافر تحت يد المبرمج أدواتٌ كثيرةٌ جاهزةٌ للعمل باستخدامها: سيكون الأمر الوحيد الذى سيركز عليه جهده و تفكيره هو حل المشكلة التى يريد استخدام البرمجة لحلها، و هو الأمر الذى سيجعل البرمجة أكثر سهولةً بكثير، بل و أكثر إمتاعاً بكثير.
حينما يتحدث الكل عن مفهوم الوراثة فإنهم يقصدون نقطة صُنع صنفٍ class من الأصناف، ثم وراثة محتوياته فى صنفٍ آخر و التغيير فيها بالإضافة و التعديل، أما مفهوم الوراثة عندى فهو أمرٌ يتجاوز ذلك إلى معنىً أوسع و أشمل، فيكاد يحتوى على أى طريقةٍ لإعادة استخدام الأكواد فى البرامج بأى شكلٍ من الأشكال يضمن تأثر الكود الوارث بالتغييرات التى تطرأ بعد الوراثة على الكود الموروث، و بالطبع فإن هذا يستثنى طريقة النسخ و اللصق التقليدية لأنه فيها تنقطع العلاقة بين الوارث و الموروث تماماً بمجرد انتهاء العملية.
لذلك فمفهوم الوراثة عندى يتضمن الأمور التالية:
1- الوراثة العادية لصنفٍ من الأصناف لصنفٍ آخر، و هو التعريف النمطى الذى يعطيه الكل للوراثة فى البرمجة الكائنية المنحى (oop).
2- الإعلان عن كائن object أو نسخة instance من صنفٍ ما، فلو فكرنا فيها جيداً لوجدنا أن الكائنات التى نُعلن عنها ما هى إلا إعادة استخدامٍ لكود الصنف بدون الحاجة إلى كتابته مرةً أخرى لكل كائنٍ كما يحدث فى منهجيتى البرمجة الوظائفية functional و الإجرائية procedural، و كذلك فإن أى تغييرٍ يطرأ على كود الصنف سيكون مطبقاً على كافة النسخ المنتجة منه. و بذا يتحقق شرطى الوراثة عندى على هذه العملية.
3- استخدام المكتبات البرمجية ذاته، و هذا الأمر قد يدفع إلى الظن بأن الوراثة عندى ما هى إلا مسمىً آخر لعملية إعادة الإستخدام علي عكس ما نوهت قبلاً، و لكننى أعود لأؤكد أن هذا الظن خاطئٌ تماماً؛ ففى عملية إعادة الإستخدام يكون الشرط الرئيس لكى يمكنك أن تقول أن ما حدث هو إعادة استخدام هو: أن يقوم المبرمج باستخدام كودٍ برمجىٍٍ ما مرةً أخرى فقط، أى أنه لا يُشترط لكى تكون العملية ضمن نطاق إعادة الاستخدام أن تكون التغييرات الجديدة فى الأصل (و التى تمت بعد إعادة الاستخدام) ذات أثرٍ على الفروع المستخدمة للأصل البرمجى، فى حين أن هذا شرطٌ أساسىٌ عندى لكى أُطلق على العملية لقب الوراثة.
و حينما ننظر إلى عملية النسخ و اللصق التقليدية فسنجد أنها خير مثالٍ يوضح الفارق بين الوراثة عندى و إعادة الاستخدام، لأنها يَصْدُق عليها وصف إعادة الاستخدام بكل قوة، فى حين أنه لا ينطبق عليها مفهومى للوراثة و لا يمكننى أن أعدها لوناً من ألوان التوراث؛ لعدم تطبيق التغيرات المُحْدَثة إلا على الأصل المنسوخ فقط.
و قد أفضت فى شرح الفارق بين نظرتى للوراثة و بين النظرة الحالية لها لكى أستطيع بعد ذلك أن أتحدث بحريةٍ عن مدى أهمية الوراثة عندى، و ذلك بدون خوف الإلتباس على القارئ لهذه الأسطر.
و الحق أن للوراثة عندى أهميةً فى الحدود القصوى لها، فأنا أعتقد اعتقاداًً جازماً أن أى كودٍ مُهَنْدَسٍ جيداً قد يكون قابلاً لإعادة الاستخدام التوارثى بطريقةٍ تُمَكِّنُنا من حل المشاكل الجديدة بطرقٍ أسرع و أفضل بكثير.
و جديرٌ بالذكر أن الوراثة تدخل فى أغلب المواضيع الهامة التى تتعلق بالمفاضلة بين لغات البرمجة إن لم يكن فيها كلها؛ و ذلك لأن لها من الفوائد الكثير و الكثير، و يمكننى أن أعد هنا طرفاً من هذه الفوائد فيما يلى:
1- سرعة الإنتاج: و القول المنتشر بين معاشر البرمجين و الذى يصف هذه النقطة جيداً هو (عدم إعادة اختراع العجلة)، حيث لن يكون على المبرمج كتابة الآلاف من الأسطر فى كل مرةٍ يحتاجها فى عمله، بل يكتبها مرةً واحدةً فقط ثم يقوم باستدعائها كل مرةٍ بمنتهى السرعة، مما يعنى التركيز على المشكلة الحقيقية و عدم هدر الجهد فى أمرٍ فُعِل من قبل و هو ما يؤدى إلى الإنتاجية الكبيرة فى النهاية.
2- الأمن: الأكواد التى ستُستخدم فى الوراثة ستكون قد اختُبرت جيداً قبل وضعها فى الخدمة التوارثية، مما يعنى أن المبرمج المستخدم لهذه الأكواد الموروثة يستطيع الإطمئنان إلى كون الكود الموروث ذي أمانٍ عال، فلا يحتاج إلى إعادة اختباره مرةً أخرى، و ذلك على العكس من الأكواد الجديدة التى يكتبها إن لم يستخدم الوراثة، حيث سيكون عليه التأكد من أمن تلك الأكواد فى كل مرة.
3- توفير التكلفة: عند إنتاج البرمجيات بصورةٍ تُجارية يكون من أهم الأمور إنتاج التطبيق المراد بأقل التكاليف الممكنة، و قد قام علم هندسة البرمجيات من الأصل ليصل إلى هذا الهدف من ضمن الأهداف الرئيسة التى قام لأجلها. و نحن حينما نعيد استخدام الأكواد التى صنعناها من قبل فإننا نوفر الوقت و الجهد و المال بصورةٍ كبيرةٍ للغاية تظهر أكبر ما تظهر فى المشاريع البرمجية العملاقة.
4- توارث الكفاءة: حينما يتم اكتشاف خوارزمٍ algorithm جديدٍ أكثر كفاءةً للقيام بالعملية التى كان يُستخدم فيها خوارزمٌ أقل كفاءةً: يكون إحلال الجديد محل القديم مكسباً كبيراً، ليس فقط للتطبيقات التى ستستخدم الخوارزم بعد الإحلال بل حتى للتطبيقات التى تستخدم الخوارزم من أيامه الأولى قبل التجديد، أى أن التغييرات الجديدة لن تجد طريقها فقط للمستخدمين الجدد بل سيتم توارثها هى الأخرى.
5- التجرد الأقصى و بساطة حل المشاكل: حينما تتوافر تحت يد المبرمج أدواتٌ كثيرةٌ جاهزةٌ للعمل باستخدامها: سيكون الأمر الوحيد الذى سيركز عليه جهده و تفكيره هو حل المشكلة التى يريد استخدام البرمجة لحلها، و هو الأمر الذى سيجعل البرمجة أكثر سهولةً بكثير، بل و أكثر إمتاعاً بكثير.
ليست هناك تعليقات:
إرسال تعليق