|
Letzte
Bearbeitung dieses Dokuments: |
Voraussetzungen für das Verständnis dieses Dokuments:Grundkenntnisse in
der Programmierung von Java (Klassen, Methoden,
Schleifen). |
Ungefährer Zeitbedarf zum Durcharbeiten dieses Dokuments:Arbeitszeit:
|
Dieses Dokument enthält Code-Muster für eine einfache Generelle Klasse eines BO (Business-Object) und Erweiterungen, die entsprechend den jeweiligen Anforderungen zusätzlich implementiert werden können.
Einfacher
Muster-Code für ein BO
Muster-Code
für ein BO bei Verwendung der Datenbank-Tabelle 'Parameter'
Anleitung
zur Adaptierung
* Änderung
des Namens der Java-Packages der Anwendung
* Adaptieren
des Kommentars
* Änderung
des Namens der Klasse
* Parameter-Name
bei Verwendung von Parameter_DBA
festlegen
* Definitionen
der Variablen des BO
* Definitionen
der Konstanten für Status-Codes
* Variable
in den Methoden copyFromapplication_entity_BO(..)
und isDifferent(...) adaptieren
* Methode
getDBAAttributes(...) adaptieren
Spezieller
Muster-Code
* Objekte
als Variable dieses BO definieren
* Objekte
als Variable dieses BO kopieren
* Objekte
als Variable dieses BO auf Unterschiede prüfen
* Prüfen
auf Konsistenz der Werte dieses BO
Weitere Schritte und verwandte Dokumentation
Tutorial für die Programmierung eines Heavyweight-Clients (Fat-Client) durchgearbeitet.
Datenmodell fertig ausgearbeitet.
Zugehörige DataBase-Access- (DBA-) Klasse(n) fertiggestellt; siehe Muster-Code für ein DBA (DataBase-Access Objekt).
Welche Platzhalter
durch Bezeichnungen des eigentlichen Projektes zu ersetzen sind
finden Sie im Abschnitt
Anleitung
zur Adaptierung.
package
application_package
.bo;
/*
*
Klasse für die Serialization eines Objekts dieser Klasse.
*
Serialization ist notwendig um ein BO vom Java Application Server
(JAS)
* zum Client zu übertragen.
*/
import
java.io.Serializable;
/*
*
Klassen für den Vergleich von Arrays.
* Diese Klasse ist
notwendig wenn Arrays elementarer Typen (z.B. byte[])
*
verglichen werden müssen.
*/
import
java.util.Arrays;
/*
*
Package mit der Basisklasse für ein Business Objekt. */import
js_base.bo.JSBS_BO;
/*
Package mit der Klasse für das DBA- (DataBase-Access-) Objekt.
*/
import
application_package
.dba.*;
/**
*
* @author
name[at]company
* @date
20xx-xx-xx
*
* @description
* Generelle
Klasse für ein Business-Object (BO) für einen xxx.
* Ein
xxx ist ein . . . .
* Variablen dieses BO und
deren Beschreibung finden Sie gleich
* unterhalb
der Klassen-Definition.
*
* Anwender-bekannte-Identifikation:
* VariableName
,
VariableName
*
* Weitere
Variablen, deren Werte-Kombination einmalig sein muss:
* VariableName
,
VariableName
*
* @change-log
* when who why
* -----------------------------------------------------------------
*
*/public
class
application_entity
_BO
extends
JSBS_BO
implements
Serializable
{
/*
* VARIABLE dieses
Business-Object.
* --------------------- *//*
* Beschreibung der Variable ... . */
public
String
VariableName
=
""
;
/*
* KONSTANTEN für die nicht erwarteten Stati
beim
Ausführen einer Methode
* dieses Business-Object. Diese
Stati gelten nur für dieses BO.
*
* In den
Basisklassen werden die Werte 0 bis 10
verwendet.
* ---------------------
*/
/* Beschreibung
der Konstante ... . */
public
static final int
CONST_
Error_Reason
=
40;
/*
* Eine besondere Bedeutung haben 'Fehler' die das
'Deaktivieren' des BO verhindern.
* Diese Stati gelten nur
für dieses BO.
* ---------------------
*/
/* Beschreibung
warum das BO nicht deaktiviert werden kann . */
public
static final int
CONST_DEAKTIVATE_INHIBIT_REASON_
Reason
=
60;
/*
* METHODEN *//* ---------------------
* METHODE zum Kopieren der Attribute eines anderen
Objekts dieser Klasse. */
public
void
copyFrom
application_entity
_BO(
application_entity
_BO
parm
application_entity
_BO)
{
/*
* Prüfen ob als Parameter ein 'null'-Wert übergeben
wurde und
* behandeln dieses Fehlers.
*/
if
(parm
application_entity
_BO
==
null
)
{
StatusCode
=
CONST_DB_UNKNOWN_ERROR
;
StatusMsg
=
"CopyFrom-Method
found 'null' as parameter."
;
return
;
}/*
* Aufruf der Methode der Superklasse um die 'Common
Attributes', den Status-Code
* und die (eventuelle)
Fehler-Meldung zu kopieren.
*/
super
.copyFromJSBS_BO(parm
application_entity
_BO);
/*
* Spezifische
Werte für dieses BO übertragen. */
this
.
VariableName
=
parm
application_entity
_BO.
VariableName
;
}/* ---------------------
* METHODE zum Vergleichen der Werte der speziellen
Variablen
* zweier Business-Object dieser
Klasse.
* Die Methode liefert 'true' zurück wenn
mindestens die Werte einer Variablen
* verschieden
sind. */
public
boolean
isDifferent(
application_entity
_BO
parm
application_entity
_BO)
{
/*
*
Wenn der Parameter 'null' ist dann 'true' (verschieden) zurück
liefern. */
if
(parm
application_entity
_BO
==
null
)
return
true
;
/*
* Werte
der spezifischen Variablen dieser BO-Klasse vergleichen.
*//*
* Vergleich
zweier Werte eines elementaren Typs. */
if
(
this
.
VariableName
!=
parm
application_entity
_BO.
VariableName
)
return
true
;
/*
* Vergleich
zweier Werte der Klasse 'String';
* dieser Vergleich
kann auch für andere Variable, die durch eine Klasse repräsentiert
werden,
* verwendet werden. *//* Zuerst
prüfen, ob eine der beiden Variablen 'null' ist. */
if
((
this
.
VariableName
==
null
)
|| (parm
application_entity
_BO.
VariableName
==
null
))
{
/* Prüfen,
ob beide Variablen 'null' sind; dann ist der Vergleich 'erfüllt'.
*/
if
((
this
.
VariableName
==
null
)
&& (parm
application_entity
_BO.
VariableName
==
null
))
{
/* Beide
Variablen sind 'null' - damit ist der Vergleich 'erfüllt'.
*/
}
else
{
/* Logischerweise
kann nur eine der beiden Variablen 'null' sein;
* damit
gelten die beiden Variablen als 'verschieden. */
return
true
;
}
}
else
{
/* Keine
der beiden Variablen ist 'null';
* damit können die
Werte der Variablen verglichen werden. */
if
(
this
.
VariableName
.compareTo(
parmapplication_entity
_BO.
VariableName
)
!= 0)
return
true
;
}/*
* Vergleich
zweier Werte die als Array von elementaren Typen repräsentiert
werden.
* In diesem Beispiel wird byte[] verwendet –
'byte' kann auch durch einen anderen
* elementaren Typ
ersetzt werden. *//* Zuerst
prüfen, ob eine der beiden Variablen 'null' ist. */
if
((
this
.
VariableName
==
null
)
|| (parm
application_entity
_BO.
VariableName
==
null
))
{
/* Prüfen,
ob beide Variablen 'null' sind; dann ist der Vergleich 'erfüllt'.
*/
if
((
this
.
VariableName
==
null
)
&& (parm
application_entity
_BO.
VariableName
==
null
))
{
/* Beide
Variablen sind 'null' - damit ist der Vergleich 'erfüllt'.
*/
}
else
{
/* Logischerweise
kann nur eine der beiden Variablen 'null' sein;
* damit
gelten die beiden Variablen als 'verschieden. */
return
true
;
}
}
else
{
/* Keine
der beiden Variablen ist 'null';
* damit können die
Werte der Variablen verglichen werden. */
if
(!
Arrays.equals(
this
.
VariableName
,
parm
application_entity
_BO.
VariableName
))
return
true
;
}/*
* Für
den Vergleich der Werte spezieller Klassen (z.B. BigDecimal) sind
unter Umständen
* Angaben der Rundungs-Genauigkeit
notwendig. *//* Zuerst
prüfen, ob eine der beiden Variablen 'null' ist. */
if
((
this
.
VariableName
==
null
)
|| (parm
application_entity
_BO.
VariableName
==
null
))
{
/* Prüfen,
ob beide Variablen 'null' sind; dann ist der Vergleich 'erfüllt'.
*/
if
((
this
.
VariableName
==
null
)
&& (parm
application_entity
_BO.
VariableName
==
null
))
{
/* Beide
Variablen sind 'null' - damit ist der Vergleich 'erfüllt'.
*/
}
else
{
/* Logischerweise
kann nur eine der beiden Variablen 'null' sein;
* damit
gelten die beiden Variablen als 'verschieden. */
return
true
;
}
}
else
{
/* Keine
der beiden Variablen ist 'null';
* damit können die
Werte der Variablen verglichen werden. */
if
(
this
.
VariableName
.compareTo(parm
application_entity
_BO.
VariableName
)
!= 0)
return
true
;
}/*
* Alle
Variablen haben gleiche Werte – BO sind nicht verschieden.
*/
return
false
;
}/* ---------------------
* METHODE zum Übertragen der Werte der Variablen des
zugehörigen DBA-Objekts. */
public
void
getDBAAttributes(
application_dbtable
_DBA
parm
application_dbtable
_DBA)
{
/*
* Aufruf der Methode der Superklasse um die 'Common
Attributes'
* und die (eventuelle) Fehler-Meldung zu
kopieren.
*/
super
.getCommonDBAAttributes(parm
application_dbtable
_DBA);
/*
* Spezifische
Werte für dieses BO übertragen. */
this
.
VariableName
=
parm
application_dbtable
_DBA.
VariableName
;
}
/* ---------------------
* METHODE zum Prüfen auf Konsistenz der Daten dieses
BO.
*
*
Diese Methode ist dazu gedacht, eine Prüfung auf Korrektheit der
Werte dieses BO durchzuführen
*
bevor die Daten gespeichert werden.
*
Eine Prüfung der Konsistenz der Daten ist dann erforderlich
* *
wenn nicht sicher gestellt werden kann, dass bei der Eingabe der
Daten die Prüfungen durchgeführt werden
* oder
* *
wenn die Prüfungen so komplex sind, dass sie bei der Eingabe nicht
vollständig durchgeführt werden können.
*
*
Wenn die Prüfregeln nicht erfüllt werden, kann als genereller
Status-Code die Konstante
*
CONST_INCONSISTENT_DATA (aus der Basisklasse JSBS_BO)
verwendet
werden oder es können in dieser Klasse
*
detailliertere Konstante für den Status-Code definiert werden.
*
*
Für Prüf-Algorithmen, die Werte anderer Business-Objects erfordern
(und damit auf die Datenbank)
*
zugreifen müssen) kann diese Methode in der Klasse für das
Server-Seitige BO (BOS)
*
überschrieben werden. */
public boolean
isConsistentData()
{
/*
* Anschließend ist der Algorithmus. */
/*
*
Wenn in dieser Methode keine Prüfungen durchgeführt werden, werden
die Daten
*
als 'konsistent' betrachtet. */
return
true
;
}
}
Die Datenbank-Tabelle Parameter ist dafür vorgesehen, BO abzuspeichern für deren Klasse keine größeren Mengen erwartet werden.
Typisch dafür sind
Einstellungen für das Anwendungsprogramm oder Werte für Kategorien
(z.B. die Branche von Kunden).
Im JavaScout
Base-System (JSBS) ist eine DataBase-Access
(DBA) Klasse implementiert, die Zugriffe auf diese Tabelle
('Parameter') implementiert hat.
Der folgende Muster-Code ist für ein BO, das für die Datenspeicherung die Tabelle 'Parameter' verwendet.
Welche Platzhalter
durch Bezeichnungen des eigentlichen Projektes zu ersetzen sind
finden Sie im Abschnitt
Anleitung
zur Adaptierung .
package
application_package
.bo;
/*
*
Klasse für die Serialization eines Objekts dieser Klasse.
*
Serialization ist notwendig um ein BO vom Java Application Server
(JAS)
* zum Client zu übertragen.
*/
import
java.io.Serializable;
/*
*
Klassen für den Vergleich von Arrays.
* Diese Klasse ist
notwendig wenn Arrays elementarer Typen (z.B. byte[])
*
verglichen werden müssen.
*/
import
java.util.Arrays;
/*
*
Package mit der Basisklasse für ein Business Objekt. */import
js_base.bo.JSBS_BO;
/*
Package mit der Klasse für das DBA- (DataBase-Access-) Objekt für
den
* Zugriff auf die DB-Tabelle 'Parameter'. */import
js_base.dba.*;
/**
*
* @author
name[at]company
* @date
20xx-xx-xx
*
* @description
* Generelle
Klasse für ein Business-Object (BO) für einen xxx.
* Ein
xxx ist ein . . . .
* Variablen dieses BO und
deren Beschreibung finden Sie gleich
* unterhalb
der Klassen-Definition.
*
* Anwender-bekannte-Identifikation:
* VariableName
,
VariableName
*
* Weitere
Variablen, deren Werte-Kombination einmalig sein muss:
* VariableName
,
VariableName
*
* @change-log
* when who why
* -----------------------------------------------------------------
*
*/public
class
application_entity
_BO
extends
JSBS_BO
implements
Serializable
{
/*
* PARAMETER_IDENTIFIKATION unter dem Business-Objects
dieser Klasse auf der
* DB-Tabelle 'Parameter'
abgespeichert sind.
* ---------------------
*/
public
static final
String
CONST_PARAMETER_NAME
=
"
ParameterName
"
;
/*
* VARIABLE dieses
Business-Object.
* ---------------------
*//* Beschreibung
der Variable ... . */
public
String
VariableName
;
/*
* KONSTANTEN für die nicht erwarteten Stati
beim
Ausführen einer Methode
* dieses Business-Object. Diese
Stati gelten nur für dieses BO.
*
* In den
Basisklassen werden die Werte 0 bis 10
verwendet.
* ---------------------
*/
/* Beschreibung
der Konstante ... . */
public
static final int
CONST_
Error_Reason
=
40;
/*
* Eine besondere Bedeutung haben 'Fehler' die das
'Deaktivieren' des BO verhindern.
* Diese Stati gelten nur
für dieses BO.
* ---------------------
*/
/* Beschreibung
warum das BO nicht deaktiviert werden kann . */
public
static final int
CONST_DEAKTIVATE_INHIBIT_REASON_
Reason
=
60;
/*
* METHODEN *//* ---------------------
* METHODE zum Kopieren der Attribute eines anderen
Objekts dieser Klasse. */
public
void
copyFrom
application_entity
_BO(
application_entity
_BO
parm
application_entity
_BO)
{
/*
* Prüfen ob als Parameter ein 'null'-Wert übergeben
wurde und
* behandeln dieses Fehlers.
*/
if
(parm
application_entity
_BO
==
null
)
{
StatusCode
=
CONST_DB_UNKNOWN_ERROR
;
StatusMsg
=
"CopyFrom-Method
found 'null' as parameter."
;
return
;
}/*
* Aufruf der Methode der Superklasse um die 'Common
Attributes', den Status-Code
* und die (eventuelle)
Fehler-Meldung zu kopieren.
*/
super
.copyFromJSBS_BO(parm
application_entity
_BO);
/*
* Spezifische
Werte für dieses BO übertragen. */
this
.
VariableName
=
parm
application_entity
_BO.
VariableName
;
}/* ---------------------
* METHODE zum Vergleichen der Werte der speziellen
Variablen
* zweier Business-Object dieser
Klasse.
* Die Methode liefert 'true' zurück wenn
mindestens die Werte einer Variablen
* verschieden
sind. */
public
boolean
isDifferent(
application_entity
_BO
parm
application_entity
_BO)
{
/*
*
Wenn der Parameter 'null' ist dann 'true' (verschieden) zurück
liefern. */
if
(parm
application_entity
_BO
==
null
)
return
true
;
/*
/*
* Vergleich
zweier Werte eines elementaren Typs. */
if
(
this
.
VariableName
!=
parm
application_entity
_BO.
VariableName
)
return
true
;
/*
* Vergleich
zweier Werte der Klasse 'String';
* dieser Vergleich
kann auch für andere Variable, die durch eine Klasse repräsentiert
werden,
* verwendet werden. *//* Zuerst
prüfen, ob eine der beiden Variablen 'null' ist. */
if
((
this
.
VariableName
==
null
)
|| (parm
application_entity
_BO.
VariableName
==
null
))
{
/* Prüfen,
ob beide Variablen 'null' sind; dann ist der Vergleich 'erfüllt'.
*/
if
((
this
.
VariableName
==
null
)
&& (parm
application_entity
_BO.
VariableName
==
null
))
{
/* Beide
Variablen sind 'null' - damit ist der Vergleich 'erfüllt'.
*/
}
else
{
/* Logischerweise
kann nur eine der beiden Variablen 'null' sein;
* damit
gelten die beiden Variablen als 'verschieden. */
return
true
;
}
}
else
{
/* Keine
der beiden Variablen ist 'null';
* damit können die
Werte der Variablen verglichen werden. */
if
(
this
.
VariableName
.compareTo(
parmapplication_entity
_BO.
VariableName
)
!= 0)
return
true
;
}/*
* Vergleich
zweier Werte die als Array von elementaren Typen repräsentiert
werden.
* In diesem Beispiel wird byte[] verwendet –
'byte' kann auch durch einen anderen
* elementaren Typ
ersetzt werden. *//* Zuerst
prüfen, ob eine der beiden Variablen 'null' ist. */
if
((
this
.
VariableName
==
null
)
|| (parm
application_entity
_BO.
VariableName
==
null
))
{
/* Prüfen,
ob beide Variablen 'null' sind; dann ist der Vergleich 'erfüllt'.
*/
if
((
this
.
VariableName
==
null
)
&& (parm
application_entity
_BO.
VariableName
==
null
))
{
/* Beide
Variablen sind 'null' - damit ist der Vergleich 'erfüllt'.
*/
}
else
{
/* Logischerweise
kann nur eine der beiden Variablen 'null' sein;
* damit
gelten die beiden Variablen als 'verschieden. */
return
true
;
}
}
else
{
/* Keine
der beiden Variablen ist 'null';
* damit können die
Werte der Variablen verglichen werden. */
if
(!
Arrays.equals(
this
.
VariableName
,
parm
application_entity
_BO.
VariableName
))
return
true
;
}/*
* Für
den Vergleich der Werte spezieller Klassen (z.B. BigDecimal) sind
unter Umständen
* Angaben der Rundungs-Genauigkeit
notwendig. *//* Zuerst
prüfen, ob eine der beiden Variablen 'null' ist. */
if
((
this
.
VariableName
==
null
)
|| (parm
application_entity
_BO.
VariableName
==
null
))
{
/* Prüfen,
ob beide Variablen 'null' sind; dann ist der Vergleich 'erfüllt'.
*/
if
((
this
.
VariableName
==
null
)
&& (parm
application_entity
_BO.
VariableName
==
null
))
{
/* Beide
Variablen sind 'null' - damit ist der Vergleich 'erfüllt'.
*/
}
else
{
/* Logischerweise
kann nur eine der beiden Variablen 'null' sein;
* damit
gelten die beiden Variablen als 'verschieden. */
return
true
;
}
}
else
{
/* Keine
der beiden Variablen ist 'null';
* damit können die
Werte der Variablen verglichen werden. */
if
(
this
.
VariableName
.compareTo(parm
application_entity
_BO.
VariableName
)
!= 0)
return
true
;
}/*
* Alle
Variablen haben gleiche Werte – BO sind nicht verschieden.
*/
return
false
;
}/* ---------------------
* METHODE zum Übertragen der Werte der Variablen des
zugehörigen DBA-Objekts (Parameter). */
public
void
getDBAAttributes(JSBS_Parameter_DBA
parmParameter_DBA)
{
/*
* Aufruf der Methode der Superklasse um die 'Common
Attributes'
* und die (eventuelle) Fehler-Meldung zu
kopieren.
*/
super
.getCommonDBAAttributes(parmParameter_DBA);
/*
* Spezifische
Werte für dieses BO übertragen. *//*
* Übertragen
der Werte bei einem 'String'. */
this
.
VariableName
=
parmParameter_DBA.
Value
XX
;
/*
* Für
numerische Werte muss der 'String' aus dem Attribut der
'Parameter'-Tabelle
* wieder 'umgewandelt'
werden.
* Zuerst das Umwandeln in ein
'BigDecimal'.
* Das erfolgt innerhalb einer
'try/catch'-Logik um fehlerhafte Werte in dem 'String'
* behandeln
zu können. */
try
{
this
.
VariableName
=
new
BigDecimal(parmParameter_DBA.
Value
XX
.trim());
}
/* Wenn
der 'String'-Wert keinen numerischen Wert enthält dann wird der
'catch'-Zweig
* ausgeführt. */
catch
(Exception
Exc) {
/* In
diesem Beispiel wird der Variable der Wert '0' zugewiesen.
* Abhängig von der Anforderung kann hier auch eine
andere Verarbeitung codiert werden. */
this
.
VariableName
=
new
BigDecimal(0);
}
/*
* In
den folgenden Beispielen ist die 'try/catch'-Logik in weniger Zeilen
untergebracht.
* Ein Beispiel für (die Klasse)
'Integer'; ähnlich auch für 'Short' und 'BigInteger'. */
try
{
this
.
VariableName
=
new
Integer(parmParameter_DBA.
Value
XX
.trim());}
catch
{(Exception
Exc) {
this
.
VariableName
=
new
Integer(0);}
/*
* Für
Variable elementarer Typen muss bei der Umwandlung zuerst die
adäquate Klasse
* verwendet werden.
* Ein
Beispiel für (den elementaten Typ) 'int'; ähnlich auch für 'short'
und 'long'. */
try
{
this
.
VariableName
=
new
(Integer(parmParameter_DBA.
Value
XX
.trim()))intValue();}
catch
{(Exception
Exc) {
this
.
VariableName
=
0;}
try
{
this
.
VariableName
=
new
(Short(parmParameter_DBA.
Value
XX
.trim()))shortValue();}
catch
{(Exception
Exc) {
this
.
VariableName
=
0;}
try
{
this
.
VariableName
=
new
(BigInteger(parmParameter_DBA.
Value
XX
.trim()))longValue();}
catch
{(Exception
Exc) {
this
.
VariableName
=
0;}
}
/* ---------------------
* METHODE zum Prüfen auf Konsistenz der Daten dieses
BO.
*
*
Diese Methode ist dazu gedacht, eine Prüfung auf Korrektheit der
Werte dieses BO durchzuführen
*
bevor die Daten gespeichert werden.
*
Eine Prüfung der Konsistenz der Daten ist dann erforderlich wenn
nicht sicher gestellt werden kann,
*
dass bei der Eingabe der Daten die Prüfungen durchgeführt werden
oder wenn die Prüfungen so komplex
*
sind, dass sie bei der Eingabe nicht vollständig durchgeführt
werden können.
*
*
Wenn die Prüfregeln nicht erüllt werden kann als genereller
Status-Code die Konstante
*
CONST_INCONSISTENT_DATA (aus der Basisklasse JSBS_BO)
verwendet
werden oder es können in dieser Klasse
*
detailliertere Konstante für den Status-Code definiert werden.
*
*
Für Prüf-Algorithmen, die Werte anderer Business-Objects erfordern
(und damit auf die Datenbank
*
zugreifen müssen) kann diese Methode in der Klasse für das
Server-Seitige BO (BOS)
*
überschrieben werden. */
public boolean
isConsistentData()
{
/*
* Anschließend ist der Algorithmus. */
/*
*
Wenn in dieser Methode keine Prüfungen durchgeführt werden, werden
die Daten
*
als 'konsistent' betrachtet. */
return
true
;
}
}
Anleitung
zur Adaptierung
Am leichtesten
funktioniert die Anpassung des Muster-Codes an die eigenen
Erfordernisse durch Kopieren des Muster-Codes und Verwendung von
Edit
> Find/Replace...
.
|
|
Für
'Platzhalter', die nur einmalig im Muster-Code vorkommen ist die
'Find'-Funktion ist hilfreich zum Finden der beschriebenen
'Platzhalter'.
Änderung
des Namens der Java-Packages der Anwendung
package
application_package
.bo;
.
. . . .
. . . . ./*
*
Package mit der Basisklasse für ein Business Objekt. */import
js_base.bo.JSBS_BO;
/*
Package mit der Klasse für das DBA- (DataBase-Access-) Objekt.
*/
import
application_package
.dba.*;
/**
D
er
Name dieses Packages kommt in der ersten Zeile des Muster-Codes
vor.
Ein zeitsparendes Vorgehen ist, beim Kopieren des
Muster-Codes diese Zeile nicht zu überschreiben und dann die Zeile
des Muster-Codes mit dem Platzhalter für den Namen des Java-Packages
zu löschen.
Wenn
den Namenskonventionen gefolgt wurden, dann ist auch der Name des
Packages mit den DBA-Klassen im ersten Teil gleich.
Ansonsten ist
der Name des Java-Packages mit der (oder den – bei mehreren)
zugeordneten DBA-Klasse(n) anzugeben.
Adaptieren
des Kommentars
'Kein Kommentar
ist besser als ein falscher'
.
Aus
diesem Grund ist im Muster-Code auch keine Hintergrund-Information
über Entwurfs-Entscheidungen für das BO vorhanden.
Meiner
Erfahrung nach ist hilfreich, im Kommentar zu sehen, welche Variable
jenen Schlüssel bilden, mit denen der Anwender ein Business-Object
eindeutig identifizieren kann.
Änderung
des Namens der Klasse
*/
public
class
application_entity
_BO
extends
JSBS_BO
implements
Serializable
{
/*
Dieser
Name muss mit dem Namen der Klasse übereinstimmen, der beim Eröffnen
der Klasse gewählt wurde.
Der
Name der Klasse kommt mehrmals im gesamten Code vor.
Deswegen
empfehle ich, mit 'Find/Replace' alle Platzhalter
application_entity
_BO
im
Muster-Code durch den gewählten Klassen-Namen zu ersetzen.
Parameter-Name
bei Verwendung von
Parameter_DBA
festlegen
Diese
Änderung ist nur notwendig, wenn der
Muster-Code
für ein BO bei Verwendung der Datenbank-Tabelle 'Parameter'
als
Vorlage verwendet wurde.
public
class
application_entity
_BO
extends
JSBS_BO
{
/*
* PARAMETER_IDENTIFIKATION unter dem Business-Objecte
dieser Klasse auf der
* DB-Tabelle 'Parameter'
abgespeichert sind.
* ---------------------
*/
protected
static final
String
CONST_PARAMETER_NAME
=
"
ParameterName
"
;
/*
* VARIABLE dieses Business-Object.
Dieser
Name darf von keiner anderen BO-Klasse verwendet werden.
Der
Name der Klasse kommt nur einmal im gesamten Code vor – gleich nach
der Definition des Namens der Klasse.
Deswegen empfehle ich, mit
'Find/Replace' alle Platzhalter application_entity
_BO
im
Muster-Code durch den gewählten Klassen-Namen zu ersetzen.
Definitionen
der Variablen des BO
/*
* VARIABLE dieses
Business-Object.
* --------------------- *//*
*
Beschreibung der Variable ... . */
public
String
VariableName
;
/*
In
diesem Teil werden die Geschäfts-spezifischen Variablen des BO
definiert.
Im Muster-Code ist nur eine einfache Klasse (String
)
enthalten – es ist aber auch möglich, eigene Klassen mit komplexen
Strukturen als Variable zu definieren.
Beispiele dazu finden Sie
im Abschnitt Objekte
als Variable dieses BO
.
Definitionen
der Konstanten für Status-Codes
/*
* KONSTANTEN für die nicht erwarteten Status
beim
Ausführen einer Methode
* dieses Business-Object. Diese
Stati gelten nur für dieses BO.
* ---------------------
*/
/* Beschreibung
der Konstante ... . */
public
static final int
CONST_
Error_Reason
;
/*
* Eine besondere Bedeutung haben 'Fehler' die das
'Deaktivieren' des BO verhindern.
* Diese Stati gelten nur
für dieses BO.
* ---------------------
*/
/* Beschreibung
warum das BO nicht deaktiviert werden kann . */
public
static final int
CONST_DEAKTIVATE_INHIBIT_REASON_
Reason
;
/*
In
diesem Teil werden Status-Codes, die nicht allgemein - und damit
in
der geerbten Basisklasse JSBS_BO -
definiert sind, definiert.
Die Definition der Status-Codes
ist individuell von der Funktionalität des BO abhängig und des
wegen wird auf eine generelle Anleitung verzichtet.
Status-Codes
für das Verhindern der Deaktivierung des BO (
public
static final int
CONST_DEAKTIVATE_INHIBIT_REASON_
Reason
;
)
werden vermutlich erst mit der Analyse und Implementierung anderer BO
notwendig werden wenn das neue BO durch eine Fremdschlüssel-Relation
zu einer oder mehreren Variablen dieses BO abhängig ist.
Das
'Deaktivieren' des BO ist in der Methode deaktivate(...) der
zugehörigen Server-Side-Klasse des BO implementiert.
Mehr
Information finden Sie im Dokument Muster-Code
für ein BOS (Server-Side-Klasse eines Business-Object)
.
Variable
in den Methoden copyFrom
application_entity
_BO(...)
und isDifferent(...) adaptieren
/*
* METHODEN *//* ---------------------
* METHODE
zum Kopieren der Attribute eines anderen Objekts dieser Klasse.
*/
public
void
copyFrom
application_entity
_BO(
application_entity
_BO
parm
application_entity
_BO)
{
/*
* Aufruf der Methode der Superklasse um die 'Common
Attributes', den Status-Code
* und die (eventuelle)
Fehler-Meldung zu kopieren.
*/
super
.
getJSBS_BO(parm
application_entity
_BO);
/*
* Spezifische
Werte für dieses BO übertragen. */
this
.
VariableName
=
parm
application_entity
_BO.
VariableName
;
}/* ---------------------
* METHODE zum Vergleichen der Werte der speziellen
Variablen
* zweier Business-Object dieser
Klasse.
* Die Methode liefert 'true' zurück wenn
mindestens die Werte einer Variablen
* verschieden
sind. */
public
boolean
isDifferent(
application_entity
_BO
parm
application_entity
_BO)
{
/*
*
Wenn der Parameter 'null' ist dann 'true' (verschieden) zurück
liefern. */
if
(arm
application_entity
_BO_Set
==
null
)
return
true
;
/*
* Werte
der spezifischen Variablen dieser BO-Klasse vergleichen.
*//*
* Vergleich
zweier Werte eines elementaren Typs. */
if
(
this
.
VariableName
!=
parm
application_entity
_BO.
VariableName
)
return
true
;
/*
* Vergleich
zweier Werte der Klasse 'String';
* dieser Vergleich
kann auch für andere Variable, die durch eine Klasse repräsentiert
werden,
* verwendet werden. *//* Zuerst
prüfen, ob eine der beiden Variablen 'null' ist. */
if
((
this
.
VariableName
==
null
)
|| (parm
application_entity
_BO.
VariableName
==
null
))
{
/* Prüfen,
ob beide Variablen 'null' sind; dann ist der Vergleich 'erfüllt'.
*/
if
((
this
.
VariableName
==
null
)
&& (parm
application_entity
_BO.
VariableName
==
null
))
{
/* Beide
Variablen sind 'null' - damit ist der Vergleich 'erfüllt'.
*/
}
else
{
/* Logischerweise
kann nur eine der beiden Variablen 'null' sein;
* damit
gelten die beiden Variablen als 'verschieden. */
return
true
;
}
}
else
{
/* Keine
der beiden Variablen ist 'null';
* damit können die
Werte der Variablen verglichen werden. */
if
(
this
.
VariableName
.compareTo(
parmapplication_entity
_BO.
VariableName
)
!= 0)
return
true
;
}/*
* Vergleich
zweier Werte die als Array von elementaren Typen repräsentiert
werden.
* In diesem Beispiel wird byte[] verwendet –
'byte' kann auch durch einen anderen
* elementaren Typ
ersetzt werden. *//* Zuerst
prüfen, ob eine der beiden Variablen 'null' ist. */
if
((
this
.
VariableName
==
null
)
|| (parm
application_entity
_BO.
VariableName
==
null
))
{
/* Prüfen,
ob beide Variablen 'null' sind; dann ist der Vergleich 'erfüllt'.
*/
if
((
this
.
VariableName
==
null
)
&& (parm
application_entity
_BO.
VariableName
==
null
))
{
/* Beide
Variablen sind 'null' - damit ist der Vergleich 'erfüllt'.
*/
}
else
{
/* Logischerweise
kann nur eine der beiden Variablen 'null' sein;
* damit
gelten die beiden Variablen als 'verschieden. */
return
true
;
}
}
else
{
/* Keine
der beiden Variablen ist 'null';
* damit können die
Werte der Variablen verglichen werden. */
if
(!
Arrays.equals(
this
.
VariableName
,
parm
application_entity
_BO.
VariableName
))
return
true
;
}/*
* Für
den Vergleich der Werte spezieller Klassen (z.B. BigDecimal) sind
unter Umständen
* Angaben der Rundungs-Genauigkeit
notwendig.
* */
if
(
this
.
VariableName
.compareTo
!= parm
application_entity
_BO.
VariableName
)
return
true
;
/* Alle
Variablen haben gleiche Werte – BO sind nicht verschieden.
*/
return
false
;
}
In
den beiden Methoden müssen für jede Geschäfts-spezifische Variable
die entsprechenden Code-Zeilen zum Kopieren des Wertes bzw. zum
Prüfen des Unterschiedes von Werten eingefügt werden.
Das
Ersetzen des Platzhalters ist bereits erfolgt wenn Sie das im
Abschnitt
Änderung
des Namens der Klasse
beschriebenen
Verfahren durchgeführt haben.
Beispiele
für das Kopieren und Überlegungen zum Vergleichen ganzer Objekte
finden Sie unter
Objekte
als Variable dieses BO kopieren
bzw.
Objekte
als Variable dieses BO auf Unterschiede prüfen
.
Methode
getDBAAttributes(...) adaptieren
Wenn
der
Muster-Code
für ein BO bei Verwendung der Datenbank-Tabelle 'Parameter'
als
Vorlage verwendet wurde dann ist die Klasse des übergebenen
Parameters (JSBS_Parameter_DBA) schon bestimmt.
/* ---------------------
* METHODE zum Übertragen der Werte der Variablen des
zugehörigen DBA-Objekts. */
public
void
getDBAAttributes(
application_dbtable
_DBA
parm
application_dbtable
_DBA)
{
/*
* Aufruf der Methode der Superklasse um die 'Common
Attributes'
* und die (eventuelle) Fehler-Meldung zu
kopieren.
*/
super
.
getCommonDBAAttributes(parm
application_dbtable
_DBA);
/*
* Spezifische
Werte für dieses BO übertragen. */
this
.
VariableName
=
parm
application_dbtable
_DBA.
VariableName
;
}
Der
Platzhalter für den Namen des DBA-Objekts (
application_dbtable
_DBA
)
ist durch den gültigen Namen zu ersetzen.
Für
jede Variable der DBA-Klasse ist zu definieren, auf welche Variable
der BO-Klasse der Wert übertragen wird.
Spezieller
Muster-Code
In diesem Teil
wird Muster-Code vorgestellt, der nicht in jeder Generellen Klasse
eines BO vorkommen wird und deswegen nicht in den Muster-Code der
Klasse aufgenommen wurde.
Objekte
als Variable dieses BO definieren
public
JS_HSepp_Lieferort_BO
structJS_HSepp_Lieferort_BO
=
new
JS_HSepp_Lieferort_BO();
public
JS_HSepp_BestellPosition_Set_BO
structJS_HSepp_BestellPosition_Set_BO
=
new
JS_HSepp_BestellPosition_Set_BO();
Neben
einfachen Typen und Klassen aus der Java-Standard-Bibliothek (z.B.
'String' oder 'BigDecimal') kann jede beliebige Klasse für eine
Variable eines BO herangezogen werden.
Das
gezeigte Beispiel ist ein Ausschnitt auf dem BO für eine Bestellung
eines Kunden.
Das BO-Klasse enthält die Lieferadresse und die
Liste mit den Positionen der Bestellung als Variablen, die wieder
Klassen der Anwendung sind.
Objekte als
Variable dieses BO kopieren
if
(parmJS_HSepp_Bestellung_BO.
structJS_HSepp_Lieferort_BO
==
null
)
{
this
.
structJS_HSepp_Lieferort_BO
=
null
;
}else
(JS_HSepp_Bestellung_BO.
structJS_HSepp_Lieferort_BO
==
null
)
{
this
.
structJS_HSepp_Lieferort_BO
=
new
JS_HSepp_Bestellung_BO();
this
.
structJS_HSepp_Lieferort_BO
.copyFromJS_HSepp_Bestellung_BO(
parmJS_HSepp_Bestellung_BO.structJS_HSepp_Lieferort_BO
);
}
Der
oben vorgestellte Muster-Code wird in der Methode
copyFrom
application_entity
_BO(...)
implementiert.
Nach einer Prüfung ob das Variablen-Objekt nicht null
ist,
wird die Methode der Klasse benutzt, um die Werte des Objektes zu
kopieren.
Objekte als
Variable dieses BO auf Unterschiede prüfen
Für
den Vergleich von 2 Objekten, die als Variablen von BO definiert
sind, müssen mehrere Überlegungen in Betracht gezogen werden, bevor
die bei der Klasse implementierte Methode
isDifferent(...)
aufgerufen
werden kann:
Ist
der Wert der Variable vielleicht
null
?
Das
muß nicht unbedingt ein Fehler bei der Programmierung sein. Es kann
auch den Grund haben, dass für bestimmte Verarbeitungen diese Werte
gar nicht benötigt werden und aus Performanz-Gründen dann auch
nicht von der Datenbank gelesen werden.
Was
tun wenn nur ein Wert der beiden zu vergleichenden BO
null
ist
?
Diese Frage kann nicht generell beantwortet werden.
Für
eine BO-Klasse kann es bedeuten, dass der nicht durchgeführte
Vergleich als 'kein Unterschied' zu interpretieren ist – bei einer
anderen BO-Klasse gilt vielleicht das Gegenteil.
Müssen
alle Werte verglichen werden ?
Besonders wenn die Variable eine
Liste mit BO (BO_Set) ist, ist für jede BO-Klasse zu entscheiden,
was als 'Unterschied' interpretiert werden soll.
Möglicherweise
reicht schon die gleiche Anzahl der BO in der Liste um als 'kein
Unterschied' zu gelten
Prüfen
auf Konsistenz der Werte dieses BO
Im
Muster-Code ist die Methode
public boolean
isConsitentData()
enthalten
- aber kein Algorithmus für eventuelle Prüfungen
enthalten.
Prüfregeln müssen auf die jeweilige Aufgabe des BO
abgestimmt sein, ein Algorithmus-Schema würde den verschiedenartigen
Aufgaben nicht gerecht und deswegen wird auf einen
Beispiel-Algorithmus verzichtet.
Dokument |
Inhalt |
Schritt desTutorials für die Entwicklung von Heavyweight-Client Anwendungen in dem die Implementierung der Generellen Klasse für das BO vorgestellt wird. |
|
Muster-Code für
die BO-Klasse, mit denen eine Liste von Datensätzen selektiert
werden kann. |