

AWS Der Mainframe Modernization Service (Managed Runtime Environment Experience) steht Neukunden nicht mehr zur Verfügung. Funktionen, die dem AWS Mainframe Modernization Service (Managed Runtime Environment-Erfahrung) ähneln, finden Sie unter AWS Mainframe Modernization Service (Self-Managed Experience). Bestandskunden können den Service weiterhin wie gewohnt nutzen. Weitere Informationen finden Sie unter Änderung der Verfügbarkeit von [AWS Mainframe Modernization](https://docs.aws.amazon.com/m2/latest/userguide/mainframe-modernization-availability-change.html).

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Was sind Datenvereinfacher in AWS Transform for Mainframe
<a name="ba-shared-data"></a>

Auf Mainframe- und Midrange-Systemen (im folgenden Thema als „Legacy-Systeme“ bezeichnet) ermöglichen häufig verwendete Programmiersprachen wie COBOL PL/I oder RPG einen Low-Level-Zugriff auf Speicher. Dieser Zugriff konzentriert sich auf das Speicherlayout, auf das über systemeigene Typen wie zonenweise, gepackt oder alphanumerisch zugegriffen wird, möglicherweise auch aggregiert über Gruppen oder Arrays.

In einem bestimmten Programm gibt es eine Kombination von Zugriffen auf ein bestimmtes Speicherelement, sowohl über typisierte Felder als auch über direkten Zugriff auf Byte (Rohspeicher). COBOL-Programme übergeben beispielsweise Argumente als zusammenhängende Bytesätze (LINKAGE) oder read/write Daten aus Dateien auf die gleiche Weise (Datensätze) an Aufrufer, während sie solche Speicherbereiche mit typisierten Feldern interpretieren, die in Copybooks organisiert sind.

Solche Kombinationen aus rohem und strukturiertem Speicherzugriff, der Abhängigkeit von einem präzisen Speicherlayout auf Byteebene und veraltete Typen wie zoned oder packed sind Funktionen, die in der Java-Programmierumgebung weder nativ noch einfach verfügbar sind.

Als Teil der AWS Transform for Mainframe-Lösung zur Modernisierung älterer Programme auf Java stellt die **Data Simplifier-Bibliothek** solche Konstrukte für modernisierte Java-Programme bereit und stellt sie auf eine Weise zur Verfügung, die Java-Entwicklern so vertraut wie möglich ist (Getter/Setter, Byte-Arrays, klassenbasiert). Sie ist eine Kernabhängigkeit des modernisierten Java-Codes, der aus solchen Programmen generiert wird.

Der Einfachheit halber basieren die meisten der folgenden Erklärungen auf COBOL-Konstrukten. Sie können jedoch dieselbe API sowohl für die Modernisierung des RPG-Datenlayouts als auch PL1 für die Modernisierung des RPG-Datenlayouts verwenden, da die meisten Konzepte ähnlich sind.

**Topics**
+ [Wichtigste Klassen](#ba-shared-data-main-classes)
+ [Datenbindung und Zugriff](#ba-shared-data-binding-access)
+ [Häufig gestellte Fragen zu den besprochenen Java-Typen](#ba-shared-data-fqn)

## Wichtigste Klassen
<a name="ba-shared-data-main-classes"></a>

Zur besseren Lesbarkeit verwendet dieses Dokument die Java-Kurznamen der API-Schnittstellen und -Klassen von AWS Transform for Mainframe. Weitere Informationen finden Sie unter [Häufig gestellte Fragen zu den besprochenen Java-Typen](#ba-shared-data-fqn).

### Darstellung des Speichers auf niedriger Ebene
<a name="ba-shared-data-main-classes-memory"></a>

 Auf der untersten Ebene wird der Speicher (ein zusammenhängender Bytebereich, auf den schnell und zufällig zugegriffen werden kann) durch die `Record` Schnittstelle repräsentiert. Diese Schnittstelle ist im Wesentlichen eine Abstraktion eines Byte-Arrays fester Größe. Als solches bietet es Setter und Getter, die auf die zugrunde liegenden Bytes zugreifen oder diese ändern können.

### Strukturierte Datendarstellung
<a name="ba-shared-data-main-classes-structured"></a>

Zur Darstellung strukturierter Daten wie „01 Datenelemente“ oder „01 Copybooks“, wie sie in COBOL DATA DIVISION zu finden sind, werden Unterklassen der `RecordEntity` Klasse verwendet. Diese werden normalerweise nicht von Hand geschrieben, sondern mit den Modernisierungstools AWS Transform for Mainframe aus den entsprechenden Legacy-Konstrukten generiert. Es ist immer noch nützlich, etwas über ihre Hauptstruktur und API zu wissen, damit Sie verstehen können, wie der Code in einem modernisierten Programm sie verwendet. Im Fall von COBOL handelt es sich bei diesem Code um Java, das aus ihrer PROCEDURE DIVISION generiert wurde.

Der generierte Code stellt jedes „01-Datenelement“ mit einer `RecordEntity` Unterklasse dar. Jedes Elementarfeld oder Aggregat, aus dem es besteht, wird als privates Java-Feld dargestellt, das als Baum organisiert ist (jedes Element hat ein übergeordnetes Feld, mit Ausnahme des Stammelements).

Zur Veranschaulichung finden Sie hier ein Beispiel für ein COBOL-Datenelement, gefolgt von der entsprechenden AWS Transformation für Mainframe-generierten Code, der das Datenelement modernisiert:

```
01 TST2.
 02 FILLER PIC X(4).
 02 F1     PIC 9(2) VALUE 42.
 02 FILLER PIC X.
 02        PIC 9(3) VALUE 123.
 02 F2     PIC X VALUE 'A'.
```

```
public class Tst2 extends RecordEntity {

	   private final Group root = new Group(getData()).named("TST2"); 
	   private final Filler filler = new Filler(root,new AlphanumericType(4));
	   private final Elementary f1 = new Elementary(root,new ZonedType(2, 0, false),new BigDecimal("42")).named("F1");
	   private final Filler filler1 = new Filler(root,new AlphanumericType(1));
	   private final Filler filler2 = new Filler(root,new ZonedType(3, 0, false),new BigDecimal("123"));
	   private final Elementary f2 = new Elementary(root,new AlphanumericType(1),"A").named("F2");
	

	   /**
	    * Instantiate a new Tst2 with a default record.
   	 * @param configuration the configuration
   	 */
	   public Tst2(Configuration configuration) {
		      super(configuration);
		      setupRoot(root);
	   }
	   /**
	    * Instantiate a new Tst2 bound to the provided record.
	    * @param configuration the configuration
	    * @param record the existing record to bind
	    */
	   public Tst2(Configuration configuration, RecordAdaptable record) {
		      super(configuration);
		      setupRoot(root, record);
	   }

	   /**
	    * Gets the reference for attribute f1.
	    * @return the f1 attribute reference
	    */
	   public ElementaryRangeReference getF1Reference() {
		      return f1.getReference();
	   }

	   /* *
	    * Getter for f1 attribute.
	    * @return f1 attribute
	    */
	   public int getF1() {
		      return f1.getValue();
	   }

	   /**
	    * Setter for f1 attribute.
	    * @param f1 the new value of f1
	    */
   	public void setF1(int f1) {
		      this.f1.setValue(f1);
	   }
	   /**
	    * Gets the reference for attribute f2.
	    * @return the f2 attribute reference
	    */
	   public ElementaryRangeReference getF2Reference() {
		      return f2.getReference();
	   }

	   /**
	    * Getter for f2 attribute.
	    * @return f2 attribute
	    */
	   public String getF2() {
		      return f2.getValue();
	   }

	   /**
	    * Setter for f2 attribute.
	    * @param f2 the new value of f2
	    */
	   public void setF2(String f2) {
		      this.f2.setValue(f2);
	   }
}
```

#### Elementare Felder
<a name="ba-shared-data-main-classes-structured-elementary"></a>

Felder der Klasse `Elementary` (oder`Filler`, wenn sie unbenannt sind) stellen ein „Blatt“ der alten Datenstruktur dar. Sie sind einem zusammenhängenden Bereich zugrundeliegender Bytes („Bereich“) zugeordnet und haben üblicherweise einen Typ (möglicherweise parametrisiert), der angibt, wie diese Byte interpretiert und verändert werden sollen (indem jeweils ein Wert in einem Byte-Array „dekodiert“ und „kodiert“ wird). from/to 

Alle elementaren Typen sind Unterklassen von. `RangeType` Übliche Typen sind:


| COBOL-Typ | Typ des Datenvereinfachers | 
| --- | --- | 
|  `PIC X(n)`  |  `AlphanumericType`  | 
|  `PIC 9(n)`  |  `ZonedType`  | 
|  `PIC 9(n) COMP-3`  |  `PackedType`  | 
|  `PIC 9(n) COMP-5`  |  `BinaryType`  | 

#### Felder aggregieren
<a name="ba-shared-data-main-classes-structured-aggregate"></a>

Aggregatfelder organisieren das Speicherlayout ihres Inhalts (andere Aggregate oder elementare Felder). Sie haben selbst keinen elementaren Typ.

`Group`Felder stehen für zusammenhängende Felder im Speicher. Jedes der darin enthaltenen Felder ist in derselben Reihenfolge im Speicher angeordnet, wobei das erste Feld einen Offset `0` gegenüber der Gruppenfeldposition im Speicher hat, das zweite Feld einen Offset `0 + (size in bytes of first field)` usw. Sie werden verwendet, um Sequenzen von COBOL-Feldern unter demselben enthaltenden Feld darzustellen.

`Union`Felder stehen für mehrere Felder, die auf denselben Speicher zugreifen. Jedes der darin enthaltenen Felder ist in `0` Bezug auf die Position des Union-Felds im Speicher versetzt angeordnet. Sie werden beispielsweise verwendet, um das COBOL-Konstrukt „REDEFINES“ darzustellen (die ersten Union-Kinder sind das neu definierte Datenelement, die zweiten untergeordneten Elemente sind die erste Neudefinition usw.).

Array-Felder (Unterklassen von`Repetition`) stellen die Wiederholung des Layouts ihres untergeordneten Felds im Speicher dar (sei es ein Aggregat selbst oder ein elementares Element). Sie legen eine bestimmte Anzahl solcher untergeordneter Layouts im Speicher an, wobei jedes Layout einen Offset hat. `index * (size in bytes of child)` Sie werden verwendet, um COBOL-"OCCURS“ -Konstrukte darzustellen.

#### Primitive
<a name="ba-shared-data-main-classes-structured-primitive"></a>

In einigen Modernisierungsfällen können „Primitive“ auch verwendet werden, um unabhängige, „Stamm“ -Datenelemente darzustellen. Diese sind in ihrer Verwendung sehr ähnlich, stammen `RecordEntity` aber nicht daraus und basieren auch nicht auf generiertem Code. Stattdessen werden sie direkt von AWS Transform for Mainframe Runtime als Unterklassen der `Primitive` Schnittstelle bereitgestellt. Beispiele für solche bereitgestellten Klassen sind `Alphanumeric` oder. `ZonedDecimal`

## Datenbindung und Zugriff
<a name="ba-shared-data-binding-access"></a>

Die Verknüpfung zwischen strukturierten Daten und zugrunde liegenden Daten kann auf verschiedene Arten erfolgen.

Eine wichtige Schnittstelle für diesen Zweck ist`RecordAdaptable`, die dazu dient, eine `Record` „beschreibbare Ansicht“ auf die `RecordAdaptable` zugrunde liegenden Daten zu erhalten. Wie wir weiter unten sehen werden, werden mehrere Klassen implementiert`RecordAdaptable`. Umgekehrt erwarten AWS Transform for Mainframe APIs und Code, der Speicher auf niedriger Ebene manipuliert (wie Programmargumente, I/O Dateidatensätze, CICS-Kommunikationsbereich, zugewiesener Speicher...), häufig a `RecordAdaptable` als Zugriffsnummer für diesen Speicher.

Im Fall der COBOL-Modernisierung sind die meisten Datenelemente mit Speicher verknüpft, der während der Laufzeit der entsprechenden Programmausführung repariert wird. Zu diesem Zweck werden `RecordEntity` Unterklassen einmal in einem generierten übergeordneten Objekt (dem Programmkontext) instanziiert und kümmern sich dann, basierend auf der Bytegröße`Record`, um die Instanziierung der ihnen zugrunde liegenden Klassen. `RecordEntity`

In anderen COBOL-Fällen, wie z. B. beim Zuordnen von LINKAGE-Elementen zu Programmargumenten oder bei der Modernisierung des SET ADDRESS OF-Konstrukts, muss eine Instanz mit einem bereitgestellten Objekt verknüpft werden. `RecordEntity` `RecordAdaptable` Zu diesem Zweck gibt es zwei Mechanismen:
+ wenn die `RecordEntity` Instanz bereits existiert, kann die `RecordEntity.bind(RecordAdaptable)` Methode (geerbt von`Bindable`) verwendet werden, damit diese Instanz darauf „verweist“`RecordAdaptable`. Jeder Getter oder Setter, der auf der aufgerufen wird, `RecordEntity` wird dann von den zugrundeliegenden `RecordAdaptable` Bytes unterstützt (Byte lesen oder schreiben).
+ wenn der instanziiert werden soll, `RecordEntity` ist ein generierter Konstruktor verfügbar, der a akzeptiert. `RecordAdaptable`

Umgekehrt kann auf die `Record` aktuell gebundenen strukturierten Daten zugegriffen werden. Dazu `RecordEntity` implementiert`RecordAdaptable`, `getRecord()` kann also auf jeder solchen Instanz aufgerufen werden.

Schließlich benötigen viele COBOL- oder CICS-Verben Zugriff auf ein einzelnes Feld zum Lesen oder Schreiben. Die `RangeReference` Klasse wird verwendet, um einen solchen Zugriff darzustellen. Ihre Instanzen können aus `RecordEntity` generierten `getXXXReference()` Methoden (d. h. dem Feld, auf das zugegriffen `XXX` wird) abgerufen und an Laufzeitmethoden übergeben werden. `RangeReference`wird normalerweise für den Zugriff auf das gesamte `RecordEntity` Objekt oder verwendet`Group`, während seine Unterklasse Zugriffe auf `Elementary` Felder `ElementaryRangeReference` darstellt.

Beachten Sie, dass die meisten obigen Beobachtungen für `Primitive` Unterklassen gelten, da sie darauf abzielen, ein ähnliches Verhalten zu implementieren, wie `RecordEntity` es von AWS Transform für die Mainframe-Laufzeit bereitgestellt wird (anstelle von generiertem Code). Zu diesem Zweck `Primitive` implementieren alle Unterklassen von `ElementaryRangeReference` und `Bindable` Schnittstellen`RecordAdaptable`, sodass sie anstelle von `RecordEntity` Unterklassen und elementaren Feldern verwendet werden können.

## Häufig gestellte Fragen zu den besprochenen Java-Typen
<a name="ba-shared-data-fqn"></a>

Die folgende Tabelle zeigt die vollqualifizierten Namen der in diesem Abschnitt behandelten Java-Typen.


| Kurzer Name | Vollständig qualifizierter Name | 
| --- | --- | 
|  `Alphanumeric`  |  `com.netfective.bluage.gapwalk.datasimplifier.elementary.Alphanumeric`  | 
|  `AlphanumericType`  |  `com.netfective.bluage.gapwalk.datasimplifier.metadata.type.AlphanumericType`  | 
|  `BinaryType`  |  `com.netfective.bluage.gapwalk.datasimplifier.metadata.type.BinaryType`  | 
|  `Bindable`  |  `com.netfective.bluage.gapwalk.datasimplifier.data.Bindable`  | 
|  `Elementary`  |  `com.netfective.bluage.gapwalk.datasimplifier.data.structure.Elementary`  | 
|  `ElementaryRangeReference`  |  `com.netfective.bluage.gapwalk.datasimplifier.entity.ElementaryRangeReference`  | 
|  `Filler`  |  `com.netfective.bluage.gapwalk.datasimplifier.data.structure.Filler`  | 
|  `Group`  |  `com.netfective.bluage.gapwalk.datasimplifier.data.structure.Group`  | 
|  `PackedType`  |  `com.netfective.bluage.gapwalk.datasimplifier.metadata.type.PackedType`  | 
|  `Primitive`  |  `com.netfective.bluage.gapwalk.datasimplifier.elementary.Primitive`  | 
|  `RangeReference`  |  `com.netfective.bluage.gapwalk.datasimplifier.entity.RangeReference`  | 
|  `RangeType`  |  `com.netfective.bluage.gapwalk.datasimplifier.metadata.type.RangeType`  | 
|  `Record`  |  `com.netfective.bluage.gapwalk.datasimplifier.data.Record`  | 
|  `RecordAdaptable`  |  `com.netfective.bluage.gapwalk.datasimplifier.data.RecordAdaptable`  | 
|  `RecordEntity`  |  `com.netfective.bluage.gapwalk.datasimplifier.entity.RecordEntity`  | 
|  `Repetition`  |  `com.netfective.bluage.gapwalk.datasimplifier.data.structure.Repetition`  | 
|  `Union`  |  `com.netfective.bluage.gapwalk.datasimplifier.data.structure.Union`  | 
|  `ZonedDecimal`  |  `com.netfective.bluage.gapwalk.datasimplifier.elementary.ZonedDecimal`  | 
|  `ZonedType`  |  `com.netfective.bluage.gapwalk.datasimplifier.metadata.type.ZonedType`  | 