Zusammenfassung - Studierendendatensätze
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy — Lektion 51 von 107.
Aufgabe
EinfachLassen Sie uns ein Studentenverwaltungssystem erstellen, das eine korrekte Kapselung demonstriert. Sie werden eine Struktur zur Studentenverwaltung erstellen, bei der sensible akademische Daten geschützt sind, während der Zugriff über gut gestaltete Methoden kontrolliert erfolgt.
Sie werden Ihren Code auf zwei Dateien aufteilen:
student.go: Erstellen Sie einStudent-Struct, das sensible Informationen schützt, während sichere öffentliche Daten offengelegt werden. DerNamedes Studenten sollte exportiert (öffentlich zugänglich) sein, aber seinegrade(float64) undstudentID(string) sollten nicht exportiert werden, um diese sensiblen Informationen zu schützen.Implementieren Sie Folgendes:
- Einen Konstruktor
NewStudent(name, id string, initialGrade float64) *Student, der einen Studenten erstellt. Die ursprüngliche Note sollte nur gesetzt werden, wenn sie zwischen 0 und 100 (einschließlich) liegt; andernfalls wird standardmäßig 0 verwendet. - Einen Getter
Grade() float64, der die aktuelle Note zurückgibt. - Einen Getter
StudentID() string, der die Studenten-ID zurückgibt. - Einen Setter
SetGrade(newGrade float64) bool, der die Note nur aktualisiert, wenn der neue Wert zwischen 0 und 100 (einschließlich) liegt. Geben Sietruezurück, wenn die Note aktualisiert wurde, andernfallsfalse. - Eine Methode
Summary() string, die das Format:[Name] (ID: [studentID]) - Grade: [grade]zurückgibt.
- Einen Konstruktor
main.go: Lesen Sie die Studenteninformationen aus der Eingabe ein, erstellen Sie einen Studenten mit dem Konstruktor und führen Sie dann Notenoperationen durch. Zeigen Sie die Zusammenfassung des Studenten nach der Erstellung und nach jedem Versuch einer Notenaktualisierung an.
Die folgenden Eingaben werden bereitgestellt:
- Zeile 1: Name des Studenten
- Zeile 2: Studenten-ID
- Zeile 3: Ursprüngliche Note
- Zeile 4: Erste neue Note, die gesetzt werden soll
- Zeile 5: Zweite neue Note, die gesetzt werden soll
Geben Sie nach der Erstellung des Studenten dessen Zusammenfassung aus. Versuchen Sie dann jede Notenaktualisierung – wenn sie erfolgreich ist, geben Sie die aktualisierte Zusammenfassung aus; wenn sie abgelehnt wird, geben Sie Invalid grade rejected aus. Formatieren Sie alle Notenwerte mit zwei Dezimalstellen.
Zum Beispiel, gegeben Emma Wilson, STU001, 85.5, 92.0 und 150, sollte Ihre Ausgabe wie folgt aussehen:
Emma Wilson (ID: STU001) - Grade: 85.50
Emma Wilson (ID: STU001) - Grade: 92.00
Invalid grade rejectedDie letzte Aktualisierung schlägt fehl, da 150 außerhalb des gültigen Bereichs liegt. Ihre Setter-Methode erzwingt diese Regel und hält die Daten des Studenten gültig. Beachten Sie, dass die studentID und grade niemals direkt zugänglich sind – externer Code muss Ihre Getter- und Setter-Methoden verwenden, um mit diesen geschützten Daten zu interagieren.
Probier es selbst
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Studentennamen lesen
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
// Studenten-ID lesen
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
// Anfangsnote lesen
initialGradeStr, _ := reader.ReadString('\n')
initialGrade, _ := strconv.ParseFloat(strings.TrimSpace(initialGradeStr), 64)
// Erste neue Note lesen
newGrade1Str, _ := reader.ReadString('\n')
newGrade1, _ := strconv.ParseFloat(strings.TrimSpace(newGrade1Str), 64)
// Zweite neue Note lesen
newGrade2Str, _ := reader.ReadString('\n')
newGrade2, _ := strconv.ParseFloat(strings.TrimSpace(newGrade2Str), 64)
// TODO: Erstelle einen neuen Studenten mit dem NewStudent-Konstruktor
// TODO: Gib die Zusammenfassung des Studenten nach der Erstellung aus
// TODO: Versuche die erste Notenaktualisierung
// Falls erfolgreich, gib die aktualisierte Zusammenfassung aus
// Falls abgelehnt, gib "Invalid grade rejected" aus
// TODO: Versuche die zweite Notenaktualisierung
// Falls erfolgreich, gib die aktualisierte Zusammenfassung aus
// Falls abgelehnt, gib "Invalid grade rejected" aus
// Hinweis: Verwende fmt.Sprintf mit %.2f für die Formatierung der Noten in Summary()
_ = newGrade1 // Entferne diese Zeile, wenn du die Variable verwendest
_ = newGrade2 // Entferne diese Zeile, wenn du die Variable verwendest
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der Go OOP
Externe DateienGo Workspace & ModulePackages & ImportsExportierte vs. nicht-exportierte NamenEinführung in OOP in GoStructs als KlassenMethoden für Structs definierenPointer- vs. Value-ReceiverStruct-InitialisierungKonstruktor-FunktionenZusammenfassung – Einfacher Taschenrechner4Interfaces
Einführung in InterfacesImplizite ImplementierungInterface als VertragLeeres Interface (any)Type AssertionType SwitchInterface-KompositionStringer & Error InterfacesRückblick - Formen-Rechner7Kapselung
Exportierte vs. nicht exportierte FelderKapselung auf Paket-EbeneGetter- & Setter-MethodenInformation Hiding in GoZusammenfassung - Studierendendatensätze10Generics (Go 1.18+)
Einführung in GenericsTypparameterType ConstraintsGenerische StructsWorkaround für generische MethodenZusammenfassung – Generische Collection2Vertiefung: Typen & Structs
Basis- & zusammengesetzte TypenBenutzerdefinierte TypdefinitionenStruct TagsAnonyme StructsVerschachtelte StructsZero Values & StandardwerteZusammenfassung - Kontaktbuch5Komposition statt Vererbung
Warum Go keine Vererbung hatGrundlagen des Struct EmbeddingMethod PromotionEinbetten mehrerer StructsEmbedding vs. AggregationShadowing eingebetteter MethodenZusammenfassung – Mitarbeiter-Hierarchie8Fehlerbehandlung & OOP
Das error-InterfaceEigene FehlertypenError Wrapping (fmt.Errorf)Sentinel-Fehlererrors.Is() und errors.As()Panic, Defer und RecoverZusammenfassung – Datei-Parser3Zeiger & Speicher
Zeiger-Grundlagen in GoZeiger auf StructsWertübergabe vs. ReferenzübergabeDie new() FunktionGarbage Collection in GoWiederholung – Linked List Builder6Polymorphismus in Go
Polymorphismus über InterfacesDuck Typing in GoInterface-ErfüllungsregelnPolymorphe CollectionsDependency InjectionZusammenfassung – Payment Processor9Nebenläufigkeit & OOP
Goroutines GrundlagenChannels & KommunikationGepufferte vs. ungepufferte ChannelsSelect-Anweisungsync.Mutex & sync.RWMutexsync.WaitGroupThread-sicheres Struct-DesignZusammenfassung - Worker Pool