Aufbau des Beispiels - inf-swe

Werbung
Aufbau des Beispiels
Arthur Zaczek
Feb 2015
Aufbau des Beispiels
1
1.1
Aufbau des Beispiels
Architektur - Java
Figure 1: Architektur Java
1
Aufbau des Beispiels
1.2
Architektur - CS
Figure 2: Architektur C#
1.3
Java vs. CS
• Java: JavaFX hat Controller
– Aktionen werden vom Controller verarbeitet
• C#: WPF nutzt nur ViewModelle
– Aktionen werden von Commands(ViewModels) verarbeitet
2
Aufbau des Beispiels
1.4
UML der Modelle
Figure 3: UML der Modelle
1.5
UML vs. Architektur
• Das UML Diagramm der Modelle beschreibt die Entitäten und wie sie zusammenhängen
• Die Architektur beschreibt, wie mit den Modellen gearbeitet
– Grafische Darstellung
– Persistieren
2
Beschreibung der Schichten
2.1
Modelle
Aufgaben:
• Halten die Daten der Geschäftsobjekte/Entitäten
• Führen evtl. Geschäftsregeln aus – zusätzlich zum Business Layer, je nach Ausprägung
– In unserem Beispiel werden alle Businessregeln im Business Layer implementiert.
• Halten den Status der Entitäten
– Neu, geändert, gelöscht
Nicht Zuständig für:
• GUI
• Datenzugriff
3
Aufbau des Beispiels
2.2
Übungsbeispiel
• Bild
– IPTC Informationen
– EXIF Informationen
• Fotograf_inn
– Name
– Geburtsdatum
– Notizen
2.3
Übungsbeispiel
public class PhotographerModel
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime? BirthDay { get; set; }
public string Notes { get; set; }
}
2.4
GUI
Aufgaben:
• Grafische Darstellung
• Events/Aktionen auslösen
Nicht Zuständig für:
• Geschäftsregeln ausführen
• Datenzugriff
Siehe JavaFX & WPF Beispiele
2.5
Presentation Model
Aufgaben:
•
•
•
•
Transformiert ein Model in eine “Anzeigbare” Form
Berücksichtigt die Gegebenheiten auf einer UI
Stellt weitere Eigenschaften & Methoden, die für die Anzeige benötigt werden zur Verfügung
Validierung
Nicht Zuständig für:
• Geschäftsregeln ausführen
4
Aufbau des Beispiels
• Datenzugriff
Siehe MVVM/Presentation Model Folien
2.6
View Model
Aufgaben:
•
•
•
•
•
Transformiert ein Model in eine “Anzeigbare” Form
Berücksichtigt die Gegebenheiten auf einer UI
Stellt weitere Eigenschaften & Methoden, die für die Anzeige benötigt werden zur Verfügung
Validierung
Bei CommandModels übernehmen Sie die Aufgabe eines Controllers
Nicht Zuständig für:
• Geschäftsregeln ausführen
• Datenzugriff
Siehe MVVM/Presentation Model Folien
2.7
Beispiel
public class PhotographerViewModel {
public int ID { get; private set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime? Birthday { get; set; }
public bool ShowBirthday { get { return Birthday.HasValue; } }
public int NumberOfPictures {
get {
if (obj != null) {
return obj.Pictures.Count;
}
return 0;
}
}
}
bool IsValid { get; }
string ValidationSummary { get; }
5
Aufbau des Beispiels
2.8
Controller
Aufgaben:
• Modelle in Presentation Modelle umwandeln
• Mit Business Layer kommunizieren
• Validierung anstoßen (vor eine BL Aktion)
Nicht Zuständig für:
• Geschäftsregeln ausführen
• Datenzugriff
2.9
Controller
@FXML
public void onSave() {
// Validieren
if(isValid()) {
// Model lt. Presentation Model aktualisieren
_photographerModel.update(_photographer);
}
}
2.10
// Dem BL zum Speichern übergeben
_bl.save(_photographer);
CommandViewModel
public class PhotographerViewModel
{
private ICommandViewModel _saveCommand;
public ICommandViewModel SaveCommand
{
get
{
if (_saveCommand == null)
{
_saveCommand = new SimpleCommandViewModel(
"Speichern",
"Speichert diesen Datensatz",
() =>
{
_bl.Save(_photographer);
},
() => IsValid);
}
return _saveCommand;
}
}
}
6
Aufbau des Beispiels
2.11
Business Layer
Aufgaben:
• Implementiert alle Abläufe -> Usecases
• Gewährleistet die Einhaltung von Geschäftsregeln
• Verbindung zum Data Access Layer
Nicht Zuständig für:
• Aufbereitung der Daten für die GUI
• Direkter Zugriff auf die Datenbank
2.12
Übungsbeispiel
public Collection<PictureModel> getPictures() throws Exception {
return _dal.getPictures(null, null, null, null);
}
public void save(PictureModel picture) throws Exception {
if (!isValid(picture))
throw new IllegalArgumentException("Picture is not in a valid state.");
_dal.save(picture);
}
public void sync() throws Exception {
File folder = new File(_picturePath);
File[] listOfFiles = folder.listFiles();
}
for (File f : listOfFiles) {
PictureModel p = new PictureModelImpl();
p.setFileName(f.getName());
_dal.save(p);
}
2.13
Data Access Layer
Aufgaben:
• Zugriff auf die Daten
–
–
–
–
Datenbank
XML
File
etc.
Nicht Zuständig für:
• Datenprüfung
• Validierung
• Geschäftsregeln ausführen
7
Aufbau des Beispiels
3
SQL Injection
3.1
Fehler im DAL
public class DALCustomer
{
public Customer GetCustomer(string account)
{
SqlCommand cmd = new SqlCommand(
"SELECT * FROM Customers WHERE Account = '" + account + "'",
db.Connection, db.Transaction);
using (SqlDataReader rd = cmd.ExecuteReader())
{
if (rd.Read())
{
Customer result = new Customer();
ReadCustomer(db, rd, result);
return result;
}
}
}
}
3.2
4
return null;
Kurze Demo
Von der GUI zur Datenbank und zurück
4.1
GUI
In der GUI wird ein Suchtext “Katze” eingegeben
private void onSearchChanged()
{
_bl.getPictures(_searchModel.getSearch(), null, null, null);
...
}
4.2
BL
• BL ruft DAL auf
• BL prüft aber auch, ob ich Berechtigt bin, schränkt auf nicht gelöschte Objekte ein, etc. . . ..
public Collection<PictureModel> getPictures(...) throws Exception {
// TODO: Add checks...
return _dal.getPictures(null, null, null, null);
}
8
Aufbau des Beispiels
Figure 4: SQL Injection mit C#
9
Aufbau des Beispiels
4.3
DAL
DAL spricht mit Datenbank - oder so wie hier mit einer Liste
private List<PictureModel> _pictures = new ArrayList<PictureModel>();
public Collection<PictureModel> getPictures(...) throws Exception {
// TODO: Apply filter
return _pictures;
}
4.4
21
4.5
BL
In diesem Fall werden die Angebote einfach weiter gereicht
public Collection<PictureModel> getPictures(...) throws Exception {
// TODO: Add checks...
return _dal.getPictures(null, null, null, null);
}
4.6
GUI
GUI läd die Objekte in die Liste
private void onSearchChanged()
{
Collection<PictureModel> result =
_bl.getPictures(_searchModel.getSearch(), null, null, null);
// Modelle in Presentation Modelle umwandlen
Collection<PicturePresentationModel> models =
result
.stream()
.map(i -> new PicturePresentationModelImpl(i))
.collect(Collectors.toList());
// Der Liste übergeben
lst.setItems(FXCollections.observableArrayList(models));
}
4.7
42
10
Herunterladen