Das Programmieren von Software nach Ebenen ist eine Architektur, in der der Code oder die Logik, die Geschäftsaufgaben (Fakturierung, Verkauf) erledigt, von der grafischen Präsentationslogik und den Daten getrennt werden soll. Kennen Sie ihn auch als Modell MCV (Ansicht, Controller, Modell).
Der Vorteil dieses Stils liegt in der einfachen Wiederverwendung und Wartung der Entwicklung , da im Falle einer Änderung nur die erforderliche Ebene geändert wird, ohne dass der gesamte Code überprüft werden muss.
Logische Präsentationsschicht
Es bezieht sich darauf, wie die Programminformationen dem Benutzer präsentiert werden. Das Ziel ist es, alle diejenigen zu trennen, die dem Benutzer angezeigt werden, diese Ebene hat keine Verbindung zur Datenbank oder führt Vorgänge jeglicher Art aus, zeigt nur Daten auf dem Bildschirm an, die von der Präsentationsebene über Funktionen angefordert werden, die in der Logikebene ausgeführt werden des Geschäfts.
Geschäftslogik-Schicht
Hier werden die Funktionsklassen und Funktionen oder Prozeduren über die grafische Oberfläche aufgerufen.
Empfangen Sie Anforderungen oder Ereignisse vom Benutzer, verarbeiten Sie diese Anforderungen und senden Sie die Antwort an die grafische Oberfläche. Falls erforderlich, kommuniziert diese Schicht mit der Datenschicht, aber die Geschäftsschicht stellt keine Verbindung zur Datenbank her, sondern empfängt nur Daten oder verarbeiten sie. Hier führen Sie Regeln oder Geschäftsfunktionen aus und rufen sie auf, z. B. Rechnung, Produktliste usw.
Datenschicht
Hier haben wir Klassen und Funktionen, die eine Verbindung zur Datenbank herstellen und bei denen Transaktionen mit SQL ausgeführt werden, um Informationen in der Datenbank zu lesen, einzufügen, zu ändern oder zu löschen.
Hier werden SQL-Abfragen ausgeführt, damit keine der anderen Ebenen weiß, wo sich die Datenbank befindet. Die Präsentationsebene könnte sich also auf einem PC befinden, und die anderen Ebenen auf einem Server als Service waren Saas-Software.
Zum Beispiel erstellen wir eine Java-Anwendung mit drei Ebenen:
Struktur des Projekts Autos Agency
Wir werden Netbeans als Beispiel verwenden, aber jede andere Programmiersprache für Java kann angewendet werden. Wir haben das Projekt mit Netbeans als Java-Anwendung namens JAutos erstellt
Klicken Sie auf das Bild, um es zu vergrößern
Dann die Java-Pakete, die die Präsentations- oder Anwendungsschicht, die Datenschicht und die Geschäftsschicht bilden. Obwohl wir hier von drei Ebenen sprechen, können wir auch andere Ebenen von Diensten und Ressourcen für andere Klassen, Konfigurationen usw. erstellen.
Klicken Sie auf das Bild, um es zu vergrößern
Wir haben also die drei Ebenen und die Jautos.java-Datei erstellt, die die Hauptmethode enthält, die der Ausgangspunkt jedes Java-Programms ist.
Der Standardstart der Anwendung ist der folgende Code.
Paket Jautos;
public class JAutos { / ** Hauptmethode starten * / public static void main (String [] args) { // TODO Code Anwendungslogik hier } }
Wir werden nun beginnen, die Features Schicht für Schicht zu programmieren . Der Zweck der Anwendung besteht darin, eine Liste von Fahrzeugen zu verwalten, in die Sie Daten von Fahrzeugen einfügen und diese lesen und anschließend in einer Tabelle vom Typ Jtable anzeigen können. Dazu fügen wir eine weitere Ebene hinzu, die die Daten der Klasse “Fahrzeuge” in einer anderen Ressourcenebene kapselt, erstellen eine vierte Ebene mit dem Namen “CapaRecursos” und in der Klasse “Fahrzeuge” den folgenden Code.
Paketschichtressourcen; public class Vehiculos { Private String-Marke; privates String-Modell; Private String Farbe; public void SetMarca (String-Marke) { this.brand = brand; } public String GetMarca () { Geben Sie diese Marke zurück. } { this.brand = brand; } public void SetModel (String-Modell) { this.modelo = model; } public String GetModel () { return this.modelo; } public void SetColor (String-Farbe) { this.color = color; } public String GetColor () { return this.color; } } }
Wir definieren die Steuern der Klasse, die der Marke, dem Modell und der Farbe des Fahrzeugs entsprechen. Wenn Sie möchten, können wir weitere Steuern hinzufügen. Mit diesen wenigen Steuern ist es jedoch einfacher, den Code zu verstehen. Wir werden jetzt das Bildschirmdesign in der Anwendungsebene erstellen. Dort können wir einen Jframe mit der rechten Maustaste einfügen. Wir geben ihm den Namen von frmAutos.
Klicken Sie auf das Bild, um es zu vergrößern
Jetzt werden wir die notwendigen Steuerelemente für unsere Anwendung hinzufügen:
Klicken Sie auf das Bild, um es zu vergrößern
Der Code lautet wie folgt:
Paket Capapplication; Importieren Sie CapaRecursos.Vehicles / ** * * @author student * / public class frmAutos erweitert javax.swing.JFrame { / ** * Erstellt ein neues Formular frmAutos * / public frmAutos () { initComponents (); } / ** * Diese Methode wird vom Konstruktor aus aufgerufen, um das Formular zu initialisieren. * WARNUNG: Ändern Sie diesen Code NICHT. Der Inhalt dieser Methode ist immer * Vom Formulareditor neu generiert. * / @SuppressWarnings ("deaktiviert") // <editor-fold defaultstate = "collapsed" desc = "Generierter Code"> private void initComponents () { jLabel1 = new javax.swing.JLabel (); jScrollPane1 = new javax.swing.JScrollPane (); jTable1 = new javax.swing.JTable (); txtMarca = new javax.swing.JTextField (); txtModel = new javax.swing.JTextField (); jLabel2 = new javax.swing.JLabel (); jLabel3 = new javax.swing.JLabel (); txtColor = new javax.swing.JTextField (); btRegistrar = new javax.swing.JButton (); btLeer = new javax.swing.JButton (); setDefaultCloseOperation (javax.swing.WindowConstants.EXIT_ON_CLOSE); jLabel1.setText ("Brand"); jTable1.setModel (neues javax.swing.table.DefaultTableModel ( neues Objekt [] [] { {null, null, null, null}, {null, null, null, null}, {null, null, null, null}, {null, null, null, null} }, neuer String [] { "Titel 1", "Titel 2", "Titel 3", "Titel 4" } )); jScrollPane1.setViewportView (jTable1); txtMarca.setName ("Marke"); // NOI18N txtModelo.setToolTipText (""); txtModelo.setName ("model"); // NOI18N txtModelo.addActionListener (neuer java.awt.event.ActionListener () { public void actionPerformed (java.awt.event.ActionEvent evt) { txtModeloActionPerformed (evt); } }); jLabel2.setText ("Model"); jLabel3.setText ("Color"); txtColor.setToolTipText (""); btRegistrar.setText ("Registrar"); btRegistrar.setActionCommand ("btRegistrar"); btRegistrar.setName ("btRegistrar"); // NOI18N btRegistrar.addActionListener (neuer java.awt.event.ActionListener () { public void actionPerformed (java.awt.event.ActionEvent evt) { btRegistrarActionPerformed (evt); } }); btLeer.setText ("Read"); btLeer.setToolTipText (""); btLeer.setName ("btLeer"); // NOI18N javax.swing.GroupLayout layout = new javax.swing.GroupLayout (getContentPane ()); getContentPane (). setLayout (layout); layout.setHorizontalGroup ( layout.createParallelGroup (javax.swing.GroupLayout.Alignment.LEADING) .addGroup (layout.createSequentialGroup () .addContainerGap () .addGroup (layout.createParallelGroup (javax.swing.GroupLayout.Alignment.LEADING) .addComponent (jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup (layout.createSequentialGroup () .addGroup (layout.createParallelGroup (javax.swing.GroupLayout.Alignment.LEADING) .addComponent (jLabel1) .addComponent (jLabel2) .addComponent (jLabel3)) .addPreferredGap (javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup (layout.createParallelGroup (javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent (txtModel) .addComponent (txtMarca) .addComponent (txtColor, javax.swing.GroupLayout.DEFAULT_SIZE, 196, Short.MAX_VALUE)) .addGap (18, 18, 18) .addGroup (layout.createParallelGroup (javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent (btRegistrar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent (btLeer, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) .addContainerGap (javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); layout.setVerticalGroup ( layout.createParallelGroup (javax.swing.GroupLayout.Alignment.LEADING) .addGroup (layout.createSequentialGroup () .addContainerGap () .addGroup (layout.createParallelGroup (javax.swing.GroupLayout.Alignment.LEADING) .addGroup (layout.createParallelGroup (javax.swing.GroupLayout.Alignment.BASELINE) .addComponent (jLabel1) .addComponent (txtMarca, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent (btRegistrar)) .addGroup (layout.createParallelGroup (javax.swing.GroupLayout.Alignment.LEADING) .addGroup (layout.createSequentialGroup () .addPreferredGap (javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup (layout.createParallelGroup (javax.swing.GroupLayout.Alignment.BASELINE) .addComponent (jLabel2) .addComponent (txtModel, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap (javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup (layout.createParallelGroup (javax.swing.GroupLayout.Alignment.BASELINE) .addComponent (jLabel3) .addComponent (txtColor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup (layout.createSequentialGroup () .addGap (15, 15, 15) .addComponent (btLeer))) .addGap (26, 26, 26) .addComponent (jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 181, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap (32, Short.MAX_VALUE)) ); pack (); } // </ editor-fold> private void txtModeloActionPerformed (java.awt.event.ActionEvent evt) { // TODO füge hier deinen Bearbeitungscode hinzu: } private void btRegistrarActionPerformed (java.awt.event.ActionEvent evt) { } / ** * @param gibt die Befehlszeilenargumente an * / public static void main (String args []) { / * Festlegen des Nimbus-Erscheinungsbilds * / // <editor-fold defaultstate = "collapsed" desc = "Code zum Festlegen des Erscheinungsbilds (optional)"> / * Wenn Nimbus (eingeführt in Java SE 6) nicht verfügbar ist, behalten Sie das standardmäßige Erscheinungsbild bei. * Weitere Informationen finden Sie unter http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html * / versuche { für (javax.swing.UIManager.LookAndFeelInfo info: javax.swing.UIManager.getInstalledLookAndFeels ()) { if ("Nimbus" .equals (info.getName ())) { javax.swing.UIManager.setLookAndFeel (info.getClassName ()); brechen; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger (frmAutos.class.getName ()) .log (java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger (frmAutos.class.getName ()) .log (java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger (frmAutos.class.getName ()) .log (java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger (frmAutos.class.getName ()) .log (java.util.logging.Level.SEVERE, null, ex); } // </ editor-fold> / * Erstellen und Anzeigen des Formulars * / java.awt.EventQueue.invokeLater (new Runnable () { public void run () { new frmAutos (). setVisible (true); } }); } // Variablendeklaration - nicht ändern private javax.swing.JButton btLeer; private javax.swing.JButton btRegistrar; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTable jTable1; private javax.swing.JTextField txtColor; private javax.swing.JTextField txtMarca; private javax.swing.JTextField txtModel; // Ende der Variablendeklaration }
Wir importieren die Ebene und ihre Klasse frmAutos und geben dann im Wesentlichen an, dass die Variable frmVehicles eine Instanz der Form oder des Bildschirms frmAutos ist und daher beim Ausführen der Anwendung eingeblendet und angezeigt wird.
Klicken Sie auf das Bild, um es zu vergrößern
Wir sehen, wie die Anwendung aussieht, wenn sie zum ersten Mal mit den Steuerelementen ausgeführt wird und die Anwendungsebene oder Präsentation aufruft
Jetzt müssen wir die anderen Ebenen erstellen.
In der Datenschicht erstellen wir die Datei DBAutos.java. In diesem Fall können wir Verbindungen zu Datenbanken und SQL-Abfragen herstellen, um unabhängige Tests für jede Datenbank durchzuführen. Wir verwenden eine Matrix, die dann in jeder Datenbank aufgezeichnet oder exportiert werden kann in eine XML-Datei oder was auch immer wir wollen. Wir müssen auf Daten zugreifen, deshalb importieren wir die in der Ressourcenschicht erstellten Variablen mit dem Code.
Import CapaRecursos.Vehicles;
Wir müssen andere Komponenten importieren, um die Tabelle zu verarbeiten:
Paket Data Layer; Import CapaRecursos.Vehicles; import java.util.ArrayList; import java.util.List; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; / ** * * @author student * / public class DBAutos { public static DefaultTableModel Registrar (Fahrzeuge Fahrzeug, JTable Jtable1) { DefaultTableModel modelTableTable = (DefaultTableModel) Jtable1.getModel (); Object [] dataRegistration = { vehiculo.GetMarca (), vehicle.GetModel (), vehicle.GetColor () }; modelData.addRow (dataRegistro); Rückgabemodell von DataTable; } öffentliche statische Liste <Fahrzeuge> Alles lesen (JTable lsVehicles) { List <Vehicles> listVehicle = new ArrayList <> (); für (int i = 0; i <lsVehicles.getRowCount (); i ++) { Fahrzeuge Fahrzeug = Neufahrzeuge (); vehiculo.SetMarca (lsVehicles.getValueAt (i, 0) .toString ()); vehiculo.SetModel (lsVehicles.getValueAt (i, 1) .toString ()); vehiculo.SetColor (lsVehicles.getValueAt (i, 2) .toString ()); listVehicle.add (Fahrzeug); } return listVehicle; } }
Wir erstellen die Register-Methode , um ein Fahrzeug zu registrieren und definieren, welche die Standardstruktur der Tabelle ist. Wir haben auch die Methode zum Lesen der Datensätze erstellt, die wir in die Matrix eingeben.
Wir müssen jetzt die Business-Schicht implementieren. Zu diesem Zweck erstellen wir im Business-Layer- Paket die Business-File-Datei , die die Klasse des Business-Layers darstellt und über die Funktionen verfügt, die zwischen der Präsentations- oder Anwendungsschicht und der Datenschicht liegen.
Der Code der Business-Schicht lautet wie folgt:
CapaNegocio-Paket; DataDate.Dbautos importieren; Import CapaRecursos.Vehicles; import java.util.ArrayList; import java.util.List; import javax.swing.JOptionPane; import javax.swing.JTable; / ** * * @author student * / public class negocioautos { public void Registrar (Fahrzeuge Fahrzeug, JTable Jtable1) { versuchen Sie es { Jtable1.setModel (DBAutos.Registrar (vehiculo, Jtable1)); } fangen (Ausnahme ex) { } } public List <Fahrzeuge> Read (JTable-Tabelle) { List <Vehicles> listaAutos = new ArrayList <> (); versuchen Sie es { listaAutos = DBAutos.LeerTodo (Tabelle); } fangen (Ausnahme ex) { } endlich { return listAutos; } } }
Es bleibt für alle Funktionen übrig, auf dem Präsentationsbildschirm zwei Schaltflächen zu platzieren, eine zum Einfügen von Daten und eine zum Lesen von Daten. Dies sind die beiden Funktionen, die wir in der Business-Schicht haben, die die Datenschicht abfragt.
Bevor Sie die Schaltflächen platzieren, müssen Sie sicherstellen, dass Sie die Ressourcen- und Geschäftsschicht importiert haben. Wenn dies nicht der Fall ist, importieren wir zusätzlich zu den Komponenten zur Verwaltung der Datenmatrix, die in diesem Fall die Funktion der Datenbank erfüllt, in die Präsentations- oder Anwendungsschicht. zuvor hinzugefügt.
Import CapaRecursos.Vehicles; importieren Sie CapaNegocio.negocioautos; import java.util.ArrayList; import java.util.List; import javax.swing.JTable; import javax.swing.table.DefaultTableModel;
In der Schaltfläche Registrieren in der ausgeführten Aktion schreiben wir den folgenden Code:
private void btRegistrarActionPerformed (java.awt.event.ActionEvent evt) { Auto Vehicles = new Vehicles (); auto.SetMarca (txtMarca.getText ()); auto.SetModel (txtModelo.getText ()); auto.SetColor (txtColor.getText ()); new business auto (). Register (auto, jTable1); }
Das Ergebnis bei der Ausführung ist das Folgende:
Klicken Sie auf das Bild, um es zu vergrößern
Durch Drücken der Schaltfläche Registrieren auf dem Bildschirm mit der Fahrzeugliste wird die Methode new business auto () aufgerufen. Register (auto, jTable1); der Business-Schicht und es werden die in der Auto-Matrix gefundenen Daten und die Tabelle, in der die eingefügten Daten angezeigt werden, als Parameter gesendet.
Wir werden eine weitere Tabelle hinzufügen, um die Daten der ersten Tabelle mithilfe der Schaltfläche “Lesen” zu klonen. Dazu fügen wir unten eine Jtable hinzu und lassen sie ohne Konfiguration ihrer Eigenschaften, da wir sie aus dem Code ändern werden. Wenn wir untersuchen möchten, wie die Standardparameter einer Tabelle geändert werden sollen, können wir sie durch Klicken mit der rechten Maustaste auf die Tabelle anzeigen. Anschließend können wir im Menü der Option Eigenschaften verschiedene Optionen ändern, z. B. die Titel der Spalten, Spalten oder Zeilen hinzufügen oder entfernen. Implementieren Sie beim Starten der Anwendung unterschiedliche Verhaltensweisen.
Klicken Sie auf das Bild, um es zu vergrößern
Wir werden im Code sehen, wie die Namen der Spalten geändert und die Tabelle geleert werden, damit sie die Daten aus der Haupttabelle übernimmt, in die die Daten eingegeben werden. Dann schreiben wir in der Aktion, die über die Schaltfläche “Lesen” ausgeführt wird, den folgenden Code, um die Daten lesen und vollständig in einer anderen Tabelle ablegen zu können, um den Vorgang zu demonstrieren und wie wir eine Tabelle mit den Daten klonen können, die wir in eine andere Tabelle einfügen oder sogar verwenden, um sie in den Feldern anzuzeigen von Text oder speichern Sie es in einer Sicherungsdatei oder vergleichen Sie Daten mit Leichtigkeit.
private void btLeerActionPerformed (java.awt.event.ActionEvent evt) { // TODO füge hier deinen Bearbeitungscode hinzu: List <Vehicles> listVehicle = new businesscars (). Read (jTable1); DefaultTableModel Table = new DefaultTableModel (); Tabla.addColumn ("Marca"); Tabla.addColumn ("Modelo"); Tabla.addColumn ("color"); für (Fahrzeuge Fahrzeug: listVehicle) { Objekt [] recordLeido = { vehiculo.GetMarca (), vehicle.GetModel (), vehicle.GetColor () }; Tabla.addRow (readRecord); } jTable2.setModel (Tabelle); }
Mal sehen, wie die Funktionalität mit der Schaltfläche Lesen und der zweiten Tabelle ergänzt wird.
Klicken Sie auf das Bild, um es zu vergrößern
Nachdem Sie die Tabelle durch Klicken auf die Schaltfläche “Lesen” geladen haben, wird sie in eine zweite Tabelle geklont, wenn Sie der ersten Tabelle weitere Daten hinzufügen und dann auf “Lesen” klicken. Die erste Tabelle wird in die zweite Tabelle geklont. Auf diese Weise können Sie sehen, wie die verschiedenen Funktionen der Anwendung in Ebenen unterteilt wurden.
Layered Programming ist eine Methode, mit der Sie völlig frei arbeiten können. Es ist keine starre Technik, die strukturiert implementiert werden muss. Softwareentwickler und sogar Webprojekte haben mehrere Möglichkeiten, sie entsprechend ihren Anforderungen zu implementieren. Da viele in Ebenen entwickelte Codebibliotheken wiederverwendet werden können, können Sie eine Ebene in einem anderen Projekt implementieren. Die Tendenz, das Programmiermodell in N-Schichten in großen Projekten mit mehreren Entwicklerteams zu verwenden, und wenn es sich hauptsächlich um Geschäftsanwendungen handelt, wo
Es muss eine große Anzahl von Subsystemen und Modulen behandelt werden.
Einige Nachteile dieses Programmiermodells bestehen darin, dass bei seiner Implementierung ein Gleichgewicht zwischen der Anzahl von Schichten, Ressourcen, Subsystemen oder Subschichten, Klassen und ihren Wechselbeziehungen hergestellt werden muss. Wir müssen eine vielschichtige Entwicklung sehr gut dokumentieren und sie muss leicht verständlich genug sein, um einen bestimmten Auftrag effizient auszuführen und so modular und unabhängig wie möglich zu sein, damit eine Änderung nicht das gesamte System betrifft.
Zu den Nachteilen zählt die Analyse des Effizienzverlusts, wenn Sie redundante Arbeiten ausführen oder mehrere Ebenen programmieren, die dasselbe tun, aber unterschiedliche Daten oder konstante Verbindungen zur Datenbank aufweisen, ohne dass dies zusätzlich zu falschen SQL-Abfragen zu einer Verlangsamung der Anwendung führt optimiert, dass die Software sehr langsam machen kann.
Man muss auch vermeiden, in den Fehler zu geraten, große Abhängigkeiten zwischen den Objekten, Methoden, Eigenschaften und Attributen jeder Klasse und jeder Schicht zu erzeugen, was dem Ziel der Programmierung in 3 oder N Schichten widerspricht.
Einige aktuelle Technologien, die Layered Programming unterstützen. Derzeit verwenden die meisten Programme .Java, PHP und Net.
Die Datenschicht wird durch Tools wie Data Set und Data Reader implementiert. Sehr ähnlich zu C # in .net
Das andere in Java weit verbreitete Tool ist Hibernate, mit dem Datenbanken mit in Java erstellten Objekten abgebildet werden, ähnlich wie im Beispiel mit der Klasse vehicles, mit dem Unterschied, dass die Zuordnung manuell erstellt wurde.