أفضل الممارسات: إدارة الوظائف للبنيات المشابهة ذات الحقول المشتركة
في Go، من الشائع مواجهة بنيات متعددة ذات مجالات مماثلة، و هناك حاجة لإجراء عمليات مماثلة عليها. لتجنب تكرار التعليمات البرمجية مع الحفاظ على المرونة، ضع في الاعتبار الاستراتيجيات التالية:
إنشاء نوع مخصص للحقل المشترك:
إذا كان الحقل المشترك عبارة عن نوع بيانات بسيط ( على سبيل المثال، سلسلة)، فكر في تحديد نوع مخصص لها. يتيح لك هذا إرفاق طرق بالنوع المخصص، والتي يمكن بعد ذلك استخدامها بواسطة أي بنية تتضمن هذا النوع.
type Version string
func (v Version) PrintVersion() {
fmt.Println("Version is", v)
}
ثم قم بتضمين نوع الإصدار في البنيات:
type Game struct {
Name string
MultiplayerSupport bool
Genre string
Version
}
type ERP struct {
Name string
MRPSupport bool
SupportedDatabases []string
Version
}
يسمح لك هذا بطباعة الإصدار باستخدام طريقة PrintVersion في حقل الإصدار:
g.PrintVersion()
e.PrintVersion()
استخدام الانعكاس:
إذا كان من الممكن أن يكون الحقل المشترك أنواعًا مختلفة أو إذا كنت تريد المزيد من المرونة، فيمكنك استخدام الانعكاس لاستدعاء الحقل المناسب ديناميكيًا طريقة. يعد هذا الأسلوب أكثر تعقيدًا وله بعض الآثار المترتبة على الأداء، ولكنه يوفر قدرًا أكبر من المرونة.
type Printer interface {
PrintVersion() error
}
func PrintVersion(p Printer) error {
t := reflect.TypeOf(p)
method, ok := t.MethodByName("PrintVersion")
if !ok {
return fmt.Errorf("object doesn't have a PrintVersion method")
}
return method.Func.Call([]reflect.Value{reflect.ValueOf(p)})[0].Interface().(error)
}
يمكنك بعد ذلك استخدام وظيفة PrintVersion لاستدعاء طريقة PrintVersion على أي كائن يقوم بتنفيذ واجهة الطابعة:
var game Game
var erp ERP
PrintVersion(game)
PrintVersion(erp)
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3