Maison > Article > développement back-end > La langue Go ne prend-elle pas en charge AOP ?
go langage prend en charge aop. AOP fait référence à la programmation orientée aspect, qui est une technologie qui permet une maintenance unifiée des fonctions du programme grâce à la précompilation et aux proxys dynamiques pendant l'exécution ; AOP est une approche orientée objet, avec des scénarios d'application principaux : journalisation, statistiques de performances, contrôle de sécurité. traitement des transactions, gestion des exceptions, etc.
L'environnement d'exploitation de ce tutoriel : système Windows 7, GO version 1.18, ordinateur Dell G3.
Qu'est-ce que l'aop ?
Dans l'industrie du logiciel, AOP est l'abréviation de Aspect Oriented Programming, ce qui signifie : Programmation orientée aspect, une technologie qui permet une maintenance unifiée des fonctions du programme grâce à la précompilation et aux proxys dynamiques pendant l'exécution. AOP est la continuation de la POO, un point chaud du développement logiciel, un contenu important dans le framework Spring et un paradigme dérivé de la programmation fonctionnelle. AOP peut être utilisé pour isoler diverses parties de la logique métier, réduisant ainsi le couplage entre les différentes parties de la logique métier, améliorant la réutilisabilité du programme et améliorant l'efficacité du développement.
La programmation orientée aspect n'est qu'une méthode orientée objet. L'intégration dynamique d'autres codes pendant l'exécution du code est appelée programmation orientée aspect. Scénarios d'utilisation courants :
Logs
Things
Opérations de base de données
La programmation orientée aspects consiste à encapsuler la logique inter-métiers dans des aspects et à utiliser les fonctions d'AOP pour intégrer des aspects dans l'activité principale. milieu logique. La logique dite inter-métiers fait référence à un code général qui n'a rien à voir avec la logique métier principale, comme les contrôles de sécurité, les objets, les journaux, etc. Si AOP n'est pas utilisé, une intrication du code se produira, c'est-à-dire que la logique inter-métiers sera mélangée à la logique métier principale. De cette façon, la logique métier deviendra confuse.
Principaux scénarios d'application : journalisation, statistiques de performances, contrôle de sécurité, traitement des transactions, gestion des exceptions, etc.
Concept de base
JoinPoint : rejoindre le point. Il s'agit d'un point d'exécution précis dans l'exécution d'un programme, comme une méthode dans une classe.
PointCut : Point de coupe. Spécifiez quels composants et quelles méthodes utilisent des composants d'aspect.
Conseil : La notification, utilisée pour spécifier l'emplacement d'effets spécifiques, que ce soit avant ou après une méthode, etc., est divisée en pré-notification, post-notification, notification d'exception, notification de retour et notification surround.
Aspect : Aspect. Composants qui encapsulent la logique métier commune, c'est-à-dire le contenu du code que nous souhaitons insérer.
Le modèle de conception interne est le modèle proxy.
Le langage go prend-il en charge l'aop ?
go langage prend en charge aop.
Exemple d'implémentation Go de l'AOP :
// User type User struct { Name string Pass string } // Auth 验证 func (u *User) Auth() { // 实际业务逻辑 fmt.Printf("register user:%s, use pass:%s\n", u.Name, u.Pass) } // UserAdvice type UserAdvice interface { // Before 前置通知 Before(user *User) error // After 后置通知 After(user *User) } // ValidatePasswordAdvice 用户名验证 type ValidateNameAdvice struct { } // ValidatePasswordAdvice 密码验证 type ValidatePasswordAdvice struct { MinLength int MaxLength int } func (ValidateNameAdvice) Before(user *User) error { fmt.Println("ValidateNameAdvice before") if user.Name == "admin" { return errors.New("admin can't be used") } return nil } func (ValidateNameAdvice) After(user *User) { fmt.Println("ValidateNameAdvice after") fmt.Printf("username:%s validate sucess\n", user.Name) } // Before 前置校验 func (advice ValidatePasswordAdvice) Before(user *User) error { fmt.Println("ValidatePasswordAdvice before") if user.Pass == "123456" { return errors.New("pass isn't strong") } if len(user.Pass) > advice.MaxLength { return fmt.Errorf("len of pass must less than:%d", advice.MaxLength) } if len(user.Pass) < advice.MinLength { return fmt.Errorf("len of pass must greater than:%d", advice.MinLength) } return nil } func (ValidatePasswordAdvice) After(user *User) { fmt.Println("ValidatePasswordAdvice after") fmt.Printf("password:%s validate sucess\n", user.Pass) } // UserAdviceGroup,通知管理组 type UserAdviceGroup struct { items []UserAdvice } // Add 注入可选通知 func (g *UserAdviceGroup) Add(advice UserAdvice) { g.items = append(g.items, advice) } func (g *UserAdviceGroup) Before(user *User) error { for _, item := range g.items { if err := item.Before(user); err != nil { return err } } return nil } // After func (g *UserAdviceGroup) After(user *User) { for _, item := range g.items { item.After(user) } } // UserProxy 代理,也是切面 type UserProxy struct { user *User } // NewUser return UserProxy func NewUser(name, pass string) UserProxy { return UserProxy{user:&User{Name:name, Pass:pass}} } // Auth 校验,切入点 func (p UserProxy) Auth() { group := UserAdviceGroup{} group.Add(&ValidatePasswordAdvice{MaxLength:10, MinLength:6}) group.Add(&ValidateNameAdvice{}) // 前置通知 if err := group.Before(p.user); err != nil { panic(err) } // 实际逻辑 p.user.Auth() // 后置通知 group.After(p.user) }
Utilisez le mode AOP pour le découplage et la séparation de l'activité principale et de l'activité secondaire. En fait, c'est tout.
【Recommandations associées : Tutoriel vidéo Go, Enseignement de la programmation】
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!