Heim >Backend-Entwicklung >Golang >Unterstützt die Go-Sprache AOP nicht?

Unterstützt die Go-Sprache AOP nicht?

青灯夜游
青灯夜游Original
2022-12-27 17:04:524458Durchsuche

go-Sprache unterstützt aop. AOP bezieht sich auf aspektorientierte Programmierung, eine Technologie, die eine einheitliche Wartung von Programmfunktionen durch Vorkompilierung und dynamische Proxys während der Laufzeit erreicht. AOP ist ein objektorientierter Ansatz mit Hauptanwendungsszenarien: Protokollierung, Leistungsstatistik, Sicherheitskontrolle. Transaktionsverarbeitung, Ausnahmebehandlung usw.

Unterstützt die Go-Sprache AOP nicht?

Die Betriebsumgebung dieses Tutorials: Windows 7-System, GO Version 1.18, Dell G3-Computer.

Was ist AOP?

In der Softwareindustrie ist AOP die Abkürzung für Aspect Oriented Programming, was bedeutet: Aspektorientierte Programmierung, eine Technologie, die eine einheitliche Wartung von Programmfunktionen durch Vorkompilierung und dynamische Proxys zur Laufzeit erreicht. AOP ist die Fortsetzung von OOP, einem Hotspot in der Softwareentwicklung, einem wichtigen Inhalt im Spring-Framework und einem abgeleiteten Paradigma der funktionalen Programmierung. AOP kann verwendet werden, um verschiedene Teile der Geschäftslogik zu isolieren, wodurch die Kopplung zwischen den verschiedenen Teilen der Geschäftslogik verringert, die Wiederverwendbarkeit des Programms verbessert und die Effizienz der Entwicklung verbessert wird.

Aspektorientierte Programmierung ist nur eine Methode der objektorientierten Programmierung. Das dynamische Einbetten von anderem Code während der Codeausführung wird als aspektorientierte Programmierung bezeichnet. Häufige Verwendungsszenarien:

  • Protokolle

  • Dinge

  • Datenbankoperationen

Aspektorientierte Programmierung besteht darin, geschäftsübergreifende Logik in Aspekte zu kapseln und die Funktionen von AOP zu verwenden, um Aspekte in das Hauptgeschäft einzubinden logische Mitte. Die sogenannte Cross-Business-Logik bezieht sich auf allgemeinen Code, der nichts mit der Hauptgeschäftslogik zu tun hat, wie z. B. Sicherheitsüberprüfungen, Dinge, Protokolle usw. Wenn AOP nicht verwendet wird, kommt es zu einer Codeverschränkung, das heißt, die geschäftsübergreifende Logik wird mit der Hauptgeschäftslogik vermischt. Auf diese Weise wird die Geschäftslogik unübersichtlich.

Hauptanwendungsszenarien: Protokollierung, Leistungsstatistik, Sicherheitskontrolle, Transaktionsverarbeitung, Ausnahmebehandlung usw.

Kernkonzept

  • JoinPoint: Verbindungspunkt. Es handelt sich um einen genauen Ausführungspunkt bei der Programmausführung, beispielsweise um eine Methode in einer Klasse.

  • PointCut: Schnittpunkt. Geben Sie an, welche Komponenten und welche Methoden Aspektkomponenten verwenden.

  • Hinweis: Benachrichtigungen werden verwendet, um den Ort bestimmter Auswirkungen anzugeben, ob vor oder nach einer Methode usw., und werden in Vorbenachrichtigung, Nachbenachrichtigung, Ausnahmebenachrichtigung, Rückgabebenachrichtigung und Umgebungsbenachrichtigung unterteilt.

  • Aspekt: ​​Aspekt. Komponenten, die allgemeine Geschäftslogik kapseln, also den Codeinhalt, den wir einfügen möchten.

Das interne Entwurfsmuster ist das Proxy-Muster.

Unterstützt die Go-Sprache AOP?

go language unterstützt aop.

Beispiel für die Go-Implementierung von 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)

}

Verwenden Sie den AOP-Modus zur Entkopplung und Trennung von Hauptgeschäft und Nebengeschäft. Tatsächlich ist es das.

【Verwandte Empfehlungen: Go-Video-Tutorial, Programmierunterricht

Das obige ist der detaillierte Inhalt vonUnterstützt die Go-Sprache AOP nicht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn