منطق القاربين المتكررة في دلفي
-
19-09-2019 - |
سؤال
لكل مرض من الفصل، يجب أن أقوم بتطبيق بعض منطق الأحداث (onchanging، onchanged):
procedure TBlock.SetWeightIn(const Value: Double);
var OldValue: Double;
begin
OldValue := FWeightIn;
DoOnChanging(OldValue, Value);
FWeightIn := Value;
DoOnChanged(OldValue, Value);
end;
procedure TBlock.SetWeightOut(const Value: Double);
var OldValue: Double;
begin
OldValue := FWeightOut;
DoOnChanging(OldValue, Value);
FWeightOut := Value;
DoOnChanged(OldValue, Value);
end;
هل يمكن أن تقترح طريقة لتنفيذ هذا دون تكرار كل هذه الخطوط لكل مجموعة؟
المحلول
جرب هذا:
procedure TBlock.SetField(var Field: Double; const Value: Double);
var
OldValue: Double;
begin
OldValue := Field;
DoOnChanging(OldValue, Value);
Field := Value;
DoOnChanged(OldValue, Value);
end;
procedure TBlock.SetWeightIn(const Value: Double);
begin
SetField(FWeightIn, Value);
end;
procedure TBlock.SetWeightOut(const Value: Double);
begin
SetField(FWeightOut, Value);
end;
نصائح أخرى
الدعم دلفي خصائص مفهرسة. وبعد يمكن أن تشارك خصائص متعددة في الحصول على Getter أو STERTER واحد، وتمييزها بواسطة مؤشر ترتيبي:
type
TWeightType = (wtIn, wtOut);
TBlock = class
private
procedure SetWeight(Index: TWeightType; const Value: Double);
function GetWeight(Index: TWeightType): Double;
public
property InWeight: Double index wtIn read GetWeight write SetWeight;
property OutWeight: Double index wtOut read GetWeight write SetWeight;
end;
يمكنك الجمع بين هذا مع إجابة كوبوس للحصول على هذا:
procedure TBlock.SetWeight(Index: TWeightType; const Value: Double);
begin
case Index of
wtIn: SetField(FWeightIn, Value);
wtOut: SetField(FWeightOut, Value);
end;
end;
قد يوفر لك ذلك أفكارا بطرق أخرى يمكنك الرجوع إلى الحقول الخاصة بك بواسطة الفهرس بدلا من وجود حقولين منفصلين تماما لهذه القيم ذات الصلة.
يمكنك إضافة طريقة إضافية. شيء مثل:
procedure TBlock.setValue(const Value : Double; Location : PDouble);
var
OldValue : Double;
begin
OldValue:=Location^;
DoOnChanging(OldValue,Value);
Location^:=Value;
DOnChanged(OldValue, Value);
end;
procedure TBlock.setWeightOut(const Value : Double);
begin
setValue(value, @FWeightOut);
end;
أنا لم تجميع / اختبار الكود على الرغم من. تتمثل الفكرة في الحصول على طريقة STERTER عامة تعمل مع مؤشر إلى الموقع. الإصدارات المتخصصة فقط استدعاء طريقة Gerneral مع إعداد عنوان المتغير. يجب أن يكون لديك نوع واحد من طريقة Setter العامة لكل نوع من المتغير (مزدوج، عدد صحيح، ...) على الرغم من ذلك. يمكنك تعديلها للعمل على المؤشر وطول متغير للعمل مع جميع الأنواع - قرارك إذا كان الأمر يستحق كل هذا العناء.
إذا كانت معلمات الإجراءات / الوظيفة هي نفسها ورمز بين البدء والنهاية هي نفسها، فيمكنك استخدامها فقط
procedure SetWeightValue(const Value: Double);
var OldValue: Double;
begin
OldValue := FWeightIn;
DoOnChanging(OldValue, Value);
FWeightIn := Value;
DoOnChanged(OldValue, Value);
end;
هذا هو...