الكائن (Object) [1] في علوم الحاسوب، هو أي شيء يمكن التعامل معه بواسطة أوامر لغات البرمجة، مثل القيمة value أو المتغير variable أو الدالة function أو هيكل البيانات data structure. معنى أن كلمة كائن تشير إلى أي كائن حي أو غير حي مثل الإنسان أو السيارة، وهذا الكائن في لغة البرمجة في الحواسيب يمكن إنشائه أو العمل به بواسطة الأكواد البرمجية مثل عمل نافذة window مستكشف الملفات بخصائص جديدة كإضافة لون مختلف لها ووضع قائمة تحرير Edit إضافية في أعلاها. ولكي يتم التغير يجب أن يكون لدينا ما يسمى كلاس Class وهو القالب الرئيسي الذي يتم إستنساخ شكل الناقذه الجديده منه، وهذه النافذة الجديدة هي الكائن الجديد object. ومع طرح البرمجة الشيئية object-oriented programming، أصبحت نفس الكلمة object تشير لشكل معين من أشكال الفئات classes.
البرمجة الموجهة بالكائنات
في مجال البرمجة الموجهة بالكائنات، يُنظر للكائن كمجموعة من الخصائص properties (عناصر الكائن) والسلوكيات behaviors (الدوال الفرعية subroutines) التي تغلف كيان معين. وعليه، بينما نرى أن أنواع البيانات البدائية primitive data أو البسيطة عبارة عن معلومات وحيدة، نجد الكائنات في البرمجة الموجهة بالكائنات عبارة عن أنواع معقدة تحمل معلومات متعددة، وخصائص معينة (أو بالإنجليزية: attributes). وبدلاً من الاكتفاء بتعيين قيمة لها (مثل int=10)، يتم بناءها وإنشاءها construction. وفي العالم الواقعي، إذا كان مسدس معين (لنفترض أنه من النوع Colt 45) يمثل كائنًا، لتم تحديد خصائصه المادية ووظيفته في (إطلاق النار) كُلُّ على حده. وبمجرد أن يتم تحديد خصائص هذا الكولت 45 "الكائن" إلى فئة معينة class (سنطلق على هذه الفئة اسم "مسدس") ، عندئذ من الممكن نسخ هذا المسدس إلى ما لا نهاية لإنشاء كائنات مطابقة له لها نفس الشكل والوظيفة. وفي مثال آخر، يُمثل الحيوان فئة أعلى superlcass من الفقاريات، والفقاريات تمثل فئة أعلى من الكائنات البشرية، سيكون أفراد مثل "أحمد كمال" أو "سمير رمضان" أمثلة أو ‘كائنات’ خاصة من الفئة البشرية، ومن ثم تحمل كافة خصائص الفئة البشرية (وبالتالي تحمل خصائص الفقاريات والحيوانات كذلك). وتعد "الكائنات" هي أساس البرمجة الموجهة بالكائنات، وهي تمثل أنواع رئيسية من البيانات في لغات البرمجة الموجهة بالكائنات. وهذه اللغات تقدم دعماً تركيبيًا syntactic ودلاليًا semantic لعملية مناولة الكائنات، ويشمل هذا الدعم النظام الهرمي hierarchical type system، والتنويت الخاص لإعلان واستدعاء المناهج methods، والوسائل لإخفاء حقول مُختارة من المبرمجين العملاء. ورغم ذلك، يمكن تطبيق الكائنات والبرمجة الموجهة بالكائنات في أي لغة من لغات البرمجة. وتُستخدم الكائنات في تطوير البرمجيات لتطبيق هياكل بيانات تجريدية، وذلك من خلال جمع مكوّنات البيانات مع الإجراءات الخاصة بالتعامل معها. وتمثل الكائنات في البرمجة الموجهة بالكائنات شيئاً رئيسيًا في مفهوم الوراثة inheritance؛ ومن ثم فهي تحسن من موثوقية البرنامج , وتبسّط عملية صيانة البرمجيات , وإدارة المكتبات libraries، وتقسيم العمل في فرق المبرمجين. وتُصمم لغات البرمجة الموجهة بالكائنات بصفة عامة لاستثمار وتعزيز هذه المزايا المحتملة لنموذج الكائنات. كما تستطيع الكائنات كذلك أن تجعل من الممكن مناولة كائنات شديدة التباين عن بعضها من خلال نفس النص (الكود) البرمجي، طالما أن كلها يملك الوسيلة المناسبة.
خصائص الكائن
ثمة ثلاث خصائص تسم الكائنات:
- الهوية identity: وهي الخاصية التي تميّز الكائن عن غيره من الكائنات الأخرى
- الحالة state: وهي تصف البيانات المودعة في الكائن
- السلوك behavior: ويصف الطرق في واجهة الكائن التي يمكن من خلالها استخدام الكائن
آلية الكائن
تم طرح المفهوم الحديث لـ "الكائنات" وأسلوب التوجيه بالكائنات في البرمجة بواسطة لغة Simula التي صدرت في عام 1967، والتي نُشر استخدامها Smalltalk بعدها بعامين في 1969، وأصبحت وسائل رئيسية في عالم البرمجة مع انتشار برنامج الـ سي++ والذي صدر في عام 1983. وفي الأسلوب "البحت" للبرمجة الموجهة بالكائنات، يجب الدخول لحقول البيانات الخاصة بالكائن فقط من خلال المناهج (الدّوال الفرعية). وتجعل هذه القاعدة من السهل ضمان بقاء البيانات دوماً في حالة صالحة. ومن الناحية التركيبية syntactic، وفي كافة لغات البرمجة الموجهة بالكائنات، يُستخدم مؤثر النقطة (dot operator) (والذي يوضع بين الكائن واسمه الرمزي) لاستدعاء دالة/منهج معين للكائن. فمثلاً، تأمل فئة حسابية تحمل اسم Arith_Class. هذه الفئة تتضمن دوال مثل add() و subtract() وmultiply() و divide()، تقوم بمعالجة رقمين يُعطيان لها. ويمكن استخدام هذه الفئة لإيجاد مجموع 78 و 69 وذلك في البداية عن طريق إنشاء كائن من الفئة ثم استدعاء طريقة الضرب، وذلك على النحو التالي:
1 int result = 1 ; // Initialization 2 arith_Obj1 = new Arith_Class(); // Creating a new object of Arith_Class 3 result = arith_Obj1.multiply(78,69); // returned value of multiply function, store in result variable.
وفي أي لغة يتم فيها إنشاء كائن من فئة معينة، يُطلق على هذا الكائن اسم تجسيد instance لهذه الفئة. فإذا كان لكل كائن نوع type، فإن أي كائنين من نفس الفئة سيكون لهما نفس نوع البيانات data type. ويشار لإنشاء أي نموذج من أي فئة عملية إنشاء تجسيد instantiating من الفئة. ومن الأمثلة الواقعية على الكائنات عبارة "كلبي" my dog، والتي تعد تجسيدًا لنوع (فئة) تُسمى "كلب"، وهي فئة فرعية subclass للفئة "حيوان". وفي حالة الكائنات متنوعة الشكل polymorphic، يمكن تجاهل بعض تفاصيل نوعها بشكل انتقائي. فمثلاً يمكن أن يُستخدم الكائن "كلب" بواسطة دالة تبحث عن "حيوان ما". ونفس الأمر ممكن مع "قطة"، نظرًا لأنها تنتمي أيضًا إلى الفئة "حيوان". ورغم أن الدخول عليها يتم كـ "حيوان"، فإن بعض الخصائص المعينة الخاصة بـ "الكلب" أو "القطة" ستظل غير متوافرة، مثل خاصية "الذيل"، نظرًا لأنه ليس كل الحيوانات لها ذيول. و ‘الشبح’ هو كائن ليس له إشارة مرجعية unreferenced في أي برنامج، ومن ثم فهو لا يخدم أي غرض. وفي اللغات التي تحمل خاصية تجميع القمامة (التخلص من الملفات الزائدة)، يقوم جامعة القمامة garbage collector، بتعليم مكان الذاكرة المشغول بالكائن على أنه خال، رغم أنه يظل حاملاً للبيانات الخاصة بالكائن لحين أن يشغل المكان كائن أخرى يقوم بالكتابة الفوقية overwriting عليه.
الكائنات المتخصصة
ثمة كائنات متخصصة مُعينة يمكن إنشاءها من خلال نمط التصميم Design pattern والتي تُستخدم لإنشائها، وعادة ما تتم تسمية هذه الكائنات على اسم أنماط تصميمها نفسها. وفيما يلي بعض المصطلحات الخاصة بالأنواع المتخصصة من الكائنات:
- الكائن المفرد singleton object: هو الكائن الذي يمثل التجسيد الأوحد لفئته أثناء فترة عمر البرنامج.
- عامل دالّي functor (أو كائن دالّي function object): وهو كائن يحمل طريقة واحدة (في لغة الـ C++، تكون هذه الطريقة هي مؤثر الوظيفة أو operator() والتي تعمل على غرار الدوال (مثل مؤشرات الدوال في لغات الـ C/C++).
- الكائن الثابت immutable object: وهو كائن تم بناءه على حالة ثابتة معينة عند إنشاءه ولا يتغير بعدها.
- كائن من الفئة الأولى first-class object: وهو كائن يمكن استخدامه بدون قيود.
- حاوي container: وهو كائن يمكن أن يحتوي كائنات أخرى.
- كائن مصنع factory object: وهو كائن غرضه إنشاء كائنات أخرى.
- ميتاكائن metaobject: هو كائن يمكن منه إنشاء كائنات أخرى (قارن مع الفئة class، والتي لا تكون كائنًا بالضرورة).
- نموذج أولي prototype: وهو ميتاكائن متخصص يمكن منه إنشاء الكائنات الأخرى من خلال النسخ.
- كائن إلهي النوع God object: وهو كائن يعرف الكثير جدًا أو يفعل الكثير جدًا. والكائن الإلهي يُعد مثالاً على نمط معاكس anti-pattern.
- كائن مُرشِّح filter object
الكائنات في الحوسبة الموزّعة
يمكن نقل تعريف الكائن باعتباره كيان يحمل هوية وحالة وسلوك مميز، وبجانب مبدأ التغليف encapsulation، إلى مجال الحوسبة الموزّعة. ومن التناقضات أن التغليف لا يمتد ليشمل سلوك الكائنات نظرًا لأنها (أو حتى أسماء المناهج الخاصة بها) لا تحمل أرقام تسلسلية serials بجانب البيانات. وقد اقتُرح وضع عدد من التوسعات للمفهوم الأساسي للكائن والتي تتقاسم هذه الخصائص المشتركة التالية:
- الكائنات الموزّعة Distributed objects، هي كائنات "عاديّة" (أي كائنات بالمعنى المعتاد، أي ليست تابعة للبرمجة الموجهة بالكائنات) يتم نشرها في عدد من المواقع البعيدة المميّزة، وتتواصل من خلال تبادل الرسائل على الشبكة. ومن الأمثلة عليها خدمات الويب web services وكائنات الـ DCOM.
- كائنات البروتوكول protocol objects: وهي مكوّنات حزمة بروتوكولات protocol stack وتغلف الاتصالات الشبكية ضمن واجهة موجهة بالكائنات.
- الكائنات المنسوخة replicated objects هي مجموعات من الكائنات المُوزّعة (يطلق عليها النسخ replicas) والتي تقوم بتشغيل بروتوكول موزًع متعدد الأطراف لتحقيق درجة عالية من الاتساق بين حالاتها الداخلية، والتي تستجيب للاستفسارات البرمجية بشكل مُنسّق. والإشارة إلى مجموعة النسخ مجتمعة بأنها (كائن) أمر يعكس حقيقة أن التفاعل مع أيّ منها يكشف نفس الحالة والسلوك المرئي خارجيًا. وتشمل الأمثلة على ذلك كائنات الـ CORBA المتحملة للعيوب.
- الكائنات الموزّعة الحيّة live distributed objects، وهي تعمم مفهوم (الكائنات المنسوخة)[2] على مجموعات النسخ التي قد تستخدم داخليًا أي بروتوكولات موزّعة، وبما ينجم عنه مجرد اتساق ضعيف بين حالاتها المحلية.
وبعض هذه الامتدادات، مثل الكائنات الموزّعة distributed objects وكائنات البروتوكول protocol objects، هي مصطلحات محدودة بنطاق معين وذلك لأنواع خاصة من الكائنات "العادية" المُستخدمة في سياق معين (مثل الاستدعاء عن بعد remote invocation وتركيب البروتوكول protocol composition). فيما كائنات أخرى، مثل الكائنات المنسوخة والكائنات الموزّعة الحيّة، تأتي أكثر انحرافًا عن المعايير، وذلك من حيث أنها تتخلى عن فرضية أن الكائن يسكن موقع معين في لحظة معينة، وتطبق مفهوم الجماعات على الكيانات (النُسخ) التي قد تسكن مواقع متعددة، وليس لها سوى حالة ضعيفة الاتساق، وعضويتها قد تتغير ديناميكيًا.
الكائنات والويب الدلالي
يرى البعض إمكانية النظر للويب الدلالي semantic web كإطار من كائنات البيانات المُوزّعة، ومن ثم كإطار موجهه بالكائنات.[3][4] بيد أن الكائنات الموزعة تُعتبر كائنات "عادية" وليس كائنات موجهة بالكائنات لأنها منفصلة عن مناهجها methods التي سبق وأن غُلفّت معها في السابق. كما يقال كذلك أنه من المناسب استخدام مخطط لغة نمذجة محددة (UML) للتعبير عن رسم ويب دلالي. وكلا من الويب الدلالي والبرمجة الموجّهة بالكائنات تحمل:
- فئات class
- خصائص attributes (تُعرف كذلك بـ ‘العلاقات’ relationships)
- التجسدات instances
وفوق ذلك، تطرح البيانات المرتبطة Linked Data أيضًا مُعرّفات الموارد الموحدة القابلة للإحالة المرجعية Dereferenceable Uniform Resource Identifiers، والتي توفر البيانات حسب الإحالات المرجعية data-by-reference والموجودة في البرمجة الموجهة بالكائنات وقواعد البيانات المُوجّهة بالكائنات على هيئة مُعرّفات كائنات.
المراجع
- "ما ترجمة object oriented programming". مؤرشف من الأصل في 11 أكتوبر 2016.
- Ostrowski, K., Birman, K., Dolev, D., and Ahnn, J. (2008). "Programming with Live Distributed Objects", Proceedings of the 22nd European Conference on Object-Oriented Programming, Paphos, Cyprus, July 07 - 11, 2008, J. Vitek, Ed., Lecture Notes In Computer Science, vol. 5142, Springer-Verlag, Berlin, Heidelberg, 463-489, http://portal.acm.org/citation.cfm?id=1428508.1428536.
- Knublauch, Holger; Oberle, Daniel; Tetlow, Phil; Evan (2006-03-09). "A Semantic Web Primer for Object-Oriented Software Developers". رابطة الشبكة العالمية. مؤرشف من الأصل في 6 يناير 201830 يوليو 2008.
- Connolly, Daniel (2002-08-13). "An Evaluation of the World Wide Web with respect to Engelbart's Requirements". رابطة الشبكة العالمية. مؤرشف من الأصل في 20 أبريل 201930 يوليو 2008.
وصلات خارجية
- What Is an Object? from The Java Tutorials