---
title: "التغليف الذاتي للحقل"
type: "refactoring-technique"
slug: "self-encapsulate-field"
url: "http://localhost:3000/ar/self-encapsulate-field.md"
category: "تنظيم البيانات"
description: "المشكلة: تستخدم الوصول المباشر إلى الحقول الخاصة داخل الفئة. الحل: أنشئ دالة جلب (getter) ودالة تعيين (setter) للحقل، واستخدمهما فقط للوصول إلى الحقل."
languages: ["java", "csharp", "php", "typescript"]
---
# التغليف الذاتي للحقل

> المشكلة: تستخدم الوصول المباشر إلى الحقول الخاصة داخل الفئة. الحل: أنشئ دالة جلب ودالة تعيين للحقل، واستخدمهما فقط للوصول إلى الحقل.

## المشكلة

تستخدم الوصول المباشر إلى الحقول الخاصة داخل الفئة.

## الحل

أنشئ دالة جلب ودالة تعيين للحقل، واستخدمهما فقط للوصول إلى الحقل.

## لماذا نقوم بإعادة الهيكلة

في بعض الأحيان، لا يكون الوصول المباشر إلى حقل خاص داخل فئة ما مرنًا بما فيه الكفاية. قد ترغب في أن تكون قادرًا على بدء قيمة الحقل عند إجراء أول استعلام أو إجراء عمليات معينة على القيم الجديدة للحقل عند تعيينها، أو ربما القيام بكل هذا بطرق مختلفة في الفئات الفرعية.

## الفوائد

* _الوصول غير المباشر إلى الحقول_ هو عندما يتم التعامل مع الحقل عبر طرق الوصول (getters و setters). هذا النهج أكثر مرونة بكثير من _الوصول المباشر إلى الحقول_.
  * أولاً، يمكنك إجراء عمليات معقدة عند تعيين البيانات في الحقل أو استلامها. يتم تنفيذ _التهيئة الكسولة_ و _التحقق من صحة قيم الحقل_ بسهولة داخل دوال جلب وتعيين الحقل.
  * ثانيًا وهو الأكثر أهمية، يمكنك إعادة تعريف دوال الجلب والتعيين في الفئات الفرعية.
* لديك خيار عدم تنفيذ دالة تعيين للحقل على الإطلاق. سيتم تحديد قيمة الحقل في الباني فقط، مما يجعل الحقل غير قابل للتغيير طوال دورة حياة الكائن بأكملها.

## كيفية إعادة الهيكلة

1. أنشئ دالة جلب (ودالة تعيين اختيارية) للحقل. يجب أن تكون إما `protected` أو `public`.
2. ابحث عن جميع الاستدعاءات المباشرة للحقل واستبدلها باستدعاءات دالة الجلب ودالة التعيين.
## Relations

**Helps you do**

- [تكرار البيانات المرصودة](/ar/duplicate-observed-data.md)
- [استبدال كود النوع بفئات فرعية](/ar/replace-type-code-with-subclasses.md)
- [استبدال كود النوع بالحالة/الاستراتيجية](/ar/replace-type-code-with-state-strategy.md)

**Similar techniques**

- [تغليف الحقل](/ar/encapsulate-field.md)

## Code Examples

### java

```java
// Before
class Range {
  private int low, high;
  boolean includes(int arg) {
    return arg >= low && arg <= high;
  }
}

// After
class Range {
  private int low, high;
  boolean includes(int arg) {
    return arg >= getLow() && arg <= getHigh();
  }
  int getLow() {
    return low;
  }
  int getHigh() {
    return high;
  }
}
```

### csharp

```csharp
// Before
class Range 
{
  private int low, high;
  
  bool Includes(int arg) 
  {
    return arg >= low && arg <= high;
  }
}

// After
class Range 
{
  private int low, high;
  
  int Low {
    get { return low; }
  }
  int High {
    get { return high; }
  }
  
  bool Includes(int arg) 
  {
    return arg >= Low && arg <= High;
  }
}
```

### php

```php
// Before
private $low;
private $high;

function includes($arg) {
  return $arg >= $this->low && $arg <= $this->high;
}

// After
private $low;
private $high;

function includes($arg) {
  return $arg >= $this->getLow() && $arg <= $this->getHigh();
}
function getLow() {
  return $this->low;
}
function getHigh() {
  return $this->high;
}
```

### typescript

```typescript
// Before
class Range {
  private low: number
  private high: number;
  includes(arg: number): boolean {
    return arg >= low && arg <= high;
  }
}

// After
class Range {
  private low: number
  private high: number;
  includes(arg: number): boolean {
    return arg >= getLow() && arg <= getHigh();
  }
  getLow(): number {
    return low;
  }
  getHigh(): number {
    return high;
  }
}
```

