[oop] الفرق بين التجريد والتغليف؟


14 Answers

يخفي التغليف تفاصيل التنفيذ التي قد تكون أو لا تكون للسلوك (السلوكيات) العامة أو المتخصصة.

يوفر التجريد تعميماً (على سبيل المثال ، على مجموعة من السلوكيات).

وهنا قراءة جيدة: التجريد ، تغليف ، وإخفاء المعلومات التي كتبها إدوارد V. بيرارد من وكالة الكائن.

Question

ما هو الفرق الدقيق بين التغليف والتجريد؟




class Aeroplane : IFlyable, IFuelable, IMachine
{ // Aeroplane's Design says:
  // Aeroplane is a flying object
  // Aeroplane can be fueled
  // Aeroplane is a Machine
}
// But the code related to Pilot, or Driver of Aeroplane is not bothered 
// about Machine or Fuel. Hence,
// pilot code:
IFlyable flyingObj = new Aeroplane();
flyingObj.Fly();
// fighter Pilot related code
IFlyable flyingObj2 = new FighterAeroplane();
flyingObj2.Fly();
// UFO related code 
IFlyable ufoObj = new UFO();
ufoObj.Fly();
// **All the 3 Above codes are genaralized using IFlyable,
// Interface Abstraction**
// Fly related code knows how to fly, irrespective of the type of 
// flying object they are.

// Similarly, Fuel related code:
// Fueling an Aeroplane
IFuelable fuelableObj = new Aeroplane();
fuelableObj.FillFuel();
// Fueling a Car
IFuelable fuelableObj2 = new Car(); // class Car : IFuelable { }
fuelableObj2.FillFuel();

// ** Fueling code does not need know what kind of vehicle it is, so far 
// as it can Fill Fuel**



العديد من الإجابات وأمثلةها مضللة.

Encapsulation هو تعبئة البيانات والوظائف التي تعمل على تلك البيانات في مكون واحد وتقييد الوصول إلى بعض مكونات الكائن.
اﻟﺗﻌﺑﯾر ﯾﻌﻧﻲ أن اﻟﺗﻣﺛﯾل اﻟداﺧﻟﻲ ﻟﻟﻌﻧﺻر ﯾﺧﺗﻔﻲ ﺑﺷﮐل ﻋﺎم ﻣن اﻟﻌرض ﺧﺎرج ﺗﻌرﯾف اﻟﮐﺎﺋن.

Abstraction عبارة عن آلية تمثل الميزات الأساسية دون تضمين تفاصيل التنفيذ.

التغليف: - إخفاء المعلومات .
التجريد: - تنفيذ الاختباء .

مثال:

class foo{
    private:
        int a, b;
    public:
        foo(): a(0), b(0) 
        { } 

        foo(int x, int y): a(x), b(y) 
        { }

        int add()
        {    
            return a+b;   
        } 
}  

يتم إخفاء التمثيل الداخلي لأي عنصر من فئات foo خارج الفصل. -> التغليف.
يتم تقييد أي عضو يمكن الوصول إليه (بيانات / وظيفة) من كائن foo ولا يمكن الوصول إليه إلا بواسطة هذا الكائن فقط.

foo foo_obj(3, 4);
int sum = foo_obj.add();

يتم إخفاء تنفيذ طريقة add . -> التجريد.




الفرق بين التجريد والتغليف.




The process of Abstraction and Encapsulation both generate interfaces.

An interface generated via encapsulation hides implementation details.

An interface generated via abstraction becomes applicable to more data types, compared to before abstraction.




Abstraction--- Hiding Implementation--at Design---Using Interface/Abstract calsses

Encapsulation--Hiding Data --At Development---Using access modifiers(public/private)




I will try to demonstrate Encapsulation in a simple way.. Lets see..

  • The wrapping up of data and functions into a single unit (called class) is known as encapsulation. Encapsulation containing and hiding information about an object, such as internal data structures and code.

Encapsulation is -

  • Hiding Complexity,
  • Binding Data and Function together,
  • Making Complicated Method's Private,
  • Making Instance Variable's Private,
  • Hiding Unnecessary Data and Functions from End User.

Encapsulation implements Abstraction.

And Abstraction is -

  • Showing Whats Necessary,
  • Data needs to abstract from End User,

Lets see an example-

The below Image shows a GUI of "Customer Details to be ADD-ed into a Database".

By looking at the Image we can say that we need a Customer Class.

Step - 1: What does my Customer Class needs?

أي

  • 2 variables to store Customer Code and Customer Name.
  • 1 Function to Add the Customer Code and Customer Name into Database.

    namespace CustomerContent { public class Customer { public string CustomerCode = ""; public string CustomerName = ""; public void ADD() { //my DB code will go here }

Now only ADD method wont work here alone.

Step -2: How will the validation work, ADD Function act?

We will need Database Connection code and Validation Code (Extra Methods).

public bool Validate()
{
    //Granular Customer Code and Name
    return true;
}

public bool CreateDBObject()
{
    //DB Connection Code
    return true;
}


class Program
{
static void main(String[] args)
{
CustomerComponent.Customer obj = new CustomerComponent.Customer;

obj.CustomerCode = "s001";
obj.CustomerName = "Mac";

obj.Validate();
obj.CreateDBObject();

obj.ADD();
}
}

Now there is no need of showing the Extra Methods(Validate(); CreateDBObject() [Complicated and Extra method] ) to the End User.End user only needs to see and know about Customer Code, Customer Name and ADD button which will ADD the record.. End User doesn't care about HOW it will ADD the Data to Database?.

Step -3: Private the extra and complicated methods which doesn't involves End User's Interaction.

So making those Complicated and Extra method as Private instead Public(ie Hiding those methods) and deleting the obj.Validate(); obj.CreateDBObject(); from main in class Program we achieve Encapsulation.

In other words Simplifying Interface to End User is Encapsulation.

So now the code looks like as below -

namespace CustomerContent
{
public class Customer
{
public string CustomerCode = "";
public string CustomerName = "";
public void ADD()
{
   //my DB code will go here
}

private bool Validate()
{
    //Granular Customer Code and Name
    return true;
}

private bool CreateDBObject()
{
    //DB Connection Code
    return true;
}


class Program
{
static void main(String[] args)
{
CustomerComponent.Customer obj = new CustomerComponent.Customer;

obj.CustomerCode = "s001";

obj.CustomerName = "Mac";

obj.ADD();
}
}

Summary :

Step -1: What does my Customer Class needs? is Abstraction.

Step -3: Step -3: Private the extra and complicated methods which doesn't involves End User's Interaction is Encapsulation.

PS - The code above is hard and fast.




من this

الفرق بين التغليف و التجريد في OOPS

التجريد والتعبئة هما مفهومان مهمان للبرمجة الشيئية (OOPS). كل من التغليف والتجريد عبارة عن مصطلحات مترابطة.

فرق الحياة الحقيقية بين التغليف والتجريد

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

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

فرق التنفيذ بين التغليف والتجريد

  1. يتم تطبيق التجريد باستخدام واجهة وفئة الملخص بينما يتم تنفيذ التغليف باستخدام معدِّل وصول خاص ومحمي.

  2. OOPS makes use of encapsulation to enforce the integrity of a type (ie to make sure data is used in an appropriate manner) by preventing programmers from accessing data in a non-intended manner. Through encapsulation, only a predetermined group of functions can access the data. The collective term for datatypes and operations (methods) bundled together with access restrictions (public/private, etc.) is a class.




التجريد هو مصطلح عام. أي التغليف هو مجموعة فرعية من التجريد.

Courtesy




التغليف يتطلب نمطية. يتطلب منك إنشاء كائنات لديها البيانات وطرق معالجة البيانات. في هذه الحالة ، يمكنك مشاهدته كوحدة نمطية.

يوفر لك التجريد رؤية عامة لفصولك الدراسية.




تسمى الآلية التي تمنع بيانات كائنات معينة آمنة من سوء الاستخدام المتعمد أو العرضي بواسطة وظائف خارجية " تغليف البيانات"

ويعرف قانون تمثيل السمات الأساسية دون تضمين تفاصيل الخلفية أو التفسيرات باسم التجريد




Information hiding is not strictly required for abstraction or encapsulation. Information might be ignored, but does not have to be hidden.

Encapsulation is the ability to treat something as a single thing, even though it may be composed of many complex parts or ideas. For example, I can say that I'm sitting in a "chair" rather than referring to the many various parts of that chair each with a specific design and function, all fitting together precisely for the purpose of comfortably holding my butt a few feet away from the floor.

Abstraction is enabled by encapsulation. Because we encapsulate objects, we can think about them as things which relate to each other in some way rather than getting bogged down in the subtle details of internal object structure. Abstraction is the ability to consider the bigger picture, removed from concern over little details. The root of the word is abstract as in the summary that appears at the top of a scholarly paper, not abstract as in a class which can only be instantiated as a derived subclass.

I can honestly say that when I plop my butt down in my chair, I never think about how the structure of that chair will catch and hold my weight. It's a decent enough chair that I don't have to worry about those details. So I can turn my attention toward my computer. And again, I don't think about the component parts of my computer. I'm just looking at a part of a webpage that represents a text area that I can type in, and I'm communicating in words, barely even thinking about how my fingers always find the right letters so quickly on the keyboard, and how the connection is ultimately made between tapping these keys and posting to this forum. This is the great power of abstraction. Because the lower levels of the system can be trusted to work with consistency and precision, we have attention to spare for greater work.




مثال آخر:

لنفترض أنني أنشأت فئة مستطيلة غير قابلة للتغيير مثل:

class Rectangle {
 public:
  Rectangle(int width, int height) : width_(width), height_(height) {}
  int width() const { return width_; }
  int height() const { return height_; }

 private:
  int width_;
  int height_;
}

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

تجريد جيد يعني عادة تغليف جيد.

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




يتم تقديم الكثير من الإجابات الجيدة أعلاه ولكن سأقدم وجهة نظري (جافا) هنا.

ربط البيانات يعني ببساطة التفاف والتحكم في الوصول إلى البيانات المجمعة منطقيا في فئة. يرتبط بشكل عام بكلمة رئيسية أخرى - Data Hiding . يتم تحقيق ذلك في Java باستخدام معدِّلات الوصول .

مثال بسيط هو تحديد متغير خاص وإتاحة الوصول إليه باستخدام أساليب getter و setter أو جعل طريقة خاصة كما هو استخدامها فقط هو مع الفصل. ليست هناك حاجة للمستخدم لمعرفة هذه الأساليب والمتغيرات.

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

ومن ناحية أخرى ، فإن فكرة استخراج البيانات هي مفهوم التعميم بحيث لا يتعرض المنطق المعقد تحته للمستخدم. في جافا يتحقق ذلك باستخدام interfaces ودروس abstract .

مثال -

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

مزيد من التفاصيل here .

المنطق المعقد موجود في لوحة الدائرة الكهربائية المغلفة في لوحة اللمس ويتم توفير واجهة لطيفة (الأزرار) لتلخيصها للمستخدم.




التغليف : يخفي تفاصيل تنفيذ غير مرغوب فيها / غير متوقع / الملكية من المستخدمين الفعليين للكائن. على سبيل المثال

List<string> list = new List<string>();
list.Sort(); /* Here, which sorting algorithm is used and hows its 
implemented is not useful to the user who wants to perform sort, that's 
why its hidden from the user of list. */

التجريد : هو طريقة لتقديم التعميم وبالتالي طريقة مشتركة للعمل مع أشياء ذات تنوع شاسع. على سبيل المثال

class Aeroplane : IFlyable, IFuelable, IMachine
{ // Aeroplane's Design says:
  // Aeroplane is a flying object
  // Aeroplane can be fueled
  // Aeroplane is a Machine
}
// But the code related to Pilot, or Driver of Aeroplane is not bothered 
// about Machine or Fuel. Hence,
// pilot code:
IFlyable flyingObj = new Aeroplane();
flyingObj.Fly();
// fighter Pilot related code
IFlyable flyingObj2 = new FighterAeroplane();
flyingObj2.Fly();
// UFO related code 
IFlyable ufoObj = new UFO();
ufoObj.Fly();
// **All the 3 Above codes are genaralized using IFlyable,
// Interface Abstraction**
// Fly related code knows how to fly, irrespective of the type of 
// flying object they are.

// Similarly, Fuel related code:
// Fueling an Aeroplane
IFuelable fuelableObj = new Aeroplane();
fuelableObj.FillFuel();
// Fueling a Car
IFuelable fuelableObj2 = new Car(); // class Car : IFuelable { }
fuelableObj2.FillFuel();

// ** Fueling code does not need know what kind of vehicle it is, so far 
// as it can Fill Fuel**



Related