توفر معظم لغات OO الشائعة أداة مثل المعدل للوصول إلى أسلوب أو حقل. وهذا أمر جيد للمبرمجين ذوي الخبرة ، ولكن هذا ليس المكان الذي يجب أن نبدأ به مع التغليف. أدناه سوف أشرح لماذا.
تنويه. هذه المقالة ليست دعوة للعمل ولا تنص على أن هناك الطريقة الصحيحة الصحيحة لإخفاء البيانات. تهدف هذه المقالة إلى تزويد القارئ بمنظور جديد محتمل حول التغليف. هناك العديد من المواقف التي تكون فيها معدّلات الوصول مفضلة ، لكن هذا ليس سبباً للصمت حيال الواجهات.
بشكل عام ، يتم تعريف التغليف على أنه وسيلة لإخفاء التنفيذ الداخلي لكائن ما من عميل من أجل الحفاظ على سلامة الكائن وإخفاء تعقيد هذا التطبيق الداخلي للغاية.
هناك عدة طرق لتحقيق هذا الإخفاء. أحدهما هو استخدام معدّلات الوصول ، والآخر هو استخدام الواجهات (البروتوكولات ، ملفات الرأس ، ...). هناك ميزات أخرى صعبة ، لكن المقالة لا تتعلق بها.
قد تبدو معدِّلات الوصول للوهلة الأولى أكثر قوة فيما يتعلق بإخفاء التطبيق ، حيث إنها تتيح التحكم في كل حقل على حدة وإعطاء المزيد من خيارات الوصول. في الواقع ، هذا جزء من اختصار لإنشاء واجهات متعددة للفصل. توفر معدّلات الوصول فرصًا لا تتعدى الواجهات ، لأنها تعبر عن نفسها باستثناء تفصيل واحد. عنها أدناه.
يشار إلى رؤية الحقل بواسطة معدّلات وصول مختلفة في Java.يعرض مقتطف الشفرة أدناه فئة ذات معدّلات وصول إلى الأساليب والتمثيلات المكافئة في شكل واجهات.
public class ConsistentObject { public void methodA() { } protected void methodB() { } void methodC() { } private void methodD() { } } public interface IPublicConsistentObject { void methodA() { } } public interface IProtectedConsistentObject: IPublicConsistentObject { void methodB() { } } public interface IDefaultConsistentObject: IProtectedConsistentObject { void methodC() { } }
البروتوكولات لها العديد من المزايا. يكفي أن نذكر أن هذه هي الوسيلة الرئيسية لتنفيذ تعدد الأشكال في OOP ، والتي تصل إلى القادمين الجدد في وقت متأخر أكثر مما يمكن.
الصعوبة الوحيدة في التعامل مع البروتوكولات هي أنك تحتاج إلى التحكم في عملية إنشاء الكائنات. يلزم إنشاء قوالب بدقة لحماية الشفرة الخطرة التي تحتوي على أنواع محددة من الشفرة الخالصة التي تعمل مع الواجهات. مع مراعاة هذه القاعدة البسيطة ، نحصل على نفس التغليف مثل استخدام التصفيات ، لكن في الوقت نفسه نحصل على مزيد من المرونة.
مثل هذا الرمز في C #
public class DataAccessObject { private void readDataFromFixedSource() {
سوف يكون معادلا لقدرات العميل.
public class DataAccessObjectFactory { public IDataAccessObject createNew() { return new DataAccessObject(); } } public interface IDataAccessObject { byte[] getData(); } class DataAccessObject: IDataAccessObject { void readDataFromFixedSource() {
نظرًا لوجود معدّلات الوصول ، لن يعرف المبتدئين عن الواجهات لفترة طويلة جدًا. ولهذا السبب ، لا يستخدمون القوة الحقيقية لمنظمة التحرير الفلسطينية. وهذا هو ، هناك بعض استبدال المفاهيم. تعد معدّلات الوصول سمة بدون شك من سمات OOP ، ولكنها أيضًا تسحب البطانية من الواجهات التي تفتح OOP بقوة أكبر.
علاوة على ذلك ، تجعلك الواجهات تختار بوعي الميزات التي يمكن للعميل الحصول عليها من كائن. بمعنى ، لدينا الفرصة لتوفير بروتوكولات غير مرتبطة تمامًا لعملاء مختلفين ، بينما لا تميز المعدلات بين العملاء. هذا هو زائد كبيرة لصالح واجهات.