إعادة بناء التعليمات البرمجية – الحصول على مثال لتغليف ترميز DELPHI إعادة بناء التعليمات البرمجية هي طريقة للحصول على بنية جيدة، من خلال إعادة البناء، يمكننا تحسين جودة التعليمات البرمجية وزيادة درجة إعادة استخدام التعليمات البرمجية مع الحفاظ على الوظائف دون تغيير. فيما يلي مثال ملموس لكيفية تحسين جودة التعليمات البرمجية والحصول على التغليف. (يستخدم المثال DELPHI) وظيفة الكود: قم بتعيين عامل تصفية لمجموعة البيانات (TClientDataSet). يمكن للمستخدم تحديد الحقل المراد تصفيته في TComboBox، ثم إدخال القيمة المراد تصفيتها في مربع Tedit. كما هو موضح في الشكل 1: الطريقة الأكثر شيوعًا هي ترميز أسماء الحقول في مجموعة البيانات الخاصة بنا في سمة العناصر في TComboBox، ثم إضافة الكثير من عبارات الحالة أو عبارات if إلى التعليمات البرمجية لتحديد الحقول التي حددها المستخدم لتعيين المرشحات لمجموعة البيانات. ...... case ComboBox1.ItemIndex of0: ClientDataSet.Filtered := False; ClientDataSet.Filter := ' F_CODE = ''' + Edit2.Text + ''''; ClientDataSet.Filtered := True;1: ClientDataSet .Filtered := False; ClientDataSet.Filter := ' F_CHINESE_NAME = ''' + Edit2.Text + ''''; ClientDataSet.Filtered := True;... end; أو استخدم... إذا كان ComboBox1.Text = 'Material Code'، فابدأ ClientDataSet.Filtered := False; ClientDataSet.Filter := ' F_CODE = ''' + Edit2.Text + ''''; ClientDataSet.Filtered := True;endelse if ComboBox1.Text = 'name' ثم ابدأ ClientDataSet.Filtered := False; ClientDataSet.Filter := ' F_CHINESE_NAME = ''' + Edit2.Text + ''''; ClientDataSet.Filtered := True;end... يقوم هذا الرمز أيضًا بتنفيذ مرشحات الإعداد لمجموعة البيانات من خلال الوظيفة يلبي الاحتياجات، ولكن الكود أعلاه غير مرن. إذا كانت مجموعة البيانات تحتوي على العديد من الحقول، فيجب على المبرمج إدخال الحقول واحدًا تلو الآخر في العناصر، ويجب التحقق من الترتيب عند كتابة الحالة، وإلا فسيكون مرشح المجموعة خاطئًا وسيكون من السهل على المطورين تقديمه حشرة. من المؤلم أيضًا الاحتفاظ بعدد كبير من عبارات if عند استخدام if، ولا يدعم تغييرات الطلب. عندما يطلب المستخدم تغيير اسم العرض الصيني لحقل مجموعة البيانات، يجب عليه أيضًا أن يتذكر تغيير البيانات المشفرة في عناصر TComboBox. إذا نسيت، سيتم تقديم BUG. لذا، في عملية إعادة البناء الأولى، حاولت تحميل البيانات ديناميكيًا في TComboBox Items، وفي نفس الوقت، من أجل تحقيق المقارنة عندما يختار المستخدم بعد التحميل. لقد قمت بإضافة حقل FFields: array[0..20, 0..2] خاص بسلسلة إلى نموذج الاستعلام هذا لحفظ بيانات معلومات الحقل في مجموعة البيانات. في الوقت نفسه، يتم تنفيذ عملية تحميل البيانات: PROcedure TFrmSPARealStorageQuery.GetQueryFields;var i, iFieldsCount: Integer;begin iFieldsCount := 0; مع DBGride1.DataSource.DataSet تبدأ لـ i:= 0 إلى Fields.Count - 1 افعل إذا كانت الحقول [i].Visible ثم ابدأ FFields[iFieldsCount, 0] := Fields[i].FieldName; (FFields[i, 1]); end;end; وهذا يتيح التحميل الديناميكي للمعلومات الميدانية في وقت التشغيل. لذلك تبدو إعدادات التصفية الخاصة بي هكذا. if ComboBox1.Text <> '' ثمbeginClientDataSet.Filtered := False; ClientDataSet.Filter := FFields[ComboBox1.ItemIndex, 0] + '''' + Edit2.Text + ''''; ClientDataSet.Filtered := True; النهاية؛ لا شك أن هذه الطريقة تزيد من مرونة الكود وتزيد من إمكانية إعادة استخدام الكود، لأن الكود معزول جيدًا عن البيانات المتغيرة. لذلك، يمكن القول أنه مناسب طالما قمت بإضافة الحقل الخاص FFields: array[0..20, 0..2] من السلسلة في نموذج آخر يريد أيضًا تنفيذ هذه الوظيفة واستخدام العملية المذكورة أعلاه ديناميكيًا يتم تحقيق إعادة استخدام حقول مجموعة البيانات. لكن إعادة الاستخدام هذه ليست جيدة جدًا لأننا لم نحقق تغليفًا جيدًا. يؤدي هذا إلى تكرار التعليمات البرمجية المنتشرة في كل مكان في برنامجك (غالبًا ما تستخدم COPY للحصول على إعادة استخدام هذه الوظيفة، لأن الكود أعلاه لا يحتوي على تغليف جيد). إذا أردت يومًا ما تعديل وظيفة تحميل البيانات، فسيتعين عليك العثور على مكان ما لنسخ الوظيفة - وسيتعين عليك تعديل الكود المنتشر في أماكن أخرى. لذلك قمت بإعادة هيكلتها مرة أخرى وقمت بتغليف الكود بشكل أكبر. الكود كما يلي: Unit uDataSetFieldsInfo; // الوصف: تتضمن الوحدة فئة TDataSetFieldsInfo، والتي تتضمن الحصول على معلومات المقطع الفرعي لمجموعة البيانات. // ويوفر واجهة طريقة لعرض المعلومات في حقل عرض قائمة combobox والحصول على اسم القسم الفرعي المقابل // تم الإنشاء: wuchhao // التاريخ: 2003.5interfaceuses Classes, DBClient, StdCtrls; تدمير الإجراء المدمر GetDataSetFields (المصدر: TClientDataSet); الإجراء ShowFieldsInfo(Target: TComboBox); TDataSetFieldsInfo.Destroy;begin FFieldsList.Free;end;يبدأ الإجراء TDataSetFieldsInfo.GetDataSetFields(Source: TClientDataSet);var i: Integer;begin FFiedsList.Clear مع المصدر لـ i:= 0 إلى Fields.Count - 1 do if الحقول [i].مرئية ثم تبدأ FFieldsList.Add(Fields[i].DisplayLabel); = ''; فهرس := FFieldsList.IndexOf(DisplayLabel); <> -1 ثم النتيجة := FFieldsList.Strings[index+1] ;end;procedure TDataSetFieldsInfo.ShowFieldsInfo(Target: TComboBox);var i: Integer;begin Target.Items.Clear i:=0; while i < FFieldsList .يبدأ العد Target.Items.Add(FFieldsList.Strings[i]); i:= i+ 2; end;end;end. تقوم الوحدة uDataSetFieldsInfo بتغليف البيانات والأساليب المتعلقة بتحقيق الوظائف الموضحة في هذه المقالة، وتغليفها في فئة، وبالتالي تحقيق مبدأ Open - Close في التصميم الموجه للكائنات. يتحول الفصل إلى صندوق أسود، بحيث يمكن إعادة استخدامه بسهولة (إعادة استخدام الصندوق الأسود) دون القلق بشأن تكرار التعليمات البرمجية. في الوقت نفسه، لأنه يحتوي على معلومات متعلقة بالوظيفة، فإن مسؤوليات الفصل محددة بوضوح (مسؤولية واحدة)، ولها تفاصيل كافية وتغليف جيد. يقوم TdataSetFieldsInfo بعزل مربع التحرير والسرد بشكل فعال عن البيانات المتغيرة، مما يؤدي في النهاية إلى تحسين درجة إعادة استخدام التعليمات البرمجية مع تقليل مسؤوليات فئة FORM وكمية الأرقام السحرية ذات الترميز الثابت. إليك التعليمات البرمجية الجديدة: قم أولاً بتعريف مرجع إلى فئة TdataSetFieldsInfo في النموذج. ...استدعاء عند إنشاء النموذج: FFieldsInfo := TDataSetFieldsInfo.Create;FFieldsInfo.GetDataSetFields(cdMaster);FFieldsInfo.ShowFieldsInfo(ComboBox1); في هذا الوقت، تصبح إعدادات عامل التصفية: if ComboBox1.Text <> '' ثمbeginClientDataSet.Filtered := خطأ؛ ClientDataSet.Filter := FFieldsInfo.GetFieldsNameByDisplayLabel(ComboBox1.Text) + '''' + Edit2.Text + ''''; ClientDataSet.Filtered := True;end; احصل على القسم الفرعي المقابل عن طريق استدعاء إجراء الواجهة لكائن FfieldsInfo اسم. هذه المقالة هي مثال بسيط على إعادة بناء التعليمات البرمجية، وأعتقد أن الفصل الذي قمت بتنفيذه أعلاه يمكن كتابته بعدة طرق ولديه خوارزميات أفضل. هذا فقط لتقديم فكرة حول إعادة بناء الكود من أجل تحسين جودة الكود الخاص بنا وقابلية صيانته وقابلية التوسع، وسوف نستكشف أفكارًا حول طريقة برمجة OOD.