Maison  >  Article  >  développement back-end  >  La langue Go ne prend-elle pas en charge AOP ?

La langue Go ne prend-elle pas en charge AOP ?

青灯夜游
青灯夜游original
2022-12-27 17:04:524418parcourir

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.

La langue Go ne prend-elle pas en charge AOP ?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn