---
title: "تغليف الحقل"
type: "refactoring-technique"
slug: "encapsulate-field"
url: "http://localhost:3000/ar/encapsulate-field.md"
category: "تنظيم البيانات"
description: "المشكلة: لديك حقل عام (public field). الحل: اجعل الحقل خاصاً (private) وأنشئ دوال وصول (access methods) له."
languages: ["java", "csharp", "php", "typescript"]
---
# تغليف الحقل

> المشكلة: لديك حقل عام (public field). الحل: اجعل الحقل خاصاً (private) وأنشئ دوال وصول (access methods) له.

## المشكلة

لديك حقل عام (public field).

## الحل

اجعل الحقل خاصاً (private) وأنشئ دوال وصول (access methods) له.

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

أحد ركائز البرمجة كائنية التوجه (OOP) هو _التغليف (Encapsulation)_، أي القدرة على إخفاء بيانات الكائنات. خلاف ذلك، ستكون جميع الكائنات عامة ويمكن للكائنات الأخرى الحصول على بيانات كائنك وتعديلها دون أي فحوصات أو ضوابط! تفصل البيانات عن السلوكيات المرتبطة بها، وتتعرض نمطية (modularity) أقسام البرنامج للخطر، وتصبح الصيانة معقدة.

## الفوائد

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

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

1. أنشئ دالة الحصول (getter) ودالة التعيين (setter) للحقل.
2. ابحث عن جميع استدعاءات الحقل. استبدل الحصول على قيمة الحقل بدالة الحصول، واستبدل تعيين قيم الحقل الجديدة بدالة التعيين.
3. بعد استبدال جميع استدعاءات الحقل، اجعل الحقل خاصاً (private).

#### الخطوات التالية

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

**Similar techniques**

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

**Eliminates smells**

- [كلاس البيانات](/ar/smells/data-class.md)

## Code Examples

### java

```java
// Before
class Person {
  public String name;
}

// After
class Person {
  private String name;

  public String getName() {
    return name;
  }
  public void setName(String arg) {
    name = arg;
  }
}
```

### csharp

```csharp
// Before
class Person 
{
  public string name;
}

// After
class Person 
{
  private string name;

  public string Name
  {
    get { return name; }
    set { name = value; }
  }
}
```

### php

```php
// Before
public $name;

// After
private $name;

public getName() {
  return $this->name;
}

public setName($arg) {
  $this->name = $arg;
}
```

### typescript

```typescript
// Before
class Person {
  name: string;
}

// After
class Person {
  private _name: string;

  get name() {
    return this._name;
  }
  setName(arg: string): void {
    this._name = arg;
  }
}
```

