import {Meta} from '@storybook/addon-docs/blocks'

<Meta title='@dxtmisha/vi/scripts/Classes/PropertiesToAbstract - Lớp chuyển đổi cơ sở'/>

# Lớp PropertiesToAbstract

Lớp `PropertiesToAbstract` đóng vai trò là nền tảng cho tất cả các quy trình chuyển đổi thuộc tính (token) trong hệ thống. Nó xác định một vòng đời chuyển đổi chung, từ khởi tạo dữ liệu đến duy trì bộ nhớ đệm (cache).

## Các tính năng chính

- **Tiêu chuẩn hóa vòng đời** — đảm bảo thứ tự thực hiện nhất quán (`init` -> `write`) trên tất cả các lớp con.
- **Tích hợp PropertiesItems** — cung cấp khả năng quản lý tập trung các mục thuộc tính.
- **Quản lý bộ nhớ đệm** — tự động hóa quá trình ghi các kết quả trung gian vào một tệp được chỉ định.

## Khởi tạo

Vì đây là một lớp trừu tượng (abstract class), nó không thể được khởi tạo trực tiếp. Nó được thiết kế để được kế thừa bởi các lớp chuyển đổi cụ thể (ví dụ: để tạo SCSS hoặc JSON).

**Ví dụ về triển khai lớp con:**

```typescript
import { PropertiesToAbstract, PropertiesItems } from '@dxtmisha/scripts'

class MyPropertiesTransformer extends PropertiesToAbstract {
  protected readonly FILE_CACHE = 'my-cache-file.json'

  protected init(): void {
    // Logic khởi tạo và chuyển đổi
    console.log('Transforming data...')
  }
}
```

## Các phương thức

### `to`
Thực hiện chu kỳ chuyển đổi đầy đủ. Phương thức này là điểm vào công khai (public entry point) và đảm bảo một trình tự hành động nghiêm ngặt: khởi tạo dữ liệu và sau đó là ghi dữ liệu.

```typescript
const transformer = new MyPropertiesTransformer(items);
transformer.to(); // Bắt đầu quy trình
```

### `init` (trừu tượng)
Một phương thức trừu tượng được bảo vệ (protected) phải được triển khai bởi các lớp con. Logic xử lý dữ liệu chính nên được tập trung trong phương thức này.

### `write` (được bảo vệ)
Ghi trạng thái hiện tại của các mục thuộc tính (`PropertiesItems`) vào một tệp được xác định bởi đường dẫn `FILE_CACHE`.

**Trả về:** `void`

## Các thuộc tính

### `FILE_CACHE` (trừu tượng)
Một thuộc tính trừu tượng xác định đường dẫn tệp nơi lưu kết quả chuyển đổi. Nó phải được ghi đè (overridden) trong mọi lớp con cụ thể.

## Ví dụ (Examples)

### Tạo một bộ chuyển đổi tùy chỉnh (Custom Transformer)
```typescript
import { PropertiesToAbstract, PropertiesItems } from '@dxtmisha/scripts'

export class PropertiesToCustom extends PropertiesToAbstract {
  protected readonly FILE_CACHE = 'custom-tokens.json'

  protected init(): void {
    // Ví dụ về sửa đổi dữ liệu trước khi ghi
    forEach(this.items, (item) => {
      item.myData = 'processed'
    })
  }
}
```
