

AWS Mainframe Modernization Service （受管執行期環境體驗） 不再開放給新客戶使用。對於與 AWS Mainframe Modernization Service （受管執行期環境體驗） 類似的功能，探索 AWS Mainframe Modernization Service （自我管理體驗）。現有客戶可以繼續正常使用該服務。如需詳細資訊，請參閱[AWS 大型主機現代化可用性變更](https://docs.aws.amazon.com/m2/latest/userguide/mainframe-modernization-availability-change.html)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 什麼是大型主機 AWS Transform 中的資料簡化程式
<a name="ba-shared-data"></a>

在大型主機和中階系統上 （在下列主題中稱為「舊版」系統），經常使用的程式設計語言，例如 COBOL、PL/I 或 RPG，可提供低層級的記憶體存取。此存取著重於透過原生類型存取的記憶體配置，例如區域化、封裝或英數字元，也可能透過群組或陣列彙總。

透過輸入欄位和直接存取位元組 （原始記憶體） 來混合存取給定的記憶體，在給定程式中共存。例如，COBOL 程式將以連續位元組集合 (LINKAGE) 的形式將引數傳遞給發起人，或以相同方式 （記錄） 從檔案讀取/寫入資料，同時以文案中整理的類型欄位來解譯此類記憶體範圍。

這類原始和結構化存取記憶體的組合、對精確位元組層級記憶體配置的依賴，以及舊版類型，例如分區或封裝，都是在 Java 程式設計環境中原生或輕鬆可用的功能。

作為將舊版程式現代化為 Java 的大型主機 AWS 轉換解決方案的一部分，**Data Simplifier** 程式庫為現代化 Java 程式提供此類建構，並以盡可能熟悉的方式向 Java 開發人員公開這些建構模組 (getters/setters、位元組陣列、類別型）。這是從此類程式產生的現代化 Java 程式碼的核心相依性。

為求簡化，下列大多數說明都是以 COBOL 建構為基礎，但您可以將相同的 API 用於 PL1 和 RPG 資料配置現代化，因為大多數概念都類似。

**Topics**
+ [主要類別](#ba-shared-data-main-classes)
+ [資料繫結與存取](#ba-shared-data-binding-access)
+ [討論的 Java 類型的 FQN](#ba-shared-data-fqn)

## 主要類別
<a name="ba-shared-data-main-classes"></a>

為了方便閱讀，本文件使用適用於大型主機 API 介面和類別的 AWS Transform 的 Java 簡短名稱。如需詳細資訊，請參閱[討論的 Java 類型的 FQN](#ba-shared-data-fqn)。

### 低階記憶體表示
<a name="ba-shared-data-main-classes-memory"></a>

 在最低層級， `Record` 界面代表記憶體 （以快速、隨機方式存取的連續位元組範圍）。此界面基本上是固定大小之位元組陣列的抽象。因此，它提供設定程式和取得程式能夠存取或修改基礎位元組。

### 結構化資料表示
<a name="ba-shared-data-main-classes-structured"></a>

若要表示結構式資料，例如 "01 data items" 或 "01 copybooks"，如 COBOL DATA DIVISION 中所找到，會使用 `RecordEntity` 類別的子類別。這些通常不是手動撰寫，而是由對應舊版建構中的 AWS 大型主機現代化工具轉換所產生。了解其主要結構和 API 仍然很有用，因此您可以了解現代化程式中的程式碼如何使用它們。在 COBOL 的情況下，該程式碼是從 PROCEDURE DIVISION 產生的 Java。

產生的程式碼代表每個具有`RecordEntity`子類別的「01 資料項目」；每個基本欄位或彙總編寫以私有 Java 欄位表示，組織為樹狀目錄 （每個項目都有父項，但根欄位除外）。

基於說明目的，以下是 COBOL 資料項目範例，後面接著適用於大型主機產生之程式碼的對應 AWS 轉換，以將其現代化：

```
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);
	   }
}
```

#### 基本欄位
<a name="ba-shared-data-main-classes-structured-elementary"></a>

類別欄位 `Elementary`（或 `Filler`，當未命名時） 代表舊版資料結構的「分葉」。它們與基礎位元組 ("range") 的連續範圍相關聯，通常具有 類型 （可能參數化），表示如何解譯和修改這些位元組 （分別透過「解碼」和「編碼」從/到位元組陣列的值）。

所有基本類型都是 的子類別`RangeType`。常見類型為：


| COBOL 類型 | 資料簡化器類型 | 
| --- | --- | 
|  `PIC X(n)`  |  `AlphanumericType`  | 
|  `PIC 9(n)`  |  `ZonedType`  | 
|  `PIC 9(n) COMP-3`  |  `PackedType`  | 
|  `PIC 9(n) COMP-5`  |  `BinaryType`  | 

#### 彙總欄位
<a name="ba-shared-data-main-classes-structured-aggregate"></a>

彙總欄位會組織其內容的記憶體配置 （其他彙總或基本欄位）。它們本身沒有基本類型。

`Group` 欄位代表記憶體中的連續欄位。每個包含的欄位在記憶體中以相同的順序排列，第一個欄位與記憶體中的群組欄位位置`0`處於偏移，第二個欄位位於偏移 `0 + (size in bytes of first field)`等。它們用於表示相同包含欄位下的 COBOL 欄位序列。

`Union` 欄位代表存取相同記憶體的多個欄位。每個包含的欄位都會`0`相對於記憶體中的聯集欄位位置以偏移方式配置。例如，它們用於代表 COBOL "REDEFINES" 建構 （第一個 Union 子系是重新定義的資料項目，第二個子系是其第一個重新定義等）。

陣列欄位 ( 的子類別`Repetition`) 代表其子欄位配置的重複 （無論是彙總本身或基本項目）。它們在記憶體中配置了一定數量的此類子配置，每個配置都處於位移 `index * (size in bytes of child)`。它們用於代表 COBOL "OCCURS" 建構。

#### 基本概念
<a name="ba-shared-data-main-classes-structured-primitive"></a>

在某些現代化案例中，「主要」也可以用來呈現獨立的「根」資料項目。這些在使用 時非常類似，`RecordEntity`但不是來自它，也不是以產生的程式碼為基礎。相反地，它們是由大型主機執行時間的 AWS 轉換直接提供，作為`Primitive`界面的子類別。這類提供的類別範例為 `Alphanumeric`或 `ZonedDecimal`。

## 資料繫結與存取
<a name="ba-shared-data-binding-access"></a>

結構化資料與基礎資料之間的關聯可以透過多種方式完成。

此用途的重要界面是 `RecordAdaptable`，其用於取得`RecordAdaptable`基礎資料的`Record`「可寫入檢視」。如以下所示，多個類別實作 `RecordAdaptable`。互斥地， AWS 大型主機 APIs和程式碼處理低階記憶體 （例如程式引數、檔案 I/O 記錄、CICS 通訊區域、配置的記憶體...) 的轉換通常預期 `RecordAdaptable`會是該記憶體的控制代碼。

在 COBOL 現代化案例中，大多數資料項目都會與記憶體相關聯，該記憶體會在對應程式執行的生命週期內修正。為此，`RecordEntity`子類別會在產生的父物件 （程式內容） 中執行個體化一次`Record`，並根據`RecordEntity`位元組大小，負責執行個體化其基礎 。

在其他 COBOL 案例中，例如將 LINKAGE 元素與程式引數建立關聯，或現代化 SET ADDRESS OF 建構，`RecordEntity`執行個體必須與提供的 建立關聯`RecordAdaptable`。為此，存在兩種機制：
+ 如果`RecordEntity`執行個體已存在，則可以使用 `RecordEntity.bind(RecordAdaptable)`方法 （繼承自 `Bindable`) 將此執行個體設為「點」至此 `RecordAdaptable`。上呼叫的任何 getter 或 setter `RecordEntity` 都會由基礎位元組支援 （位元組讀取或寫入）`RecordAdaptable`。
+ 如果要`RecordEntity`執行個體化 ，`RecordAdaptable`則可使用產生且接受 的建構函數。

相反地，可以存取`Record`目前繫結至結構化資料的 。因此， `RecordEntity`會實作 `RecordAdaptable`，因此`getRecord()`可以在任何此類執行個體上呼叫 。

最後，許多 COBOL 或 CICS 動詞需要存取單一欄位，以供讀取或寫入之用。`RangeReference` 類別用於表示此類存取。其執行個體可從`RecordEntity`產生的`getXXXReference()`方法 (`XXX` 為存取欄位） 取得，並傳遞至執行期方法。 `RangeReference` 通常用於存取整個 `RecordEntity`或 `Group`，而其子類別`ElementaryRangeReference`代表對`Elementary`欄位的存取。

請注意，上述大多數觀察都適用於`Primitive`子類別，因為它們會努力實作類似的行為，`RecordEntity`如同由適用於大型主機執行時間的 AWS 轉換 （而非產生的程式碼） 所提供。為此， 的所有子類別都會`Primitive`實作 `RecordAdaptable`、 `ElementaryRangeReference`和 `Bindable` 介面，以用來取代`RecordEntity`子類別和基本欄位。

## 討論的 Java 類型的 FQN
<a name="ba-shared-data-fqn"></a>

下表顯示本節討論的 Java 類型的完整名稱。


| 短名稱 | 完整名稱 | 
| --- | --- | 
|  `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`  | 