3.2 FH Notify - fhtw-swp-tutorium/documentation GitHub Wiki
Sie werden im Zuge dieser Übung folgende Pattern implementieren:
- Decorator
- Composition
- Strategy
Es soll im Zuge dieser Übung ein vereinfachtes Benachrichtigung-System für die FH Technikum Wien entstehen. Durch eine Kommandozeilenapplikation können Personen über verschieden Kanäle Text-Nachrichten erhalten. Die Anwendung ist stateless, das bedeutet, sie wird mit gewissen Kommandozeilenparameters gestartet, führt die gewünschte Aktion aus und beendet sich anschließend wieder. Ähnlich zu git
, ls
oder ähnliche Tools.
1. Domain
Die Domaine besteht aus Nachrichten und Abonnenten. Nachrichten werden an einen oder mehrere Abonnenten verschickt. Um die Handhabung zu vereinfachen, können Alias definiert werden, welche entweder auf einen Abonnenten oder weitere Alias zeigen.
2. Konfiguration
Die Konfiguration beschreibt alle verfügbaren Abonnenten und alle gesetzten Alias. Beispiel für eine gültige Konfiguration:
{
"subscribers": [
"se15m001",
"if12b017"
],
"alias": [
{
"name": "latex-2015",
"for": [
"se15m001",
"if12b017"
]
},
{
"name": "bif1",
"for": [
"if12b017"
]
},
{
"name": "bif3",
"for": [ ]
},
{
"name": "bif5",
"for": [ ]
}
{
"name": "all-bif-students",
"for": [
"bif1",
"bif3",
"bif5"
]
},
]
}
Das Programm muss die Konfiguration beim Start validieren:
- Ein Alias darf nur auf definierte Abonnenten (
subscribers
) oder definierte Alias zeigen. Zeigt ein AliasA
auf einen zweiten AliasB
, so muss AliasB
vor AliasA
definiert sein. - Eine leere Konfiguration ist eine gültige Konfiguration.
Falls die Konfiguration nicht gültig ist, soll sich das Programm mit einer Fehlermeldung beenden.
3. Optionen & Parameter
Folgende Optionen sollen vom Programm akzeptiert werden:
-
--config
path
Spezifiziert einen relativen oder absoluten Pfad zu einer Konfigurationsdatei im oben beschriebenen Format. Der Parameter ist optional und hat den Defaultwert~/.fh-notify/config.json
.~
ist die Kurzschreibweise für das Verzeichnis des aktuellen Benutzers. -
--message
path
Spezifiziert den relativen oder absoluten Pfad zu der Textdatei, welche die Nachricht enthält, die gesendet werden soll. Eine solche Nachricht hat typischerweise keine Kopf- und Fußzeile, sondern besteht wirklich nur aus dem zu sendenden Text. Beispiel:$ cat C:\Users\Thomas\Desktop\sample-message Der Lift im A-Gebäude wird voraussichtlich ab nächsten Montag (14.12.2015) für 2 Wochen außer Betrieb sein.
-
--format
format-identifiers
Definiert eine Komma-separierte Liste mit Formatierern, welche auf die Nachricht angewendet werden sollen.
Die Reihenfolge, in der die Formatierer angegeben sind, ist zu respektieren. Das heißt, falls mehrere Formatierer angegeben sind, welche eine Signatur hinzufügen, muss die Signatur des letzten Formatierers auch wirklich am Ende der Nachricht stehen. -
--transport
transport-identifier
Definiert den zu verwendenden Transportweg. Siehe6. Transportwege
.
Alle zusätzlichen Parameter sind als Empfänger der Nachricht zu interpretieren. Das Programm soll sich mit einer Fehlermeldung beenden, falls ein angeführter Empfänger nicht in der Konfiguration definiert ist.
4. Formatieren der Nachricht
Das Programm soll vor dem Versenden die übergebene Nachricht iterativ formatieren, indem eine Anrede und eine Signatur hinzugefügt wird. Nachrichten können für verschiedene Anlässe und Zielgruppen gedacht sein, daher gibt es mehrere Möglichkeiten, wie diese Nachrichten formatiert werden können müssen:
-
casual-greeting
Dieser Formatierer fügt der Nachricht als Anrede einHallo XY,\n
hinzu. -
formal-greeting
Dieser Formatierer fügt der Nachricht als AnredeGuten Tag XY\n
hinzu. -
casual-signature
Dieser Formatierer fügt der Nachricht als Signatur\nViele Grüße,\ndie FH-Leitung
hinzu. -
promotion
Dieser Formatierer fügt der Nachricht als Signatur\nVersendet mit fh-notify.
hinzu. -
christmas
Dieser Formatierer fügt der Nachricht als Signatur\nFrohe Weihnachten wünscht,\ndie FH-Leitung
hinzu.
5. Versenden der Nachrichten
Das Versenden einer Nachricht soll simuliert werden, indem eine Datei mit dem Namen des Empfängers angelegt wird, welche die fertige Nachricht enthält.
Eine Nachricht soll an jeden Abonnenten immer nur einmal versendet werden.
Nachrichten können nur an echte Abonnenten verschickt werden, jedoch nicht an einen Alias. Ist der Empfänger einer Nachricht ein Alias, so wird die Nachricht in Wirklichkeit an die dahinterstehenden Abonnenten geschickt. Befindet sich unter diesen wieder ein oder mehrere Alias, müssen diese ebenfalls aufgelöst werden.
6. Transportwege
Ein Transportweg beschreibt, wie die Nachricht am Ende jedem einzelnen Abonnenten zugestellt wird. Das System soll die folgenden Kanäle unterstützen:
- Telegram
Da der Fokus der Übung nicht darauf liegt, alle diese Systeme anzubinden, sollen Nachricht je nach Transportweg in einen pro Transportweg definierten Ordner geschrieben werden:
Transportweg | Ordnername |
---|---|
Telegram | telegram |
Der Ordnername ist auch gleichzeitig der Identifier, mit dem ein Transportweg über die Option --transport
ausgewählt werden kann.
Daraus ergibt sich schlussendlich folgender Pfad zum Speichern der Benachrichtigungen: Transportweg/Abonnent
(z.B. whatsapp/se15m010
)
7. Patterns
- Verwenden Sie das Decorator-Pattern um die verschiedenen Formatierungsmöglichkeiten und Schritte abzubilden.
- Verwenden Sie das Composite-Pattern um die Alias abzubilden.
- Verwenden Sie das Strategy-Pattern um die verschiedenen Transportwege abzubilden.