يعتبر العديد من الأشخاص في الصين أن دلفي هي أداة التطوير المفضلة لديهم. السبب بالطبع هو أن دلفي توفر للمطورين العديد من الميزات: التطوير الموجه للكائنات، وتصميم الواجهة المرئية، والمكونات الغنية، وإمكانية النقل متعدد المنصات (ميزات جديدة لـ Delphi6).
لكن بالنسبة للمبتدئين، قد لا يكون التفكير الموجه للكائنات هو الشعور الأكبر الذي تجلبه لهم دلفي. يترك تصميم الواجهة المرئية والمكونات الغنية والمتنوعة المتوفرة انطباعًا عميقًا لا يُنسى. والنتيجة الخطيرة لذلك هي أن المبتدئين غالبًا ما يركزون فقط على استخدام مكونات VCL الموجودة التي توفرها دلفي لفترة طويلة، مع إهمال التفكير في تأثير التفكير الشيئي على دلفي بأكملها المعنى الموجود في بنية المكونات نظام.
يحتوي الجزء التالي من التعليمات البرمجية على أحد الأخطاء الأكثر شيوعًا التي يرتكبها المبتدئون غالبًا، وعلى الرغم من أن هذا الخطأ ليس خطأ نحويًا، إلا أنه يكشف أن تفكير المستخدم الموجه للكائنات يحتاج إلى تعزيز:
فار
Form1: TForm1؛
تطبيق
{$R *.dfm}
الإجراء TForm1.Button1Click(Sender: TObject);
يبدأ
ShowMessage(Form1.Caption); // <-- توجد بعض المشكلات في استخدام Form1 هنا.
نهاية؛
يبدو أنه لا يوجد خطأ في هذا النوع من التعليمات البرمجية للوهلة الأولى. ومع ذلك، فإن ظهور Form1 هنا غير معقول إلى حد ما. من الواضح أن الكود هنا مكتوب لتنفيذ طريقة ButtonClick الخاصة بـ TForm1، وForm1، كمثال لفئة TForm1، تمت كتابته بالفعل في تنفيذ الفصل، أليس هناك بعض الالتباس المفاهيمي؟ كما أنه بسيط جدًا ويمكن كتابته بطريقتين:
1.ShowMessage(Self.Caption); // <-- طريقة الكتابة هذه واضحة جدًا. المعلومات التي سيتم عرضها هي التسمية التوضيحية للمثيل الحالي للفئة.
2.ShowMessage(Caption); // <-- طريقة الكتابة هنا هي نفسها المذكورة أعلاه، ولكن تم حذف الكلمة الرئيسية؛
المحتويات الأساسية الثلاثة للتفكير الموجه للكائنات هي التغليف والميراث وتعدد الأشكال. المشكلة التي كشفها المثال أعلاه هي مشكلة التغليف. تشمل الأمثلة المشابهة ما يلي:
فار
Form1: TForm1؛
...
فار
Form2: TForm2؛
الإجراء TForm1.Button1Click(Sender: TObject);
يبدأ
Form2.Show; // <-- كمتغير عام، يعد استخدام Form2 هنا أمرًا مربكًا أيضًا.
نهاية؛
قد يكون المثال أعلاه أكثر عمومية في معظم الحالات، في المشروع، قد يكون لكل من TForm1 و TForm2 مثيل واحد فقط، لذلك يمكن اعتبار هذا الرمز مقبولاً. ولكن بالمعنى الدقيق للكلمة، فإنه لا يلبي متطلبات التغليف. الرجوع إلى الكود التالي:
يكتب
TForm1 = الفئة (TForm)
Button1: TButton؛
الإجراء Button1Click(Sender: TObject);
خاص
{تصريحات خاصة}
FNext: TForm؛
عام
{التصريحات العامة}
خاصية NextForm: قراءة TForm FNext وكتابة FNext؛
نهاية؛
فار
Form1: TForm1؛
تطبيق
يستخدم الوحدة 2؛
{$R *.dfm}
الإجراء TForm1.Button1Click(Sender: TObject);
يبدأ
إذا تم تعيينه (FNext) بعد ذلك
TForm2(FNext).عرض؛
نهاية؛
نهاية.
// فيما يلي محتوى ملف المشروع:
مشروع البرنامج1؛
الاستخدامات
النماذج،
الوحدة 1 في "Unit1.pas" {Form1}،
Unit2 في 'Unit2.pas' {Form2}؛
{$R *.res}
يبدأ
application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Form1.NextForm := Form2; // <-- أضف هذه الجملة لجعل الكود يلبي متطلبات التغليف
Application.Run;
نهاية.
قم بتمرير مؤشر Form2 إلى Form1 كسمة لـ Form1 وبهذه الطريقة، يتوافق Form1 مع مبدأ التغليف عند الاتصال! بالطبع، هذه الرموز تعكس فقط فكرة التغليف، ومن الناحية العملية، يمكنك أن تقرر ما إذا كنت تريد حقًا تنفيذها بشكل كامل وفقًا لعاداتك الشخصية. ولكن هذا النوع من التفكير يجب أن يتجذر في العقل... (غير مكتمل، يتبع).
المزيد من المقالات