السلام عليكم ..
طالما اننا في منتدى متخصص بالبرمجة , فالمفروض أن معظم (قلت معظم) أعضاء المنتدى يعرفون لغات برمجة , أي قاموا بتعلمها في مدرسة أو جامعة أو مراكز تعليم أو من الكتب (تعلم ذاتي في المنزل) أو ... الخ , و لكن هل ناقشنا كيف تعلم كل واحد منا لغة البرمجة (حديثي كله عن غرضية التوجه) , اعتقد ان معظمنا يتبع طريقة التعلم بالأمثلة Learning by Example و هي بلا شك طريقة جيدة , و لكن في مقالتي هذه أريد أن أخبركم عن طريقة أتبعها لتعلم لفة البرمجة و ربما كثيرون ينبعونها و لكن دون أن يعرفوا خلفيتها العلمية .
لكي تتعلم اللغة بشكل احترافي عليك أن تتبع منهجية لتعلم اللغة , بمعنى آخر كيف نتعلم لغة برمجة جديدة , كي لا يحصل عندك تشتت و ضياع .
نبدأ من إحدى الطرق المتبعة في تصميم البرمجيات غرضية التوجه هي Class-responsibility-collaboration card و اختصارا CRC (الرابط)و تعني مسؤولية و تعاون الصف (الكلاس) أي أنها تقول أن لكل كلاس مجموعة من المسؤوليات responsibility تعبر عن الوظائف و المهام التي يقوم الكلاس بتنفيذها و لكن بعض الكلاسات لا تستطيع أن تقوم بمسؤولياتها دون أن تتعاون collaboration مع كلاسات أخرى و من هنا جاءت التسمية .
و طالما نتحدث عن البرمجة غرضية التوجه فإن كل كلاس يمثل شئ ما أو مفهوم (Concept) في عالمنا الحقيقي (غالبا), مثلا الكلاس StringTokenizer الموجود في الجزمة java.util , لنقل أنه يمثل آلة أو ماكينة لتقطيع النص حسب علامات الترقيم كالفواصل و الفراغات , فماذا تتوقع ان تكون مسؤوليات آلة تقطيع النص هذه , ممكن أن تكون مثلا "أعطني الكلمة التالية" أو "هل لديك كلمات أخرى" , و طبعا آلة تقطيع النص (طبعا أنا أتحدث هنا عن الكلاس StringTokenizer ) لا تحتاج ان تتعاون (collaboration ) مع آلات (كلاسات) أخرى لإنجاز المسؤوليات (responsibility) الخاصة بها باعتبار أن هذه المسؤوليات بسيطة .
StringTokenizer tempStringTokenizer = new StringTokenizer("Hello From Java");
while (tempStringTokenizer.hasMoreTokens()) {
System.out.println(tempStringTokenizer.nextElement());
}أما لو أردت مثالا عن التعاون بين الكلاسات , فدعنا نأخذ الكلاس Connection الموجود بالحزمة java.sql و بنفس طريقة المحاكاة السابقة يمكننا ان ننظر لهذا الكلاس على أنه يمثل في عالمنا الحقيقي "وصلة" لقاعدة البيانات , فما هي برأيك المسؤوليات المتعلقة بهذا الكلاس , حتما سيتبادر إلى ذهنك فتح و إغلاق الوصلة , نعم هذا صحيح إلى حد ما و لكن لو نظرنا إلى إحدى المسؤوليات و هي "فتح قاعدة البيانات" , سنجد أنها في الواقع مرتبطة بنوع القاعدة حيث أن كل قاعدة لها درايفر خاص بها و فتح قاعدة بيانات أوراكل يختلف عن تلك التي من نوع MySQL (نتكلم عن العمليات الداخلية المطلوبة لفتح كل قاعدة) لذلك مصممو لغة البرمجة جافا قالوا أن مسؤولية "فتح" قاعدة البيانات هي من مسؤوليات الكلاس DriverManager و الذي يمكنك أن تتصور أنه مدير للدرايفرات الخاصة بقواعد البيانات و يقوم باستخدام الدرايفر المناسب لفتح قاعدة البيانات حسب نوعها , لذلك نقول أنه يوجد تعاون أو تشارك (collaboration ) بين الكلاس Connection و الكلاس DriverManager لإنجاز مسؤولية (مهمة) "فتح" القاعدة . و بالمناسبة عملية إغلاق القاعدة هي من مسؤوليات الكلاس Connection .
connection = DriverManager.getConnection(connectionURL, "root", "root"); connection.close();
بالعودة لموضوعنا و هو منهجية أو طريقة لتعلم لغات البرمجة غرضية التوجه مستوحاة من طريقة لتصميم البرمجيات , تعتمد على أن نقوم بعمل كارت (بطاقة) لكل كلاس (جدول عادي على الورق) , و تسجل فيه مسؤوليات الكلاس و تعاون الكلاس مع الكلاسات الأخرى لإنجاز المسؤوليات و المهام المرتبطة بالكلاس المطلوب , طبعا الطريقة مصممة لتصميم البرمجيات , و أنا استخدمها في تعلم لغة البرمجة, و اخيرا أنوه انه يوجد قوالب جاهزة للقيام بهذه المهمة موجود أحدها بالمرفقات و قد قمت بتحميله من هنا (الروابط الخارجية تتغير غالبا) .
الوجه الأمامي و الخلفي للبطاقة موجود بالمرفقات و كذلك مثال و هو كما ترى بسيط , يوضح اسم الكلاس و الــ Attributes و المسؤوليات و الكلاسات المتعاونة مع الكلاس .
و يوجد الكثير من الكتب التي تتحدث عن هذه الطريقة :
Object Design Roles, Responsibilities, and Collaborations
و أخير بعض الكتب المقترحة :
Beginning Java Objects From Concepts To Code
Object Thinking
و السلام
