B.2: Controller Überblick
Contents
B.2: Controller Überblick#
Der Controller übernimmt die Programmsteuerung und Interaktion mit dem/der Nutzer:in. Er empfängt Eingaben von dem/der Benutzer:in (heute ist dies häufig an spezielle Views gekoppelt) und verwendet diese Eingaben, um das Modell zu aktualisieren. Dient häufig so als Schnittstelle zwischen dem Modell und der Ansicht.
In der zweiten Teilaufgabe soll der Controller Teil angepasst werden.
Grundlegende Struktur#
// control_chatbot.h
#ifndef CONTROL_CHATBOT_H
#define CONTROL_CHATBOT_H
#include "model_ngram_chatbot.h"
#include <string>
/*
* The Controller class can operate on the model class
* Therefore, it requires access = needs a reference.
*/
class ChatBotController {
private:
ChatBotModel& model; // Reference to the chatbot model
public:
// Constructor accepts a reference to an existing model
ChatBotController(ChatBotModel& modelRef);
// TODO:
// Run the chatbot interaction loop
// You have to refactor the loop from main into this part of the program.
// Currently, the controller is not handling much else - it should take input from the user
// and should
// - either generate a single next word
// - or a full sentence when a new start word is given
void run();
};
#endif // CONTROL_CHATBOT_H
// control_chatbot.cpp
#include "control_chatbot.h"
#include <iostream>
// Constructor implementation (standard, gets access to the model)
ChatBotController::ChatBotController(ChatBotModel& modelRef) : model(modelRef) {}
// Controller is running in a loop
void ChatBotController::run() {
std::string input;
std::cout << "Welcome to the n-gram Chat Bot. Type a word to start a sentence, or 'exit' to quit." << std::endl;
std::string completion;
while (true) {
// TODO:
// Implement interaction with user
// Control has to take input from the user
// - and as we haven't introduced a view up until now,
// it also directly provides feedback on the terminal
// TODOs:
// - get input from user, e.g. getline
// - get from model either a complete sentence or only next word
// - exit when called with "exit" = break;
...
break; // Exits the loop and potentially the program
...
}
}
Anweisungen
Anweisungen:
Refaktorisieren Sie die Interaktionsschleife aus der main-Funktion in die
run
Methode incontrol_chatbot
.Implementieren sie in der Controller-Klasse eine Unterscheidung, um basierend auf Benutzereingaben entweder ein einzelnes Wort oder einen ganzen Satz zu generieren.
Geben sie dabei Anweisungen des Controllers an das Modell weiter (einfacher Funktionsaufruf im Modell): im
src
Verzeichnis definiert incontroller_chatbot.cpp
und die entsprechenden Funktionen finden sie in den Modell-Dateien.
Ergebnis, Fragen#
Der Controller greift auf das Modell zu, stößt dort die Generierung neuer Wörter an. Aktuell übernimmt er auch noch die Anzeige dieser aus und gibt dies einfach im Terminal aus.
Die Einführung eines expliziten Controller erlaubt aber deutlich mehr Flexibilität und Austauschbarkeit, z.B. wenn verschiedene Instanzen oder unterschiedliche Controller Zugriff auf das Modell haben.
Wie könnte ein anders gearteter Controller aussehen, der nicht einfach die Tastatur zur Eingabe nutzt?