لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 02/11/17 في كل الموقع
-
مقدمة إلى المفهوم الكائني تُعتبر لغة سي شارب لغة برمجة كائنيّة صرفة pure object oriented programming language فكلّ ما تشاهده أمامك في سي شارب عبارة عن كائن. سيكون هذا الدّرس نظريًّا بعض الشيء ولكن فهمه بالشكل الصحيح يُعدّ أمرًا حيويًّا للبرمجة باستخدام سي شارب. ولنكن واقعيين، فإنّ هذا الدرس يُعتبر مدخلًا مبسّطًا للغاية إلى هذا الموضوع المهم والضخم ولا يمكن اعتباره بأيّ حال من الأحوال مرجعًا للبرمجة كائنيّة التوجّه. ستحصل -بعد قراءتك لهذا الدرس- على المعرفة الضروريّة للتمييز بين الأصناف classes والكائنات objects وفهم العلاقة بينهما. بالإضافة إلى فهم المبادئ الأوليّة للوراثة والتغليف. لكي نفهم ما هو الصنف وما هو الكائن اسمع منّي هذه القصّة: نتبع نحن البشر إلى ما يسمّى بالصنف الإنساني. يُعرّف هذا الصنف المزايا التي يجب أن يتمتّع بها كلّ إنسان. فمثلًا لكلّ إنسان اسم وطول ووزن ولون عينان وبصمة إبهام مميّزة تميّزه عن أيّ إنسان آخر. يُعرّف الصنف class الإنسانيّ هذه الصفات السابقة، بحيث أنّ كلّ كائن object إنسانيّ من هذا الصنف تكون له مثل هذه الصفات ولكنّ مع مجموعة خاصّة من القيم لها. فمثلًا الكائن من الصنف الإنساني هو إنسان قد يكون اسمه سعيد وطوله 180 سم ولون عينيه أسود وله بصمة إبهام مميّزة، وهذا الإنسان يختلف عن كائن إنسانيّ آخر، اسمه عمّار وطوله 175 سم ولون عينيه بنيّ وله أيضًا بصمة إبهام مميّزة خاصّة به، وهكذا. ندعو الصفات السابقة بالخصائص Properties، فالصنف Class يعرّف الخصائص، أمّا الكائن Object فيتمتّع بهذه الخصائص ولكن مع مجموعة قيم لها تميّزه عن كائنٍ آخر. أمر آخر، يُعرّف الصنف الإنساني أيضًا سلوكيّات أو إجراءات معيّنة خاصّة للكائنات التي تعود للصنف الإنسانيّ. فهناك مثلًا سلوكيّات المشي والجري والضحك. وفي الغالب أنّ كل كائن يُعبّر عن هذه السلوكيّات بشكل يراعي خصوصيّته. فلكلّ منّا أسلوب مختلف في الضحك. كما يمتلك كلّ منّا أسلوب مختلف في المشي والجري، فقد تميّز إنسانًا لا ترى وجهه من خلال مشيته فقط وهذا أمر واردٌ جدًّا. مثل هذه السلوكيّات Methods نصطلح عليها في البرمجة بالتوابع. فالصنف الإنسانيّ يُعرّف وجود مثل هذه السلوكيّات ولكلّ كائن إنسانيّ الحريّة في التعبير عن هذه السلوكيّات بالشكل الذي يرغبه. التابع في البرمجة يضم تعليمات برمجية يجري تنفيذها عند استدعائه. يعالج ويتعامل هذا التابع عادةً مع الخصائص والتوابع الأخرى الموجودة ضمن نفس الكائن. نسمي التوابع والخصائص بأعضاء الصنف class members وهناك أعضاء أخرى سنتناولها في الدروس التالية. المبادئ العامة للمفهوم كائني التوجه هناك المئات من المقالات والكتب التي تتحدّث عن المفهوم الكائنيّ من منظورات مختلفة، وهناك أساليب متعدّدة تسمح بتحليل المسألة المطروحة وتصميمها وفق أسلوب كائنيّ أو ما يُعرف بالتصميم والتحليل كائنيّ التوجّه OOAD. ولكن يكفيك أن تعرف الآن أنّ هناك مبدآن أساسيّان ينبغي أن تتمتّع بها أيّ لغة برمجة تدعم المفهوم كائنيّ التوجّه وهما: التغليف Encapsulation والوراثة Inheritance. وهناك مفهوم مهم آخر يستند إلى الوراثة وهو التعدّديّة الشكلية Polymorphism. التغليف Encapsulation وهو مبدأ جوهري في البرمجة كائنيّة التوجّه، وهو أحد أسباب ظهور هذا المفهوم. يُقرّر هذا المبدأ أنّه ليس من المفترض أن نطّلع على آلية العمل الداخلية للكائن. ما يهمنا هو استخدام الكائن وتحقيق الغرض المطلوب بصرف النظر عن التفاصيل الداخليّة له. تأمّل المثال البسيط التالي: عندما نقود السيّارة ونريد زيادة سرعتها فإنّنا بكلّ بساطة نضغط على مدوسة الوقود. لا أعتقد أنّ أحدًا يهتمّ بالآلية الميكانيكيّة التي تقف وراء الضغط على مدوسة الوقود. فالمطلوب هو زيادة سرعة السيّارة فحسب دون الاهتمام بالتفاصيل الداخليّة. فالسيّارة تُغلّف encapsulate التفاصيل الميكانيكيّة الداخليّة التي تقف وراء زيادة سرعة السيّارة. السيّارة في هذا المثال هو كائن Object. وعمليّة زيادة السرعة هي سلوكيّة (تابع) Method من كائن السيّارة. هناك مثال آخر كثيرًا ما نراه أثناء تجوّلنا في الشوارع ومحطّات القطار وصالات الانتظار، وهو آلات تحضير المشروبات الساخنة. نقف أمام الآلة نُدخل النقود ثمّ نضغط على زرّ محدّد لنحصل على المشروب الساخن الذي نرغب به. لا نهتمّ عادةً بالتفاصيل الداخليّة التي تحدث ضمن الآلة عندما نضغط أحد الأزرار للحصول على كوب من القهوة. فالآلة هنا تُعتبر كائنًا، وعمليّة الحصول على كوب من القهوة هي سلوكيّة Method من هذا الكائن. فهذه الآلة تعمل على تغليف encapsulate التفاصيل الداخليّة لعمليّة التحضير، فكلّ ما نفعله هو ضغط الزر ومن ثمّ نحصل على الناتج المطلوب. فإذا ما أُجري تعديل في الآلة بحيث تتغيّر طريقة تحضير مشروب ساخن لجعله أفضل وأكثر لذّة، فإنّ ذلك لن يؤثّر مطلقًا على أسلوب التعامل مع الآلة للحصول على نفس المشروب، ولن نلاحظ هذا التعديل إلّا بعد تذوّقنا للمشروب وملاحظة الفرق في المذاق. الوراثة Inheritance تُعتبر الوراثة من أهم أشكال إعادة الاستخدام للمكوّنات البرمجيّة، حيث يعمل الصنف الجديد على الاستفادة من المكوّنات الموجودة مسبقًا ضمن الصنف الذي "يرث" منه ويجري عليها بعض التعديلات التي تناسبه على نحو مخصّص. فبدلًا من إنشاء صنف جديد من الصفر، يمكننا إنشاء صنف يعتمد على صنف آخر ويستفيد من خصائصه وسلوكيّاته (توابعه) الموجودة مسبقًا ثمّ يكيّفها أو يضيف عليها. نسمّي الصنف الأساسي الذي نرث منه بالصنف الأب. أمّا الصنف الذي يقوم بعمليّة الوراثة فنسمّيه بالصنف الابن أو بالصنف المشتق. لتثبيت الفكرة لنتناول المثال التالي. في المدارس هناك ثلاثة أنواع أساسيّة من الأشخاص المتواجدين فيها: الطلاب والمدرّسون والإداريّون. يمكننا بناء صنف عام يُمثّل أي شخص يعمل في المدرسة وليكن SchoolMember يحتوي هذا الصنف على خصائص مثل: الاسم والكنية واسم الأب واسم الأم وتاريخ الميلاد ورقم الهاتف. يمكننا البناء على هذا الصنف عندما نريد إنشاء أصناف أكثر "تخصّصًا" منه. مثل الصنف الذي يُعبّر عن الطلاب Student والصنف الذي يُعبّر عن المدرّسين Teacher، والصنف المُعبّر عن الإداريين Staff. يرث كلّ صنف منها من الصنف الأب SchoolMember فيصبح لكلّ منها نفس الخصائص الموجودة ضمن الصنف SchoolMember بشكل تلقائيّ. من الواضح أنّ الصنف Student مخصّص أكثر من الصنف SchoolMember فهو يحتوي بالإضافة إلى الخصائص الموجودة في SchoolMember خصائص فريدة خاصّة به. فمثلًا من الممكن أن يحتوي على الخاصيّة التي تعبّر عن الصفّ الحالي Grade وعن السلوك العام Behavior للطالب، أمّا صنف المدرّس Teacher فمن الممكن أن يحتوي (بالإضافة إلى الخصائص الموجودة ضمن SchoolMember) على خاصيّة Course التي تُعبّر عن المقرّر الذي يدرّسه (رياضيّات، فيزياء ...الخ) والخاصيّة WeeklyHours التي تعبّر عن عدد الساعات التدريسيّة الأسبوعيّة المكلّف بها. وينطبق نفس المفهوم تمامًا على الصنف Staff الذي يعبّر عن الموظّفين الإداريين في المدرسة. فالوراثة تنتقل بنا من الشكل الأكثر عموميّةً SchoolMember إلى الشكل الأكثر تخصيصًا مثل Student. وفي الحقيقة كان من الممكن أن نتابع عمليّة الوراثة اعتبارًا من الصنف Staff فهناك قسم التوجيّه وهناك أمانة السر والإدارة وغيرها، وكلّ منها يمكن أن يرث من الصنف Staff. التعددية الشكلية Polymorphism بفرض أنّنا نريد بناء برنامج يحاكي الحركة الانتقاليّة لعدّة أنواع من الحيوانات لدراسة حيويّة. كلّ من أصناف السمكة Fish والطائر Bird والضفدع Frog ترث من الصنف Animal الذي يمثّل أيّ حيوان. بفرض أنّ الصنف Animal يحتوي على سلوكيّة (تابع) اسمها Move (تُعبّر عن الانتقال)، فكما نعلم أنّ هذه السلوكيّة ستصبح وبشكل تلقائي موجودة ضمن أيّ صنف يرث من الصنف Animal، وهنا تكمن التعدديّة الشكليّة. فكل صنف من الأصناف Fish وBird وFrog يُعبّر عن عملية الانتقال Move بشكل مختلف. فالسمكة ربما تنتقل عن طريق السباحة مترًا واحدًا عند استدعاء التابع Move. أمّأ الطائر Bird فمن الممكن أي يطير مسافة 10 متر عند كل استدعاء للتابع Move، وأخيرًا فإنّه من الممكن للضفدع أن يقفز مسافة 20 سنتيمتر كلّما استدعي التابع Move. فالتابع Move المعرّف ضمن الصنف Animal يمكن التعبير عنه بأشكال متعدّدة ضمن الأصناف الأبناء Fish وBird وFrog كلٌّ بحسب حاجته. الخلاصة تعرّفنا في هذا الدرس على المفهوم العام للبرمجة كائنيّة التوجّه وتعاملنا مع التغليف حيث لا تهمّنا التفاصيل الداخلية لآلية العمل. والوراثة التي تتعلّق بمفهوم إعادة الاستخدام والانتقال من العام (الأب) إلى المخصّص (الابن). بالإضافة إلى التعدديّة الشكليّة التي تسمح لنا بإكساب سلوكيّات مخصّصة للأصناف الأبناء تنسجم مع طبيعتها. سنتناول في الدروس التالية هذه المفاهيم بشكل تطبيقي في سي شارب.1 نقطة
-
سنتحدّث في هذا الدرس عن كيفيّة تطبيق مبادئ البرمجة كائنيّة التوجّه في سي شارب وذلك من خلال إنشاء واستخدام الأصناف والكائنات في هذه اللغة. يمكن التصريح عن صنف في سي شارب باستخدام الكلمة المحجوزة class يليها اسم الصنف وهو يتبع لنفس قواعد التسمية للمتغيّرات، علمًا أنّه يفضّل أن يكون الحرف الأوّل من اسم الصنف حرفًا طباعيًّا كبيرًا. انظر إلى الشكل التالي حيث نرى الصنف البسيط Employee والذي يُعبّر عن موظّف في إحدى الشركات: يحتوي هذا الصنف على ثلاثة حقول بيانات data fields هي: الاسم FirstName الكنية LastName الراتب Salary تستطيع اعتبارها حاليًّا أنّها تمثّل خصائص للصنف Employee، كما يحتوي هذا الصنف على تابع وحيد اسمه DisplayInfo الهدف منه هو الحصول على تمثيل نصيّ لكلّ كائن ننشئه من هذا الصنف كما سنرى بعد قليل، يشبه التابع إلى حدٍّ كبير الدّالة function في لغات البرمجة الأخرى. لا يتطلّب هذا التابع أيّ وسائط في حين أنّه يُرجع قيمة نصيّة من النوع string. هذه الحقول بالإضافة إلى التابع السابق تُعتبر أعضاء ضمن الصنف Employee كما ذكرنا ذلك مسبقًا. تقع أعضاء أيّ صنف ضمن حاضنتيه. لاحظ الكلمة المحجوزة public والموجودة قبل كلّ تصريح لحقل أو تابع ضمن الصنف Employee. هذه الكلمة عبارة عن مُحدّد وصول access modifier. تتحكّم محدّدات الوصول بقابلية الوصول إلى أعضاء الصنف من خارجه، سنتعامل مع نوعين آخرين من محدّدات الوصول وهما private و protected. يكفي أن تعلم الآن أنّ أي عضو في الصنف يمتلك محدّد وصول public يمكن الوصول إليه سواءً من داخل الصنف (أو بشكل أدق من داخل الكائن) أو من خارجه. كما من المفيد أن نعلم أنّه من الممكن استخدام محدّدات الوصول مع الأصناف أيضًا كما سنرى في درس لاحق. إذا أردنا إنشاء كائن جديد من الصنف Employee فعلينا التصريح عن متغيّر مناسب من النوع Employee وذلك على الشكل التالي: Employee empObject; صرّحنا عن المتغيّر empObject على أنّه من النوع Employee. لاحظ التشابه في التصريح عن المتغيّرات بين أنواع موجودة ضمن سي شارب وبين أنواع ننشئها بأنفسنا. التصريح السابق غير كافي لإنشاء الكائن. لإنشاء كائن من النوع Employee علينا استخدام العامل new الذي يعمل على إنشاء كائن من أيّ صنف نرغبه ويعمل على إعادة المرجع (العنوان) لذلك الكائن في الذاكرة. استخدام العامل new سهل حيث يمكننا كتابة ما يلي بعد عبارة التصريح السابقة: empObject = new Employee(); يقوم العامل new بإنشاء كائن جديد من الصنف Employee ثمّ يُسند مرجع (عنوان) هذا الكائن ضمن المتغيّر empObject. لاحظ القوسين الموجودين بعد اسم الصنف Employee. في الحقيقة يُعبّر هذين القوسين عن استدعاء لبانية constructor الصنف Employee عند إنشاء الكائن. ولكن أين هذه البانية؟ هذا ما سنراه بعد قليل. يمكن الآن الوصول إلى الحقول والتوابع الموجودة ضمن الكائن عن طريق كتابة المتغيّر الذي يحوي العنوان إلى الكائن (أي المتغيّر empObject) ثم نضع نقطة وبعدها اسم الحقل أو التابع الذي نريد الوصول إليه. في العبارة التالية سنسند القيمة "Mohammad" إلى الحقل FirstName من الكائن empObject (الكائن الذي يشير إليه empObject): empObject.FirstName = "Mohammad"; حان الآن وقت التنفيذ العمليّ. انظر إلى البرنامج Lesson06_01 الذي يوضّح كيفية إنشاء الصنف Employee وكيفيّة إنشاء كائنين منه: 1 using System; 2 3 namespace Lesson06_01 4 { 5 6 class Employee 7 { 8 public string FirstName; 9 public string LastName; 10 public double Salary; 11 12 public string DisplayInfo() 13 { 14 string result = string.Format("{0} {1} - Salary: {2:N0}", 15 this.FirstName, this.LastName, this.Salary); 16 17 return result; 18 } 19 } 20 21 class Program 22 { 23 static void Main(string[] args) 24 { 25 Employee employee1, employee2; 26 27 employee1 = new Employee(); 28 employee1.FirstName = "Mohammad"; 29 employee1.LastName = "Mansoor"; 30 employee1.Salary = 1000; 31 32 employee2 = new Employee(); 33 employee2.FirstName = "Saleh"; 34 employee2.LastName = "Mahmoud"; 35 employee2.Salary = 2500; 36 37 Console.WriteLine("First Employee: {0}", employee1.DisplayInfo()); 38 Console.WriteLine("Second Employee: {0}", employee2.DisplayInfo()); 39 } 40 } 41 } عند تنفيذ البرنامج سنحصل على الخرج التالي: First Employee: Mohammad Mansoor - Salary: 1,000.00 Second Employee: Saleh Mahmoud - Salary: 2,500.00 نلاحظ من النظرة الأولى للبرنامج السابق أنّه لدينا صنفان ضمن نطاق الاسم Lesson06_01 وهما Employee و Program. يقع التصريح عن الصنف Employee في الأسطر بين 6 و 19 ويحتوي هذا الصنف كما رأينا قبل قليل على أربعة أعضاء وهي عبارة عن ثلاثة حقول FirstName و LastName و Salary بالإضافة إلى التابع DisplayInfo الموجود بين السطرين 12 و18. تنحصر وظيفة هذا التابع في الحصول على التمثيل النصيّ لأيّ كائن ننشئه من الصنف Employee. يحتوي التابع DisplayInfo على أسلوب جميل لتنسيق النصوص يشبه ذلك الأسلوب الذي كنّا نستخدمه مع التابع WriteLine. يحتوي الصنف string على تابع اسمه Format يقبل عدّة وسائط (السطر 14) أولها نصّ تنسيقي، أمّا الوسائط التالية فهي القيم التي ستجد لها أمكنةً ضمن النص التنسيقي، كما كنّا نستخدم التابع WriteLine بالضبط. يُرجع التابع Format نصًّا منسّقًا بحسب القيم الممرّرة له. الشيء الوحيد المختلف هو كيفيّة تنسيق قيمة الراتب Salary باستخدام مُحدّد التنسيق :N0 الموجود ضمن {2:N0}. يخبر هذا المحدّد التابع Format أنّ القيمة التي ستوضع في هذا المكان (وهي قيمة Salary) يجب أن تُنسّق على شكل رقم ذي فاصلة آلاف وبدون فاصلة عشريّة. يفيد مثل هذا التنسيق في الحصول على أرقام منسّقة بشكل محترف تُعبّر عن الراتب الذي يحصل عليه الموظّف وهي تبدو مثل 1,000 أو 2,500. جرّب استخدام التنسيق {2:N1} و {2:N2} ولاحظ الفرق. لاحظ أنّني قد استخدمت الكلمة المحجوزة this متبوعةً بنقطة قبل اسم كل حقل. في الحقيقة تُشير هذه الكلمة إلى الكائن الحالي الذي يتمّ منه استدعاء التابع DisplayInfo كما سنرى ذلك بعد قليل. أمّا لإرجاع القيمة النصيّة من التابع DisplayInfo فإنّنا ببساطة نستخدم الكلمة المحجوزة return ونضع بعدها القيمة المراد إرجاعها. الصنف Program المصرّح عنه في الأسطر بين 21 و 40 هو الصنف الذي تعاملنا معه في جميع البرامج التي كتبناها حتى الآن. يحتوي هذا الصنف على التابع Main الذي يمثّل نقطة الدخول للبرنامج كما نعلم. يبدأ التابع Main بالتصريح عن متغيرين من النوع Employee وهما employee1 و employee2 ثمّ ينشئ كائنًا من النوع Employee باستخدام العامل new (السطر 27) ويسنده إلى المتغيّر employee1. بعد ذلك يمكن استخدام أيّ حقل أو تابع معرّف ضمن الصنف Employee عن طريق المتغيّر employee1 بشرط أن يكون له محدّد وصول public كما هو واضح في الأسطر من 28 حتى 30. يتكرّر نفس الأمر بالنسبة للمتغيّر employee2 الذي سيحمل كائنًا مختلفًا عن الكائن الموجود ضمن employee1. أخيرًا وفي السطرين 37 و38 يتم طباعة التمثيل النصيّ لكلّ من الكائنين باستخدام التابع DisplayInfo. تجدر الإشارة إلى أنّه عند وصول تنفيذ البرنامج إلى السطر 37 وإلى الاستدعاء ()employee1.DisplayInfo تحديدًا سيؤدّي ذلك إلى انتقال التنفيذ إلى السطر 14 ضمن هذا التابع لتنفيذ التعليمات البرمجيّة ضمنه ومن ثمّ الحصول على التمثيل النصيّ للكائن employee1 وإرجاعه إلى السطر 37 مرّة أخرى ليعمل البرنامج على تمرير هذه القيمة النصيّة للتابع WriteLine ومن ثمّ العرض على الشاشة، وبالطبع يتكرّر نفس الأمر تمامًا بالنسبة للكائن ضمن employee2 في السطر 38. إذا كنت تستخدم Visual Studio 2015 بأيّ إصدار فأنصحك أن تنفّذ هذا البرنامج بشكل خُطَوي لكي تتعرّف على آلية عمل هذا البرنامج بشمل عمليّ. اضغط على المفتاح F11 (أو من القائمة Debug > Step Into) لتنفيذ البرنامج باستخدام منقّح الأخطاء debugger. ستلاحظ ظهور مستطيل أصفر يُشير إلى مكان التنفيذ الحالي، وكلما ضغطت المفتاح F11 سينتقل تنفيذ البرنامج إلى العبارة البرمجيّة التالية خطوة بخطوة. البانية constructor ضمن الصنف البانية constructor هي تابع من نوع خاص يجب أن تكون موجودة ضمن أيّ صنف في سي شارب. في حال تمّ إغفالها سيعمل المترجم على توليد واحدة افتراضيّة من أجلنا. في الحقيقة وظيفة البانية هي بناء الكائن وحجز مكان مناسب له في الذاكرة، حيث يتم استدعاء البانية عند إنشاء الكائن باستخدام العامل new. لا يمكن للبواني إرجاع قيمة مخصّصة كما نفعل مع التوابع الأخرى عادةً، في الحقيقة هي تُرجع كائنًا من الصنف الموجودة ضمنه. ولكن يمكن أن تقبل وسائط نمرّرها إليها. استبدل الصنف Employee التالي بذلك الموجود ضمن البرنامج Lesson06_01: 1 class Employee 2 { 3 public string FirstName; 4 public string LastName; 5 public double Salary; 6 7 public Employee() 8 { 9 Console.WriteLine("Hello, I'm in Employee's constructor!"); 10 } 11 12 public string DisplayInfo() 13 { 14 string result = string.Format("{0} {1} - Salary: {2:N0}", 15 this.FirstName, this.LastName, this.Salary); 16 17 return result; 18 } 19 } لقد أضفنا في هذه النسخة البانية ()Employee للصنف Employee. نفّذ البرنامج لتحصل على الخرج التالي: *** Hello, I'm in Employee's constructor! *** *** Hello, I'm in Employee's constructor! *** First Employee: Mohammad Mansoor - Salary: 1,000 Second Employee: Saleh Mahmoud - Salary: 2,500 لاحظ أنّ العبارة: *** Hello, I'm in Employee's constructor! *** قد ظهرت مرّتين في الخرج، وذلك بسبب أنّنا أنشأنا كائنين حيث تُنفّذ هذه البانية من أجل كلّ عملية إنشاء. ولكن السؤال المطروح هنا، ماذا سنستفيد من هذه البانية؟ تُستخدم البواني عمومًا عندما نريد تهيئة الكائن ببعض القيم الضرورية لجعل حالته مستقرّة وذلك أثناء إنشائه وقبل محاولة الوصول إليه من أيّ مصدر خارجيّ. انظر الآن إلى الصنف Employee المعدّل الذي يحوي بانية تقوم ببعض الأعمال المفيدة: 1 class Employee 2 { 3 public string FirstName; 4 public string LastName; 5 public double Salary; 6 7 public Employee(string firstName, string lastName, double salary) 8 { 9 this.FirstName = firstName; 10 this.LastName = lastName; 11 this.Salary = salary; 12 } 13 14 public string DisplayInfo() 15 { 16 string result = string.Format("{0} {1} - Salary: {2:N0}", 17 this.FirstName, this.LastName, this.Salary); 18 19 return result; 20 } 21 22 } تتطلّب البانية هذه المرّة ثلاثة وسائط، تمثّل قيمًا سيتمّ إسنادها إلى الحقول. هذه الوسائط هي: firstName و lastName و salary (لاحظ أنّ اسم كلّ منها يبدأ بحرف طباعي صغير لتمييزها عن حقول الصنف). إذا استبدلت هذا الصنف الجديد بالصنف القديم الموجود ضمن البرنامج Lesson06_01 وحاولت تنفيذ البرنامج فستحصل على خطأ. السبب في ذلك بسيط، وهو أنّ العبارتين في السطرين 27 و 32 من البرنامج Lesson06_01 تحاولان إنشاء كائنين من الصنف Employee عن طريق بانية لا تتطلّب أيّة وسائط وهذا ما لا يتوفّر في الصنف Employee الجديد. فعندما يلاحظ مترجم سي شارب وجود بانية واحدة على الأقل بصرف النظر عن عدد الوسائط التي تتطلّبها فإنّه يمتنع عن توليد بانية افتراضية بشكل تلقائي مثلما كان يفعل من قبل. يوجد حلّ سريع لهذه المشكلة يتمثّل في توفير بانية لا تحتاج لأيّة وسائط كما كان الوضع السابق. انظر إلى النسخة الأخيرة للصنف Employee: 1 class Employee 2 { 3 public string FirstName; 4 public string LastName; 5 public double Salary; 6 7 public Employee(string firstName, string lastName, double salary) 8 { 9 this.FirstName = firstName; 10 this.LastName = lastName; 11 this.Salary = salary; 12 } 13 14 public Employee() 15 { 16 17 } 18 public string DisplayInfo() 19 { 20 string result = string.Format("{0} {1} - Salary: {2:N0}", 21 this.FirstName, this.LastName, this.Salary); 22 23 return result; 24 } 25 26 } بعد اعتماد هذا الصنف ضمن البرنامج Lesson06_01، سيعمل البرنامج الآن بشكل طبيعي ويظهر الخرج كما هو متوقّع. ولكن تأمّل معي هذا الصنف قليلًا، ألا تلاحظ وجود بانيتين له؟ هذا أمر طبيعي ووارد جدًّا في سي شارب حيث يمكن كتابة أكثر من تابع بنفس الاسم طالما اختلف عدد أو أنواع الوسائط الممرّرة لكلّ منهما. نسمي هذه الميزة بزيادة التحميل overloading للتوابع. فعند وجود استدعاء للتابع المزاد تحميله يتمّ اختيار الشكل المناسب بناءً على عدد وأنواع الوسائط الممرّرة. لاحظ أنّ البانية عديمة الوسائط فارغة ولا بأس في ذلك. ولكنّ السؤال هنا كيف يمكن الاستفادة من البانية ذات الوسائط الثلاثة. الأمر بسيط، استبدل محتويات التابع Main في البرنامج Lesson06_01 بالشيفرة البسيطة المكافئة التالية: 1 Employee employee1, employee2; 2 3 employee1 = new Employee("Mohammad", "Mansoor", 1000); 4 employee2 = new Employee("Saleh", "Mahmoud", 2500); 5 6 Console.WriteLine("First Employee: {0}", employee1.DisplayInfo()); 7 Console.WriteLine("Second Employee: {0}", employee2.DisplayInfo()); انظر كم أصبحت الشيفرة نظيفة وقصيرة ومريحة للعين. إليك الآن البرنامج Lesson06_02 كاملًا بعد التعديل: 1 using System; 2 3 namespace Lesson06_02 4 { 5 6 class Employee 7 { 8 public string FirstName; 9 public string LastName; 10 public double Salary; 11 12 public Employee(string firstName, string lastName, double salary) 13 { 14 this.FirstName = firstName; 15 this.LastName = lastName; 16 this.Salary = salary; 17 } 18 19 public Employee() 20 { 21 22 } 23 24 public string DisplayInfo() 25 { 26 string result = string.Format("{0} {1} - Salary: {2:N0}", 27 this.FirstName, this.LastName, this.Salary); 28 29 return result; 30 } 31 32 33 } 34 35 36 class Program 37 { 38 static void Main(string[] args) 39 { 40 Employee employee1, employee2; 41 42 employee1 = new Employee("Mohammad", "Mansoor", 1000); 43 employee2 = new Employee("Saleh", "Mahmoud", 2500); 44 45 Console.WriteLine("First Employee: {0}", employee1.DisplayInfo()); 46 Console.WriteLine("Second Employee: {0}", employee2.DisplayInfo()); 47 } 48 } 49 } تمارين داعمة تمرين 1 أضف تابعًا جديدًا إلى الصنف Employee الموجود في البرنامج Lesson06_02 السابق وسمّه GetSalaryAfterTax. وظيفة هذا التابع هي الحصول على قيمة الراتب للموظّف بعد تطبيق الضريبة Tax عليه. اعتبر نسبة الضريبة 2%. تلميح: اضرب قيمة الراتب Salary بالعدد 0.98 للحصول على قيمة الراتب بعد خصم الضريبة. فإذا كان الراتب 1500 مثلًا، يجب أن يُرجع التابع GetSalaryAfterTax القيمة 1470. تمرين 2 أنشئ صنفًا جديدًا سمّه MyRectangle والذي يُعبّر عن مستطيل في المستوي، بحيث يحتوي على الحقلين Width و Height (من النوع double لكلّ منهما)، بالإضافة إلى التابع GetArea لحساب مساحة المستطيل. ثمّ اكتب برنامجًا بسيطًا يوضّح استخدام هذا الصنف من خلال إنشاء كائنين منه. احسب مساحة كل مستطيل (كائن) واعرض النتيجة على الشاشة. الخلاصة تعلّمنا في هذا الدرس أساسيّات إنشاء الأصناف والكائنات، وكيفية التعامل مع الحقول والتوابع والبواني الموجودة ضمن الصنف. كما أخذنا لمحة سريعة حول محدّدات الوصول وكيفية التعامل مع محدّد الوصول public، علمًا أنّنا ستوضّح كيفيّة التعامل مع باقي المحدّدات في الدرس التالي الذي سنتحدّث فيه عن المزيد حول هذا الموضوع المهم والأساسي لتطوير التطبيقات باستخدام سي شارب.1 نقطة
-
1 نقطة
-
أهلا عزيزي MOHAMMED هل تفقدت تعليقي على أحد المُشاركات ؟ و هل تفقدت هذِهِ الخُطط ,,, أراها مُثيرة للإعجاب حقاََ ..1 نقطة
-
لماذا قد ترى لاعب التنس الشهير Roger Federer في إعلانٍ تسويقي لساعة Rolex رغم أنّه لا توجد علاقة بين التنس والسّاعات الفاخرة؟ لا يهم وجود علاقة بين التنس وساعات رولكس، يملك Federer -كغيره من الأَعلام والمشاهير- شعبيّةً تجعل إعلانات Rolex تصبح أكثر موثوقيّة (وتحصد المزيد من الأرباح) وذلك بفضل القبول الجماهيري الذي يملكه. قد لا تمتلك الشركات الناجحة قوّة التأثير التي يملكها النجوم والمشاهير، لكنها أسست شعبيّتها بنفسها. ومع الشّعبية، تأتي ثقةُ العملاء المحتملين، والشّراكات القيمة وفرص المشاريع المُشتركة (joint venture) ، وسيقلّ كثيرًا الضغط الذي يسببه الاعتماد على التسويق وحده. تخيّل كيف يمكن أن يتغيّر عملُك إذا كان لديك جزءٌ فقط من شعبيّة كوكا كولا أو مايكروسوفت! الجانب المُشرق هو أنك تستطيع –مع مرور الوقت- أن تبني شعبيتك بطريقةٍ مُمَنهجةٍ في مجالك. تابع القراءة لتعرف كيف يمكنك ذلك. زيادة شعبيتك: مغامرة كبيرة يصعب قياسها سيساعدك امتلاك شعبيّةٍ على التواصل مع العملاء، الحصول على عائدٍ أعلى، وتحقيق نموّ دائم. هناك بالتأكيد سببٌ لكونها واحدة من مفاتيح عالم النفس الشهير Robert Cialdini السّت للتأثير. في البيئة التنافسيّة اليوم، الشعبيّة عاملٌ مهم يمكن أن يجعل أحد العملاء يميلُ لاختيارك أنت بدلًا من أيّ شخصٍ آخر. على كلّ حال، إذا لم تكن لديك شعبيةٌ كافية، ستقل احتماليّة أن يمنحك أحدهم فرصةً حتى إن كنت تقدم جودةً وسعرًا أفضل من المنافسين الأكثر شعبيّة منك. التحدّي يكون مضاعفًا على الإنترنت، حيث تزداد حدّةُ المنافسة وتزيد شكوك العملاء المحتملين. لكن إليك أهم شيءٍ فيما يتعلّق بهذا العامل المهم (الشعبية) : أنه ليس سهل القياس دائمًا. يمكنك معرفة الزيادة في عدد زوّار الموقع الجدد بعد زيادة نفقات إعلاناتك على فيس بوك بنسبة 10% مثلًا، لكن ليس هناك طريقةٌ تستطيع استعمالها لحساب العائد على الاستثمار ROI في مفهومٍ فضفاضٍ كـ"الشعبية". هل أنت في بداية الطريق؟ في هذه الحالة، أنت بحاجةٍ للشعبيّة أكثر من أي شخصٍ آخر. فكرة بناء الشعبية تبدو رائعة، لكن وسيلة بنائها محيّرةٌ بعض الشيء. لن يساعدك كثيرًا محاكاة الشركات الكبيرة مثل جوجل أو سوني. لديهم بالتأكيد ذلك "العامل المهم" الذي يتمثّل في تمييز العلامة التجارية Brand recognition، فشركاتهم موجودةٌ منذ سنوات ويملكون بلايين الدولارات. لكن ماذا إن كنت لا تزال في البداية؟ بناء الشعبية من أصعب التحديات التي تواجه المشاريع الصغيرة الناشئة، فهو يستغرق وقتًا، وليس هناك طريقةٌ سحريّةُ لفعل ذلك، فبناء الشعبية ليس أمرًا بسيطًا كتوظيف شخصٍ ما أو تغيير ميزانية التسويق. هناك طرقٌ شائعة تتبعها الشركات الناجحة لتزيد من شعبيّتها، يمكنك أن تحذو حذوها لتصير قائدًا فذًّا في مجالك- شخصًا يأسِرُ بالاهتمام وبالتالي، يتقاضى المزيد من الأجر. بناء الشعبية من الألف للياء: خطوات عملية لا يمكنك أن تؤسس شعبيتك بشكلٍ سريعٍ ومباشر، لكن إذا ركزت على النقاط الرئيسية التالية، فستزيد شعبيتك - بحسب جهدك الذي تبذله. أنشئ منصة/ موقعا امتلاك منصّةٍ /موقع هي الخطوة الأولى لبناء موثوقيّتك على الإنترنت. كتبتُ عن هذه النقطة سابقًا لأنها واحدةٌ من أكثر الأمور القيّمة التي يمكن أن تفعلها لعملك. تستغرق المنصّات القوية وقتًا وجهدًا لبنائها، لكنها وسيلةٌ رائعة لجذب العملاء وزيادة حيّز دائرة تأثيرك. لماذا من المهم أن تمتلك موقعًا على الإنترنت؟ لسببٍ واحد: لأنها تُعطي العميل المحتمل مكانًا محددًا على الإنترنت ليجدك ويجد أعمالك. وهذا زادت أهميته بشكلٍ كبير مع بروز الكثير من مواقع التواصل الاجتماعي وانقسام الجماهير إلى مجالات متخصّصة. بدون موقع تستطيع فيها توجيه العملاء المحتملين، ستترك لدى الزوار صورةً غير كاملةٍ عن خبرتك والقيمة التي يقدّمها عملك. آخر شيء تريد أن تفعله هو أن تترك العملاء المحتملين يعانون بأنفسهم لمعرفة كيف يمكنهم إيجادك والتواصل معك. الشخص الذي اشترى كتابًا لك من Amazon لن يستطيع أن يعرف أنك تقدّم مؤتمرًا على الإنترنت Webinar الأسبوع القادم، إلا إذا قمت بإرشاده إلى موقع يعرض فيها تلك الأحداث والمواعيد. ونفس الأمر ينطبق على الشخص الذي يرى تغريداتك الرائعة، إذا لم يعرف موقعك على الإنترنت، فلن يكون بإمكانه أن يعرف أنك تقدّم نوع الاستشارة consulting الذي يبحث عنه. المواقع المثيرة للاهتمام يجب أن تكون سهلة الاستخدام وأن يتم تحديثها بالمحتوى بشكلٍ مستمر. هذه العناصر الرئيسية ستضعك في موضع الخبير ذي الشعبية: مدونة صفحة ويب مصمّمة بشكلٍ احترافي طرق للبقاء على تواصل (اتّصل بنا، نافذة للتسجيل في القائمة البريدية، طلبات عروض، إلخ...) صفحة "من أنا/نحن" دراسات حالة case studies وشهادات توصية testimonials معلومات للاتصال فيديوهات، روابط لكتب،مقالات / أخبار تتحدث عنك ، الخ.. تابع آخر التطورات في مجالك وشارك آراءك حولها إذا كان هناك شيءٌ واحد مشترك في كل الأشخاص الذين يمتلكون شعبيةً في مجالهم، هو أنّهم جميعًا لديهم شيءٌ ليقولوه- يجرون مقابلاتٍ شخصية، يكتبون كتبًا، ولهم رأيٌ ذو أهمية فيما يتعلق بمستجدّات مجالهم. وينبغي عليك أن تفعل الأمر نفسه! مشاركة آرائك حول آخر التطورات في مجالك يُري الناس : أنك تبذل جهدًا لتكون على اطلاعٍ بمستجدّات مجالك. أن لديك ما تقوله. ليس عليك أن تتحدّث بإسهاب عن كلّ صغيرةٍ وكبيرةٍ في المجال أو أن تحرق أعصابك وتهتم بقدرٍ زائد بكل ما يحدث. لكن إذا حدث حَدَثٌ هام وكان لديك رأيٌ متعلّقٌ به، لا تخف من أن تعبر عن نفسك من خلال شبكات التواصل الاجتماعي، رسائل البريد الإلكتروني، أو التدوينات. طالما تدعم آراءك بالخبرة والمنطق، سيحترمها معظم الناس- حتى إن لم يتفقوا معها بشكلٍ كامل. ليس عليك أن تنتظر حتّى يكون لديك قاعدةٌ ضخمةٌ من العملاء لمشاركة أفكارك أو التوقّعات حول مستقبل مجالك. القليل من الجدال شيءٌ صحّي، إذا كتب رائدٌ آخر في المجال مقالًا لا تتفق معه، قم بكتابة مقالٍ للرد عليه . المحتوى المثير للجدل غالبًا ما يجذب المزيد من الزوار! حتى تبني شعبيّتك يجب أن يكون لك رؤيةٌ للمستقبل وأن تعرف كيف يمكنك أن تتبنّى آراءً عميقة. لا يمكنك عمل هذه الأشياء بشكلٍ جيد دون أن تكون متابعًا جيّدًا لمستجدات مجالك وأن تتغلب على الخوف من مشاركة آرائك. استخدم شعبية الآخرين لديك شعبيةٌ قليلة؟ استعِر من الآخرين! يمكنك زيادة شعبيّتك من خلال الشراكة مع أشخاص لديهم شعبيّةٌ بالفعل. هذا الأمر يُعرف بـ "تأثير أوبرا". أوبرا وينفري لم يكن لها شعبية في البداية، لكن بعد عقود من عمل مقابلات مع شخصيات مشهورة، أصبح لديها شعبيةٌ كبيرة. والآن هي الشخص الذي يستخدم وجهه لتسويق الكتب، وبرنامج weight watchers للحميات الغذائية والكثير من الأشياء الأخرى. يمكنك فعل الشيء نفسه- لا تحتاج إلى المشاهير، من أسهل الطرق لعمل ذلك أن تقوم بإنشاء قائمة من المدوّنات واسعة التأثير في مجالك والتي تقبل استضافة تدوينات.اجعل الكتابة فيها عادةً مستمرة، اعمل جيّدًا على المحتوى الذي تقدمه، واستمتع بالشعبية والشهرة اللذَين يتبعان ذلك. يمكنك أيضًا أن تستهدف المجلّات والمواقع المشهورة ( مثل Forbes و Huffington Post) وتحاول أن تنشر مقالاتٍ فيها. النشر في هذه المواقع إنجازٌ رائع يمكنك إبرازه في موقعك، مما يغذّي شعبيتك. إذا لم تكن من النوع الذي يحب الكتابة، يمكنك إجراء مقابلات مع البارزين في مجالك. فقد حقّق John Lee Dumas ( مؤسس FOfire podcast) نجاحًا كبيرًا من خلال إجراء المقابلات مع أشخاصٍ ذوي الشعبية . فكّر في أن تروّج للمحتوى الذي تكتبه الشخصيات المؤثرة الأخرى في مجالك على مدونتك ومنصات الشبكات الاجتماعية. إذا عرضت على الناس المحتوى الأكثر قيمة الموجود في الساحة، ستزيد احتمالية أن يروك شخصًا يمكنهم الوثوق به. لا تتنازل عن معاييرك بالنسبة لشخصٍ ذي شعبية، إدارة الجداول المزدحمة هو فقط أمرٌ روتيني. فهو لا يقوم بالاستجابة لكل فرصة عمل تعترض طريقه، بل يهتم باستغلال أفضل الفرص. وأنت تبني شعبيتك، قد يكون من المنطقي أن تعمل على بعض المشاريع مقابل أجرٍ قليل أو أن تعرض منتجك بسعرٍ منخفض. يكون عليك أحيانًا فعل هذا للحصول على أول شهادات توصية testimonials ويكون لديك ما تعرضه في معرض أعمالك portfolio. وعندما تتقدّم قليلًا، سيكون من الجيّد أن تُضفي شيئًا من الحصرية exclusivity على عملك. الشركات ذات الشعبية انتقائيةٌ فيما يتعلق بالفرص التي تستغلها: 1- لأنها مشغولةٌ جدًا. 2- لأنهم يفهمون أن الذين يتعاملون معهم قد يكون لهم تأثيرٌ كبيرٌ على سمعتهم. هل تريدُ أن تُعرَف كشخصٍ يحبّ الاستقرار ويفعل ما بوسعه ليربح العملاء حتى إن لم يكن يحب ذلك؟ أم تريد أن تكون معروفًا بكونك شخصًا يمتلك رؤيةً حول العملاء الذين يريدُ أن يعمل معهم والقيمة التي يقدمها؟ اختياراتك المتعلقة بهذا الأمر راجعةٌ لك. لا تخف من أن تكون انتقائيًا بعض الشيء فيما يتعلّق بالفرص التي تستغلها، وضع معدّلات عمل منصفةً ومنطقية. عندما تنمو شعبيتك، يصبح التحدّي أن تقرر ما المشاريع "الأفضل" للعمل عليها أو المنتجات الأفضل لتطويرها. وكم هو عظيمٌ أن تواجه مثل هذا التحدي! انشر محتوى طويلا (long-form content) تستعمل الكثير من الشركات التسويق بالمحتوى على الإنترنت لزيادة عدد الزوار ولبناء علاقةٍ جيّدةٍ معهم. يوجد الآن الكثير من المحتويات المتوفرة على الإنترنت، التحدي هو إيجاد أفضلها. معظم المحتوى على الإنترنت سطحي- أشياءٌ مثل التدوينات التي تعيد تنظيم بعض المفاهيم التي قرأها الناس عدّة مرات من قبل. أسباب هذا الأمر مفهومة، لدى الشركات الصغيرة الكثير من المهام والمشاكل بالفعل. لكنهم يسمعون كثيرًا عن الإمكانيّات التي يمنحها التسويق بالمحتوى، لذلك يشعرون بالضغط وأن عليهم أن ينشروا محتوىً جديدًا- حتى إذا لم يعطوه الوقت أو الاهتمام الذي يستحقه. ولنكون أكثر عمقًا فإنّ إنشاء بعض المحتوى الطويل الرائع بدلًا من ذلك يمكنه أن يضيف كثيرًا لشعبيتك. وإليك بعض أنواع المحتوى الطويل الذي يمكنك إنشاؤه: كتب إلكترونية Ebooks أوراق بيضاء white papers ( عبارة عن تقرير أو دليل رسمي) دراسات حالة case studies دليل إرشادي How-to guides كتُبٌ (منشورة ذاتيًا) Self-published books نشر محتوىً طويل (long form content) سيمنح العملاء المحتملين الفرصة لقراءة محتوى متقدم، وهو أمرٌ قيّمٌ جدًا لك لأنهم بذلك يمرّون بمراحل قمع المبيعات sales funnel سيحصل العملاء المحتملون بذلك على المعلومات التي يحتاجونها، ويعرفون أن لديك معرفةً قويةً بمجالك، ويسجلون في قائمتك البريدية (إذا كنت تستعمل المحتوى لجذب الزوّار). إذا لم تكن جيّدًا في الكتابة، لا تختفِ! يمكنك استضافة المؤتمرات على الإنترنت webinars، إطلاق سلسلة فيديوهات على يوتيوب، أو تقديم كورس على الإنترنت على مواقع مثل Udemy. قد يكون من المفيد التسجيل لنفسك وأنت تتحدّثُ عن موضوعٍ ما بصوتٍ مرتفع، ثم توظف شخصًا لتفريغه صوتيًا transcribe. يمكنك توظيف كاتب لتنسيق الأمور، وتحصل في النهاية على محتوىً طويل عظيم. نشر المحتوى بانتظام من مفاتيح النجاح، لكن الكثير من الشركات الصغيرة تهتمّ بالكثرة على حساب الجودة. نشر محتوىً أعمق (حتى إن كان هذا يعني نشر محتوىً أقل) سيجعلك مميزًا وسيبرزك كخبيرٍ في مجالك. ثقة أكبر وعملاء أكثر قد تكون جاهزًا لتسويق "آيفون العصر"، لكن إذا كنت لا تزال في طور تأسيس شركتك، سيكون من الصعب إقناع الناس أن يعطوا منتجك فرصة. الشعبية تمنحك نقطة الانطلاق. ومعها يأتي الثقة من العملاء المحتملين، فرص للدخول في شراكات مربحة ومشاريع مُشتركة ( joint ventures)، وضغط أقل فيما يتعلّق بإنفاق المال على التسويق. ليس شرطًا أن أن يكون لك شعبيّةٌ كشركة أبل، الشعبية ككرة الثلج، إذا بدأت في بناءها، سيساعدك الناس على أن تزيدها من خلال نشر ومشاركة الروابط والتوصيات. لن تستطيع بناء شعبيّتك ما بين عشية وضحاها، لكن إذا ركزت على الأمور المفتاحية المذكورة في هذا المقال، ستنمو شعبيّتك بشكلٍ كبير. لا يوجد وقتٌ أفضل للبدء من الآن. كيف تقوم ببناء شعبيتك في مجالك؟ أخبرنا في خانة التعليقات. ترجمة -وبتصرف- للمقال Authority: Your “Secret Source” for More Business (and How to Build It) لصاحبه Corey Pemberton.1 نقطة
-
أشياء يجب الإهتمام بها , في حال أردت إستضافة جيدة : شهرة موقع الإستضافة وهل يستحق الثقة أم لأ .. الخدمات التي تقدمها الإستضافة " كـ cPanel و إستضافات ال VPS وهل ستقدم لك دعم تقني أم لأ . حجم مساحة التخزين التي تقدمها لك الإستضافة و مساحة الباندويث المقدمة لك ... طيبات على جنب : بعض الإستضافات تقوم بإعطائك بعض الإغراءات كـالـ الإعلانات لموقعك مثلا ... تأكد من أنه يقدم دومين مجاني مع إستضافتك المدفوعة .. هل سيقدم لي الموقع " كوبونات" لتخفيض سعر الإستضافة ؟؟ كــ Hostgator تأكد و حاسب نفسك " على السعر النهائي"1 نقطة