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