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




شرح في (25)

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


Answers

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


هذه مفاهيم غامضة نوعًا ما لا تنفرد بها علوم الكمبيوتر والبرمجة. أود أن أقدم بعض الأفكار الإضافية التي قد تساعد الآخرين على فهم هذه المفاهيم الهامة.

اجابة قصيرة

التغليف - إخفاء و / أو تقييد الوصول إلى أجزاء معينة من النظام ، مع كشف الواجهات الضرورية.

التجريد - النظر في شيء ذي خصائص معينة تمت إزالته ، بصرف النظر عن الحقائق الملموسة ، أو أشياء محددة ، أو حالات فعلية ، وبالتالي تقليل التعقيد.

التشابه الرئيسي هو أن هذه التقنيات تهدف إلى تحسين الفهم والاستفادة.

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

اجابة طويلة

التغليف

إليك مثال للتغليف الذي نأمل أن يجعل الأمور أكثر وضوحًا:

هنا لدينا Arduino اونو ، واردوينو اونو داخل العلبة. الضميمة هي تمثيل رائع لما يدور حوله التغليف.

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

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

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

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

التجريد

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

إليك كيف أحب التفكير في التجريد:

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

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

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

دروس مجردة

كما يسمح لنا التجريد في البرمجة أن ننظر إلى القواسم المشتركة بين العديد من أنواع الكائنات "الملموسة" (الأنواع الموجودة بالفعل) ونحدد تلك القواسم المشتركة داخل كيان فريد. على سبيل المثال ، قد ترث فصيلة Tree بنا من abstract class Plant ، والتي تحتوي على العديد من الخصائص والأساليب التي تنطبق على جميع الطبقات الشبيهة بالنباتات ، ولكنها تزيل تلك الخاصة بكل نوع من أنواع النباتات. هذا يمكن أن تقلل إلى حد كبير من تكرار التعليمات البرمجية ، ويحسن الصيانة.

الاختلاف العملي abstract class عادية هو أنه من الناحية المفاهيمية لا توجد أمثلة "حقيقية" abstract class . لن يكون من المنطقي إنشاء كائن Plant لأن ذلك ليس محددًا بما فيه الكفاية. كل Plant "حقيقي" هو أيضا نوع أكثر تحديدا من Plant .

أيضا ، إذا أردنا أن يكون برنامجنا أكثر واقعية ، فقد نرغب في النظر في حقيقة أن صف Tree لدينا قد يكون مجرد مجردة. في الواقع ، كل Tree هي نوع أكثر خصوصية من Tree ، لذلك يمكننا إنشاء فصول لتلك الأنواع مثل Birch ، Maple ، إلخ. التي ترث من صفنا Tree ، ربما abstract الآن.

JVM

مثال جيد آخر على التجريد هو Java Virtual Machine (JVM) ، الذي يوفر جهاز كمبيوتر ظاهري أو مجرد لتشغيل شفرة Java. إنه يأخذ في الأساس كل مكونات النظام الأساسي المحددة للنظام ، ويوفر واجهة مجردة من "الكمبيوتر" دون النظر إلى أي نظام على وجه الخصوص.

الاختلاف

يختلف التغليف عن التجريد في أنه ليس له أي علاقة بشيء "حقيقي" أو "دقيق". لا تزيل مكونات شيء ما لجعله أبسط أو أكثر قابلية للتطبيق. بدلا من ذلك قد تخفي مكونات معينة لتحقيق هدف مماثل.


  • يتيح لك التجريد التركيز على ما يفعله الكائن بدلاً من كيفية عمله
  • يعني التغليف إخفاء التفاصيل الداخلية أو الميكانيكا لكيفية عمل شيء ما.

كما هو الحال عندما تقود سيارة ، فأنت تعرف ما تفعله دواسة الوقود ولكنك قد لا تعرف العملية وراءها لأنها مغلفة.

دعوني أعطي مثالاً في C #. لنفترض أن لديك عددًا صحيحًا:

int Number = 5;
string aStrNumber = Number.ToString();

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


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

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

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

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

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

مثال -

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

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

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


مثال آخر:

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

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_;
}

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

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

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


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

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

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

كلاهما قويان. ولكن استخدام التجريد يتطلب مهارات أكثر من التغليف ، ولا تستطيع التطبيقات / المنتجات الأكبر البقاء مع التجريد.


من 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.


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

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

التغليف: يتعامل مع إخفاء البيانات الحساسة من clas وبالتالي خصخصة جزء منه. إنها طريقة لإبقاء بعض المعلومات خاصة لعملائها من خلال عدم السماح لها بالوصول إليها من الخارج.


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

Courtesy


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**

تركز معظم الإجابات هنا على OOP ولكن يبدأ التغليف قبل ذلك بكثير:

  • كل وظيفة هي encapsulation . في pseudocode:

    point x = { 1, 4 }
    point y = { 23, 42 }
    
    numeric d = distance(x, y)
    

    هنا ، تقوم distance بتغليف حساب distance (Euclidean) بين نقطتين في المستوى: فهي تخفي تفاصيل التنفيذ. هذا هو التغليف ، نقية وبسيطة.

  • Abstraction هو عملية التعميم : اتخاذ تنفيذ ملموس وجعلها قابلة للتطبيق على أنواع مختلفة من البيانات ، وإن كانت ذات صلة إلى حد ما. المثال الكلاسيكي للتجريد هو وظيفة qsort 's qsort لفرز البيانات:

    الشيء الذي يتعلق بـ qsort هو أنه لا يهتم بالبيانات التي يقوم qsort - في الواقع ، لا يعرف البيانات التي يتم qsort . بدلاً من ذلك ، فإن نوع الإدخال الخاص به هو مؤشر بدون واقي ( void* ) وهو مجرد أسلوب C للقول "لا أهتم بنوع البيانات" (يُطلق على ذلك أيضًا نوع المسح). النقطة المهمة هي أن تنفيذ qsort يبقى دائماً كما هو ، بغض النظر عن نوع البيانات. الشيء الوحيد الذي يجب تغييره هو وظيفة المقارنة ، والتي تختلف من نوع البيانات إلى نوع البيانات. لذا ، يتوقع qsort أن يقوم المستخدم بتوفير وظيفة المقارنة المذكورة كوسيطة دالة.

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

class point {
    numeric x
    numeric y
}

إننا نلخص تنسيق النقطة ، ولكننا لا نستخلصها ماديًا ، بخلاف تجميعها منطقيًا.

وهنا مثال على التجريد وهذا ليس التغليف:

T pi<T> = 3.1415926535

هذا هو متغير pi بقيمة معينة (π) ، ولا يهتم التصريح بالنوع الدقيق للمتغير. باعتراف الجميع ، سأكون مضطرا للعثور على شيء من هذا القبيل في الكود الحقيقي: التجريد يستخدم دائما التغليف. ومع ذلك ، فإن الموجود أعلاه موجود بالفعل في C ++ (14) ، عبر نماذج متغيرة (= قوالب عامة للمتغيرات) ؛ مع بناء أكثر تعقيدًا بعض الشيء ، على سبيل المثال:

template <typename T> constexpr T pi = T{3.1415926535};

يضع التغليف بعض الأشياء في صندوق ويعطيك ثقبًا ؛ هذا يبقيك من التلويث مع التروس.

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

أمثلة من التغليف:

  • سراويل تحتية
  • الأدوات
  • محفظة نقود
  • حقيبة يد
  • كبسولة
  • الكربونات المجمدة
  • مربع ، مع أو بدون زر على ذلك
  • بوريتو (تقنيا ، تورتيلا حول بوريتو)

أمثلة على التجريد:

  • "مجموعات الأشياء" هي فكرة مجردة (والتي نسميها التجميع)
  • "الأشياء التي تحتوي على أشياء أخرى" هي فكرة مجردة (والتي نسميها التركيب)
  • "الحاوية" هي نوع آخر من "الأشياء التي تحتوي على أشياء أخرى" تجريد ؛ لاحظ أن جميع أمثلة التغليف هي أنواع من الحاويات ، ولكن ليس كل الحاويات تعرض / توفر التغليف. فالسلة ، على سبيل المثال ، هي حاوية لا تغلف محتوياتها.

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

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


abstraction is hiding non useful data from users and encapsulation is bind together data into a capsule (a class). I think encapsulation is way that we achieve abstraction.


يعني Encapsulation إخفاء البيانات مثل استخدام أداة getter و setter إلخ.

يعني Abstraction - إخفاء التنفيذ باستخدام الطبقة التجريدية والواجهات وما إلى ذلك.


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

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


Abstraction Encapsulation باستخدام مثال واحد عام

-------------------------------------------------- -------------------------------------------------- --------------------------------

كلنا نستخدم آلة حاسبة لحساب المشاكل المعقدة!


Encapsulation (Binding data and Code)

  • Encapsulation is the mechanism that binds together code and the data it manipulates, and keeps both safe from outside interference and misuse.

  • In an object-oriented language, code and data may be combined in such a way that a self-contained "black box" is created. When code and data are linked together in this fashion, an object is created. In other words, an object is the device that supports encapsulation.

  • Encapsulation leads to the concept of data hiding, but the concept of encapsulation must not be restricted to information hiding.

  • Encapsulation clearly represents the ability to bundle related data and functionality within a single, autonomous entity called a class.

Abstraction (Hiding how data stored and Hiding how function is implemented)

  • Data abstraction is a process of representing the essential features without including implementation details.

  • Abstraction is one of the most powerful and vital features provided by object-oriented programming.

  • The main idea behind data abstraction is to give a clear separation between properties of data type and the associated implementation details. This separation is achieved in order that the properties of the abstract data type are visible to the user interface and the implementation details are hidden.

  • Abstraction is separating the logical properties from implementation details. For example driving the car is a logical property and design of the engine is the implementation detail.


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

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

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


Abstraction : Abstraction means to show What part of functionality.

Encapsulation : Encapsulation means to hide the How part of the functionality.

Lets take a very simple example

/// <summary>
/// We have an Employee class having two properties EmployeeName and EmployeeCode
/// </summary>
public class Employee
{
    public string EmplpyeeName { get; set; }
    public string EmployeeCode { get; set; }

    // Add new employee to DB is the main functionality, so are making it public so that we can expose it to external environment
    // This is ABSTRACTION
    public void AddEmployee(Employee obj)
    {
        // "Creation of DB connection" and "To check if employee exists" are internal details which we have hide from external environment
        // You can see that these methods are private, external environment just need "What" part only
        CreateDBConnection();
        CheckIfEmployeeExists();
    }


    // ENCAPLUSATION using private keyword
    private bool CheckIfEmployeeExists()
    {
        // Here we can validate if the employee already exists
        return true;
    }

    // ENCAPLUSATION using private keyword
    private void CreateDBConnection()
    {
        // Create DB connection code
    }
}

Program class of Console Application

class Program
{
    static void Main(string[] args)
    {
        Employee obj = new Employee();
        obj.EmplpyeeName = "001";
        obj.EmployeeCode = "Raj";

        // We have exposed only what part of the functionality
        obj.AddEmployee(obj);
    }
}

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

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 . -> التجريد.


التجريد: فكرة تقديم شيء بطريقة مبسطة / مختلفة ، والتي يكون من الأسهل فهمها أو استخدامها أو أكثر صلة بالموقف.

فكر في فصل يرسل بريدًا إلكترونيًا ... يستخدم التجريد ليعرض نفسه لك كنوع من الفتى ، لذلك يمكنك الاتصال بالبريد الإلكتروني المرسل (إرسال ، مستلم). ما يفعله بالفعل - يختار POP3 / SMTP ، خوادم استدعاء ، ترجمة MIME ، إلخ ، يتم تلخيصها بعيداً. ترى فقط فتى الرسول الخاص بك.

التغليف: فكرة تأمين وإخفاء البيانات والأساليب الخاصة بكائن ما. إنها تتعامل أكثر مع صنع شيء مستقل ومضاد.

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

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

كل هذا يجعل العالم مكانًا أفضل للعيش فيه: د


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

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**

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.


الاختلافات بين isinstance() type() في بايثون؟

نوع التحقق مع

isinstance(obj, Base)

يسمح لحالات من الفئات الفرعية والعديد من القواعد الممكنة:

isinstance(obj, (Base1, Base2))

في حين أن نوع التحقق مع

type(obj) is Base

يدعم فقط النوع المشار إليه.

ك sidenote ، من المرجح أن يكون أكثر ملاءمة من

type(obj) == Base

لأن الطبقات هي مفردات.

تجنب التحقق من النوع - استخدم تعدد الأشكال (كتابة البطة)

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

def function_of_duck(duck):
    duck.quack()
    duck.swim()

إذا كان الرمز أعلاه يعمل ، يمكننا الافتراض أن حجتنا هي بطة. وبالتالي يمكننا أن نمرر في أشياء أخرى الأنواع الفرعية الفعلية للبط:

function_of_duck(mallard)

أو التي تعمل مثل البط:

function_of_duck(object_that_quacks_and_swims_like_a_duck)

ورمزنا لا يزال يعمل.

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

لذا ، للإجابة على السؤال:

الاختلافات بين isinstance() type() في بايثون؟

اسمح لي أن أثبت الفرق:

type

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

def foo(data):
    '''accepts a dict to construct something, string support in future'''
    if type(data) is dict:
        # we're only going to test for dicts for now
        raise ValueError('only dicts are supported for now')

إذا حاولنا أن نمرر في dict عبارة عن فئة فرعية من dict (كما ينبغي أن نكون قادرين على ذلك ، إذا كنا نتوقع أن يتبع رمزنا مبدأ استبدال Liskov ، يمكن استبدال هذا النوع الفرعي بأنواعه) فواصل الكود الخاص بنا !:

from collections import OrderedDict

foo(OrderedDict([('foo', 'bar'), ('fizz', 'buzz')]))

يثير خطأ!

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in foo
ValueError: argument must be a dict

isinstance

ولكن إذا كنا نستخدم isinstance ، يمكننا دعم استبدال Liskov!:

def foo(a_dict):
    if not isinstance(a_dict, dict):
        raise ValueError('argument must be a dict')
    return a_dict

foo(OrderedDict([('foo', 'bar'), ('fizz', 'buzz')]))

إرجاع OrderedDict([('foo', 'bar'), ('fizz', 'buzz')])

فئات أساسية مجردة

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

from collections import Mapping

def foo(a_dict):
    if not isinstance(a_dict, Mapping):
        raise ValueError('argument must be a dict')
    return a_dict

استنتاج

لذلك بما أننا نريد دعم استبدال الفئات الفرعية ، في معظم الحالات ، نريد تجنب التحقق من type باستخدام type isinstance التحقق من النوع مع isinstance - ما لم تكن بحاجة إلى معرفة الدرجة الدقيقة للمثيل.







oop encapsulation abstraction