برمجة الكمبيوتر .. دراسة شاملة
--------------------------------------------------------------------------------
تقنيات البرمجة
تطورت الأساليب والتقنيات المستخدمة في كتابة البرامج عبر السنين، ويرجع ذلك إلى تغير متطلبات البرمجة وأهميتها وأهدافها.
البرمجة الإجرائية Procedural Programming
البرنامج الإجرائي ما هو إلا لائحة من الأوامر فقط خطوة خطوة، وهي الطريقة التي يعمل بها المعالج والكمبيوتر بشكل عام لأن الكمبيوتر ينفذ ولا يفكر، يستخدم هذا الأسلوب لكتابة البرامج الصغيرة والمهمة جدا والتي تحتاج إلى ميزات عالية ووصول إلى أجزاء حساسة من الحاسوب مثل إدارة الإقلاع Booting ومن هذه اللغات البرمجية لغة Assembly.
البرمجة البنيوية Structured ************************
وهو تطبيق عملي لمبدأ فرق تسد، حيث تقوم فكرتها على أساس تقسيم البرامج إلى عدة أقسام كل منها يستدعي الآخر، فمثلا إذا أردت أن تكتب برنامجا يقوم بحساب عدد الموظفين في الشركة، يمكن تقسيم عمل البرنامج إلى التالي :
فتح قاعدة البيانات
معرفة عدد السجلات
إغلاق قاعدة البيانات
عرض النتيجة
إغلاق البرنامج
إضافة إلى ذلك فإن هذا البرنامج بأكمله يمكن أن يكون مجرد وظيفة في برنامج آخر أكبر، وهكذا، توجد في هذه التقنية عدة دوال أو وظائف Functions كل وظيفة لها دخل خاص بها، وتعطي خرجا خاصا بها، ويتم تبادل هذه البيانات ( الدخل والخرج ) بين الدوال المختلفة فتستدعي كل دالة الأخرى وهكذا، وهذا يسهل العمل على المبرمج ويجعل الأمور تبدو واضحة أمامه، وإذا أراد تحسين البرنامج فهذا أمر سهل، فمثلا إذا أراد أن يغير أسلوب عرض النتيجة لن يضطر إلى البحث في سطور البرنامج عن الأماكن التي حدث فيها عرض النتيجة على الشاشة بل سيضطر فقط إلى تغيير الدالة التي تقوم بعرض النتيجة، ولن يضطر للمساس بباقي دوال البرنامج وسوف يظهر أثر التغيير الذي قام به في جميع الأماكن التي تستدعي الدالة التي غيرها، وفي هذا الأسلوب من البرمجة يتم تخزين البيانات في متغيرات، وهذه المتغيرات تكون إما عامة Public أو خاصة Private، المتغيرة العامة هي المشتركة بين جميع دوال البرنامج، والخاصة تظهر فقط في دالة محددة، لذلك لتبادل البيانات بين الدوال نستخدم متغيرات عامة، يمكن تشبيه الموقف بشركة كبيرة بها عدد من الأقسام ( الدوال ) كل قسم له وظيفته، البيانات الموجودة داخل القسم لا يستطيع أن يصل إليها إلا من في القسم، وإذا أردت أن تضع معلومات يستطيع الجميع الوصول إليها لا بد من وضعها في الأرشيف العام للشركة الذي يستطيع الوصول إليه والقراءة منه والكتابة إليه، ومن أشهر اللغات التي تستخدم هذا الأسلوب لغة C.
المتغيرات : أماكن لتخزين البيانات.
البرمجة الكائنية المنحى Object Oriented Programming OOP
وهي أرقى أنواع البرمجة وفيها يقسم البرنامج إلى وحدات تسمى الكائنات، والكائن هو كتلة من الدوال والمتغيرات، يستطيع الكائن أن يحاكي الأمور الحياتية بواقعية أكثر، فمثلا إذا كان عندنا كائن سيارة فإن للسيارة متغيرات خاصة بها ودوال خاصة بها أيضا، مثلا من متغيرات السيارة، كمية الوقود المتوفرة، وسرعة السيارة الحالية، ودرجة حرارة المحرك، ومن دوال السيارة دالة لزيادة السرعة، ودالة المكابح، ودالة تشغيل أضواء السيارة، تستطيع بهذه الطريقة أن تفهم أجزاء البرنامج أكثر، ويصبح المبرمج منظما أكثر، ففي السابق كنا نقول بأنك إذا أردت معلومة ما من قسم آخر يجب أن تكون هذه المعلومة متوفرة في الأرشيف العام ولكن هذا يؤدي إلى فوضى عارمة في الأرشيف، بحيث يمكن للمبرمج أن يعطي مثلا الإسم نفسه لمتغيرتين مختلفتين في الأرشيف ويحصل على نتائج غير متوقعة دون أن يعرف الخطأ بسهولة، والمشكلة الأكبر تحدث عندما يكون البرنامج عبارة عن مشروع ضخم يديره فريق كامل من المبرمجين، فتصبح عملية التنسيق بينهم صعبة جدا، في البرمجة الكائنية المنحى إذا كنت في قسم المبيعات وأردت أن تعرف عدد الأشخاص اللذين ذهبوا إلى قسم الدعم الفني خلال الأسبوع الماضي،فمن غير المعقول أن تدخل قسم الدعم الفني وتتجه إلى خزاناتهم وتبدأ بتقليب الأوراق بحثا عن المعلومة، وكما قلنا سابقا، فكرة الأرشيف أيضا فاشلة، لذلك فإن الحل هو أنك تتصل بقسم الدعم الفني وتسألهم ( كم عدد الزوار الذين زاروا قسمكم خلال الأسبوع الماضي؟ ) فتحصل منهم على النتيجة التي تريدها وتكمل عملك بشكل طبيعي، هنا قسم الدعم الفني وفر لك وظيفة جديدة أو دالة جديدة تعطيك عدد زوار القسم خلال الأسبوع الماضي، وبهذه الطريقة ستضمن أنت أنك تستطيع الحصول على المعلومة، ويضمن قسم الدعم الفني أنك لن تستطيع الوصول إلا إلى المعلومة التي تريدها، أو التي يحق لك معرفتها، ولن تستطيع تغيير محتوى الدالة لأنها مخفية عنك، وفي نفس الوقت لن تحتاج لمعرفة الطريقة التي يعمل بها قسم الدعم الفني داخليا أنت فقط تحصل على المعلومات من خارج قسم الدعم الفني بالوسائل المتفق عليها، أي من خلال واجهة الدعم الفني، يسمى قسم الدعم الفني في هذه الحالة بالصندوق الأسود، لأنك لا تحتاج لمعرفة ما بداخله، وتسمى واجهته بواجهة برمجة التطبيقات API، فلكل صندوق أسود واجهة برمجة تطبيقات خاصة به، هذا الصندوق الأسود هو الكائن الذي نتحدث عنه.
نعود بالحديث الآن إلى الكائنات، يتكون الكائن كما قلنا من جزأين أساسيين، الدوال والمتغيرات، وعملية إنشاء الكائن تتلخص في خطوتين، الخطوة الأولى هي تعريف البرنامج بشكل الكائن، والخطوة الثانية هي إنشاء الكائن حسب الشكل الذي حددته في الخطوة الأولى، ففي الخطوة الأولى ترسم الإطارات الخارجية وتكتب الدوال للكائن وتحدد متغيرات الكائن وتبين فيها العام والخاص ويسمى هذا بالصنف Class أي أنك تنشأ صنفا جديدا مثلا صنف السيارات، تحدد في وظائف السيارات ومتغيراتها، وفي الخطوة الثانية تقول للكمبيوتر أريد منك أن تنشأ لي سيارة إسمها LeGrouze مثلا، فسيعرف الكمبيوتر كيف سيكون شكل هذه السيارة لأنك عرفته من قبل كيف تكون السيارة، وتسمى السيارة الجديدة التي أنشأتها بالنسخة Instance لأنها عبارة عن نسخة عاملة من مخطط السيارات.
وقد رافقت فكرة البرمجة الكائنية ثورة عارمة وظهور لتقنيات وأفكار جديدة أهمها :
اشتقاق الكائنات Subclassing
يمكنك بهذه الطريقة عمل كائنات جديدة معتمدا على كائنات موجودة مسبقا، مع إضافة بعض الأجزاء إليها، إذا أردت أن تقوم بعمل صنف جديد لسيارات الجيب، فإنك تذهب إلى صنف السيارات الذي أنشأته سابقا وتضيف إليه ميزة الدفع الرباعي والناقل اليدوي والحجم الكبير وشكل الجيب المميز فيصبح عندك صنف جديد هو سيارات الجيب، ويقال هنا أن صنف سيارات الجيب صنف مشتق من السيارات Subclass وتسمى عملية الإشتقاق هذه بالـ Subclassing، ويقال هنا أن الجيب ترث صفات السيارة وهذه هي ميزة الوراثة Inheritance في البرمجة كائنية المنحى.
تعدد الأوجه Polymorphism
Poly يعني عديد و morphism يعنى الوجه أو الهيئة، تمكنك هذه الميزة من عمل أكثر من دالة لها نفس الاسم ولكنها تختلف في قائمة الوسيطات ( المدخلات ) فإذا كتبت اسم وظيفة فإن البرنامج سيرى ما هي المدخلات التي تريد أن تدخلها في هذه الوظيفة ويرى بعد ذلك ما هي الوظيفة التي تأخذ هذه المدخلات فيجعلها تعمل دون غيرها، ويمكن الإستفادة من ذلك في عدة أمور مثلا عملية الجمع بالنسبة للنصوص تختلف عنها بالنسبة للأرقام وتختلف عنها بالنسبة للكسور الإعتيادية، فهنا يمكنك عمل عدة وظائف بنفس الإسم، وإذا كتب هذا الإسم ووضعت فيه نصوصا كمدخلات فإن الوظيفة الخاصة بالنصوص هي التي ستنفذ وليست الوظيفة الأخرى الخاصة بالأرقام ولا الخاصة بالكسور، وهكذا.
ومن أشهر البرامح التي تعمل بأسلوب البرمجة الكانية المنحى C++ و Java و Visual Basic و Delphi وجميع لغات البرمجة الحديثة، وحتى لغات البرمجة القديمة تم تطويرها تعمل وفق نظام البرمجة الكائنية المنحى.
البرمجة المرئية Visual Programming
البرمجة المرئي هي عبارة عن أسلوب جديد للبرمجة، تستخدم فيه برامج مساعدة لتصميم واجهة الإستخدام ( الأزار والنصوص .. ) وربطها بالشفرة البرمجية، وتسمى هذه البرامج المساعدة ببيئة التطوير المدمجة Integrated Development Environment IDE.
في السابق كانت البرامج تستخدم ما يسمى بسطر الأوامر Command Line أو المحث، فكان يظهر البرنامج في صورة عدة أسطر ثم يتوقف ليقول لك .. ( أدخل اسمك ثم اضغط مفتاح Enter ) ولم يكن له وظيفة إلا انتظارك لتدخل إسمك ثم يكمل عمله طبيعيا، أما الآن ومع الواجهات الرسومية، تظهر أمام المستخدم عشرات الأزرار والخيارات والقوائم وغيرها، ولا يمكن للبرنامج أن يتوقع ما الذي سيحدث في الخطوة التالية، لذا فإن البرنامج يقسم إلى عدة وظائف ينفذ كل منها عندما يحدث ما يسمى بالحدث، نقرة الزر مثلا تعتبر حدثا، ضغط أحد المفاتيح يعتبر حدثا، الإتصال بالإنترنت يعتبر حدثا، كل هذه تعتبر أحداث، وتسمى الدالة التي تعمل عند حدوث الحدث بالدالة الحدثية أو الدالة المرتبطة بالحدث.
ومن أشهر بيئات التطوير الرسومية Visual C++ و Visual Basic و Visual J++ و Delphi و Borland C++ و Borland C++ Builder و Java Builder وغيرها الكثير، وتستخدم هذه البرامج نسخ محسنة من لغات البرمجة العادية والقديمة وتدمجها في بيئة التطوير الخاصة بها، لذلك فإن Delphi مثلا ليست لغة برمجة بمعنى الكلمة، وإنما هي بيئة تطوير تستخدم لغة محسنة من Pascal تتميز بميزات الكائنات وميزات أخرى فيطلق عليها مجازا لغة Delphi.
--------------------------------------------------------------------------------
تقنيات البرمجة
تطورت الأساليب والتقنيات المستخدمة في كتابة البرامج عبر السنين، ويرجع ذلك إلى تغير متطلبات البرمجة وأهميتها وأهدافها.
البرمجة الإجرائية Procedural Programming
البرنامج الإجرائي ما هو إلا لائحة من الأوامر فقط خطوة خطوة، وهي الطريقة التي يعمل بها المعالج والكمبيوتر بشكل عام لأن الكمبيوتر ينفذ ولا يفكر، يستخدم هذا الأسلوب لكتابة البرامج الصغيرة والمهمة جدا والتي تحتاج إلى ميزات عالية ووصول إلى أجزاء حساسة من الحاسوب مثل إدارة الإقلاع Booting ومن هذه اللغات البرمجية لغة Assembly.
البرمجة البنيوية Structured ************************
وهو تطبيق عملي لمبدأ فرق تسد، حيث تقوم فكرتها على أساس تقسيم البرامج إلى عدة أقسام كل منها يستدعي الآخر، فمثلا إذا أردت أن تكتب برنامجا يقوم بحساب عدد الموظفين في الشركة، يمكن تقسيم عمل البرنامج إلى التالي :
فتح قاعدة البيانات
معرفة عدد السجلات
إغلاق قاعدة البيانات
عرض النتيجة
إغلاق البرنامج
إضافة إلى ذلك فإن هذا البرنامج بأكمله يمكن أن يكون مجرد وظيفة في برنامج آخر أكبر، وهكذا، توجد في هذه التقنية عدة دوال أو وظائف Functions كل وظيفة لها دخل خاص بها، وتعطي خرجا خاصا بها، ويتم تبادل هذه البيانات ( الدخل والخرج ) بين الدوال المختلفة فتستدعي كل دالة الأخرى وهكذا، وهذا يسهل العمل على المبرمج ويجعل الأمور تبدو واضحة أمامه، وإذا أراد تحسين البرنامج فهذا أمر سهل، فمثلا إذا أراد أن يغير أسلوب عرض النتيجة لن يضطر إلى البحث في سطور البرنامج عن الأماكن التي حدث فيها عرض النتيجة على الشاشة بل سيضطر فقط إلى تغيير الدالة التي تقوم بعرض النتيجة، ولن يضطر للمساس بباقي دوال البرنامج وسوف يظهر أثر التغيير الذي قام به في جميع الأماكن التي تستدعي الدالة التي غيرها، وفي هذا الأسلوب من البرمجة يتم تخزين البيانات في متغيرات، وهذه المتغيرات تكون إما عامة Public أو خاصة Private، المتغيرة العامة هي المشتركة بين جميع دوال البرنامج، والخاصة تظهر فقط في دالة محددة، لذلك لتبادل البيانات بين الدوال نستخدم متغيرات عامة، يمكن تشبيه الموقف بشركة كبيرة بها عدد من الأقسام ( الدوال ) كل قسم له وظيفته، البيانات الموجودة داخل القسم لا يستطيع أن يصل إليها إلا من في القسم، وإذا أردت أن تضع معلومات يستطيع الجميع الوصول إليها لا بد من وضعها في الأرشيف العام للشركة الذي يستطيع الوصول إليه والقراءة منه والكتابة إليه، ومن أشهر اللغات التي تستخدم هذا الأسلوب لغة C.
المتغيرات : أماكن لتخزين البيانات.
البرمجة الكائنية المنحى Object Oriented Programming OOP
وهي أرقى أنواع البرمجة وفيها يقسم البرنامج إلى وحدات تسمى الكائنات، والكائن هو كتلة من الدوال والمتغيرات، يستطيع الكائن أن يحاكي الأمور الحياتية بواقعية أكثر، فمثلا إذا كان عندنا كائن سيارة فإن للسيارة متغيرات خاصة بها ودوال خاصة بها أيضا، مثلا من متغيرات السيارة، كمية الوقود المتوفرة، وسرعة السيارة الحالية، ودرجة حرارة المحرك، ومن دوال السيارة دالة لزيادة السرعة، ودالة المكابح، ودالة تشغيل أضواء السيارة، تستطيع بهذه الطريقة أن تفهم أجزاء البرنامج أكثر، ويصبح المبرمج منظما أكثر، ففي السابق كنا نقول بأنك إذا أردت معلومة ما من قسم آخر يجب أن تكون هذه المعلومة متوفرة في الأرشيف العام ولكن هذا يؤدي إلى فوضى عارمة في الأرشيف، بحيث يمكن للمبرمج أن يعطي مثلا الإسم نفسه لمتغيرتين مختلفتين في الأرشيف ويحصل على نتائج غير متوقعة دون أن يعرف الخطأ بسهولة، والمشكلة الأكبر تحدث عندما يكون البرنامج عبارة عن مشروع ضخم يديره فريق كامل من المبرمجين، فتصبح عملية التنسيق بينهم صعبة جدا، في البرمجة الكائنية المنحى إذا كنت في قسم المبيعات وأردت أن تعرف عدد الأشخاص اللذين ذهبوا إلى قسم الدعم الفني خلال الأسبوع الماضي،فمن غير المعقول أن تدخل قسم الدعم الفني وتتجه إلى خزاناتهم وتبدأ بتقليب الأوراق بحثا عن المعلومة، وكما قلنا سابقا، فكرة الأرشيف أيضا فاشلة، لذلك فإن الحل هو أنك تتصل بقسم الدعم الفني وتسألهم ( كم عدد الزوار الذين زاروا قسمكم خلال الأسبوع الماضي؟ ) فتحصل منهم على النتيجة التي تريدها وتكمل عملك بشكل طبيعي، هنا قسم الدعم الفني وفر لك وظيفة جديدة أو دالة جديدة تعطيك عدد زوار القسم خلال الأسبوع الماضي، وبهذه الطريقة ستضمن أنت أنك تستطيع الحصول على المعلومة، ويضمن قسم الدعم الفني أنك لن تستطيع الوصول إلا إلى المعلومة التي تريدها، أو التي يحق لك معرفتها، ولن تستطيع تغيير محتوى الدالة لأنها مخفية عنك، وفي نفس الوقت لن تحتاج لمعرفة الطريقة التي يعمل بها قسم الدعم الفني داخليا أنت فقط تحصل على المعلومات من خارج قسم الدعم الفني بالوسائل المتفق عليها، أي من خلال واجهة الدعم الفني، يسمى قسم الدعم الفني في هذه الحالة بالصندوق الأسود، لأنك لا تحتاج لمعرفة ما بداخله، وتسمى واجهته بواجهة برمجة التطبيقات API، فلكل صندوق أسود واجهة برمجة تطبيقات خاصة به، هذا الصندوق الأسود هو الكائن الذي نتحدث عنه.
نعود بالحديث الآن إلى الكائنات، يتكون الكائن كما قلنا من جزأين أساسيين، الدوال والمتغيرات، وعملية إنشاء الكائن تتلخص في خطوتين، الخطوة الأولى هي تعريف البرنامج بشكل الكائن، والخطوة الثانية هي إنشاء الكائن حسب الشكل الذي حددته في الخطوة الأولى، ففي الخطوة الأولى ترسم الإطارات الخارجية وتكتب الدوال للكائن وتحدد متغيرات الكائن وتبين فيها العام والخاص ويسمى هذا بالصنف Class أي أنك تنشأ صنفا جديدا مثلا صنف السيارات، تحدد في وظائف السيارات ومتغيراتها، وفي الخطوة الثانية تقول للكمبيوتر أريد منك أن تنشأ لي سيارة إسمها LeGrouze مثلا، فسيعرف الكمبيوتر كيف سيكون شكل هذه السيارة لأنك عرفته من قبل كيف تكون السيارة، وتسمى السيارة الجديدة التي أنشأتها بالنسخة Instance لأنها عبارة عن نسخة عاملة من مخطط السيارات.
وقد رافقت فكرة البرمجة الكائنية ثورة عارمة وظهور لتقنيات وأفكار جديدة أهمها :
اشتقاق الكائنات Subclassing
يمكنك بهذه الطريقة عمل كائنات جديدة معتمدا على كائنات موجودة مسبقا، مع إضافة بعض الأجزاء إليها، إذا أردت أن تقوم بعمل صنف جديد لسيارات الجيب، فإنك تذهب إلى صنف السيارات الذي أنشأته سابقا وتضيف إليه ميزة الدفع الرباعي والناقل اليدوي والحجم الكبير وشكل الجيب المميز فيصبح عندك صنف جديد هو سيارات الجيب، ويقال هنا أن صنف سيارات الجيب صنف مشتق من السيارات Subclass وتسمى عملية الإشتقاق هذه بالـ Subclassing، ويقال هنا أن الجيب ترث صفات السيارة وهذه هي ميزة الوراثة Inheritance في البرمجة كائنية المنحى.
تعدد الأوجه Polymorphism
Poly يعني عديد و morphism يعنى الوجه أو الهيئة، تمكنك هذه الميزة من عمل أكثر من دالة لها نفس الاسم ولكنها تختلف في قائمة الوسيطات ( المدخلات ) فإذا كتبت اسم وظيفة فإن البرنامج سيرى ما هي المدخلات التي تريد أن تدخلها في هذه الوظيفة ويرى بعد ذلك ما هي الوظيفة التي تأخذ هذه المدخلات فيجعلها تعمل دون غيرها، ويمكن الإستفادة من ذلك في عدة أمور مثلا عملية الجمع بالنسبة للنصوص تختلف عنها بالنسبة للأرقام وتختلف عنها بالنسبة للكسور الإعتيادية، فهنا يمكنك عمل عدة وظائف بنفس الإسم، وإذا كتب هذا الإسم ووضعت فيه نصوصا كمدخلات فإن الوظيفة الخاصة بالنصوص هي التي ستنفذ وليست الوظيفة الأخرى الخاصة بالأرقام ولا الخاصة بالكسور، وهكذا.
ومن أشهر البرامح التي تعمل بأسلوب البرمجة الكانية المنحى C++ و Java و Visual Basic و Delphi وجميع لغات البرمجة الحديثة، وحتى لغات البرمجة القديمة تم تطويرها تعمل وفق نظام البرمجة الكائنية المنحى.
البرمجة المرئية Visual Programming
البرمجة المرئي هي عبارة عن أسلوب جديد للبرمجة، تستخدم فيه برامج مساعدة لتصميم واجهة الإستخدام ( الأزار والنصوص .. ) وربطها بالشفرة البرمجية، وتسمى هذه البرامج المساعدة ببيئة التطوير المدمجة Integrated Development Environment IDE.
في السابق كانت البرامج تستخدم ما يسمى بسطر الأوامر Command Line أو المحث، فكان يظهر البرنامج في صورة عدة أسطر ثم يتوقف ليقول لك .. ( أدخل اسمك ثم اضغط مفتاح Enter ) ولم يكن له وظيفة إلا انتظارك لتدخل إسمك ثم يكمل عمله طبيعيا، أما الآن ومع الواجهات الرسومية، تظهر أمام المستخدم عشرات الأزرار والخيارات والقوائم وغيرها، ولا يمكن للبرنامج أن يتوقع ما الذي سيحدث في الخطوة التالية، لذا فإن البرنامج يقسم إلى عدة وظائف ينفذ كل منها عندما يحدث ما يسمى بالحدث، نقرة الزر مثلا تعتبر حدثا، ضغط أحد المفاتيح يعتبر حدثا، الإتصال بالإنترنت يعتبر حدثا، كل هذه تعتبر أحداث، وتسمى الدالة التي تعمل عند حدوث الحدث بالدالة الحدثية أو الدالة المرتبطة بالحدث.
ومن أشهر بيئات التطوير الرسومية Visual C++ و Visual Basic و Visual J++ و Delphi و Borland C++ و Borland C++ Builder و Java Builder وغيرها الكثير، وتستخدم هذه البرامج نسخ محسنة من لغات البرمجة العادية والقديمة وتدمجها في بيئة التطوير الخاصة بها، لذلك فإن Delphi مثلا ليست لغة برمجة بمعنى الكلمة، وإنما هي بيئة تطوير تستخدم لغة محسنة من Pascal تتميز بميزات الكائنات وميزات أخرى فيطلق عليها مجازا لغة Delphi.
تعليق