टाइप इंट्रोस्पेक्शन

From Vigyanwiki

कम्प्यूटिंग में, टाइप इंट्रोस्पेक्शन प्रोग्राम की रन टाइम पर (प्रोग्राम जीवनचक्र चरण) किसी ऑब्जेक्ट(कंप्यूटर विज्ञान) के डेटा प्रकार या गुणों की 'जांच' करने की क्षमता है। कुछ प्रोग्रामिंग भाषाओं में यह क्षमता होती है।

इस प्रकार से इंट्रोस्पेक्शन को प्रतिबिंब (कंप्यूटर प्रोग्रामिंग) के साथ भ्रमित नहीं होना चाहिए, जो एक चरण आगे जाता है और प्रोग्राम के लिए रनटाइम पर किसी ऑब्जेक्ट के मानों, मेटाडेटा, गुणों और कार्यों में 'अन्तःक्षेप' करने की क्षमता है। अतः कुछ प्रोग्रामिंग भाषाओं में भी वह क्षमता होती है (जैसे, जावा (प्रोग्रामिंग भाषा), पायथन (प्रोग्रामिंग भाषा), जूलिया (प्रोग्रामिंग भाषा), और गो (प्रोग्रामिंग_भाषा)) आदि।

उदाहरण

रूबी

इस प्रकार से टाइप इंट्रोस्पेक्शन रूबी (प्रोग्रामिंग भाषा) की प्रमुख विशेषता है। रूबी में, ऑब्जेक्ट क्लास (प्रत्येक क्लास का पूर्वज) इंस्टेंस की क्लास चेक करने के विधि Object#instance_of? और Object#kind_of? विधि प्रदान करता है। अतः उत्तरार्द्ध ट्रू हो जाता है जब संदेश भेजा गया विशेष उदाहरण प्रश्न में क्लास के वंशज का उदाहरण होता है। इस प्रकार से उदाहरण के लिए, निम्नलिखित उदाहरण कोड पर विचार करें (आप इसे तुरंत इंटरएक्टिव रूबी शैल के साथ इसे तुरंत प्रयास कर सकते हैं):

$ irb
irb(main):001:0> A=Class.new
=> A
irb(main):002:0> B=Class.new A
=> B
irb(main):003:0> a=A.new
=> #<A:0x2e44b78>
irb(main):004:0> b=B.new
=> #<B:0x2e431b0>
irb(main):005:0> a.instance_of? A
=> true
irb(main):006:0> b.instance_of? A
=> false
irb(main):007:0> b.kind_of? A
=> true

इस प्रकार से उपरोक्त उदाहरण में, {{code|Class}रूबी में किसी अन्य क्लास के रूप में } क्लास का उपयोग किया जाता है। अतः दो क्लास बनाए गए हैं, A और B, पूर्व बाद वाले का सुपरक्लास है, फिर प्रत्येक क्लास के उदाहरण की जाँच की जाती है। इस प्रकार से अंतिम अभिव्यक्ति ट्रू है क्योंकि A, b के क्लास का एक सुपरक्लास है।

इसके अतिरिक्त, आप प्रत्यक्षतः किसी ऑब्जेक्ट के क्लास के लिए पूछ सकते हैं, और उनकी तुलना कर सकते हैं (अतः नीचे दिए गए कोड को ऊपर दिए गए कोड को निष्पादित करने के लिए मान लिया गया है):

irb(main):008:0> A.instance_of? Class
=> true
irb(main):009:0> a.class
=> A
irb(main):010:0> a.class.class
=> Class
irb(main):011:0> A > B
=> true
irb(main):012:0> B <= A
=> true


उद्देश्य-सी

इस प्रकार से उद्देश्य सी में, उदाहरण के लिए, जेनेरिक ऑब्जेक्ट और एनएसओब्जेक्ट दोनों (कोको (एपीआई)/ओपनस्टेप में) विधि (कंप्यूटर विज्ञान) isMemberOfClass: प्रदान करते हैं, जो ट्रू लौटाता है यदि विधि का तर्क निर्दिष्ट क्लास का उदाहरण है। अतः प्रक्रिया isKindOfClass: यदि निर्दिष्ट क्लास से तर्क प्राप्त होता है तो समान रूप से ट्रू लौटाता है।

इस प्रकार से उदाहरण के लिए, मान लें कि हमारे निकट Fruit से विरासत में मिला Apple और Orange क्लास है।

अब, eat विधि में हम लिख सकते हैं

- (void)eat:(id)sth {
    if ([sth isKindOfClass:[Fruit class]]) {
        // we're actually eating a Fruit, so continue
        if ([sth isMemberOfClass:[Apple class]]) {
            eatApple(sth);
        } else if ([sth isMemberOfClass:[Orange class]]) {
            eatOrange(sth);
        } else {
            error();
        }
    } else {
        error();
    }
}

इस प्रकार से अब जब eat को सामान्य ऑब्जेक्ट (an id) के साथ कॉल किया जाता है, तो फ़ंक्शन सामान्य ऑब्जेक्ट के प्रकार के आधार पर ठीक रूप से व्यवहार करेगा।

C++

इस प्रकार से C++ रन-टाइम प्रकार की सूचना (RTTI) टाइपिड और डायनामिक कास्ट कीवर्ड के माध्यम से प्रकार के इंट्रोस्पेक्शन का समर्थन करता है। अतः dynamic_cast}st अभिव्यक्ति का उपयोग यह निर्धारित करने के लिए किया जा सकता है कि कोई विशेष ऑब्जेक्ट किसी विशेष व्युत्पन्न क्लास की है या नहीं। इस प्रकार से उदाहरण के लिए:

Person* p = dynamic_cast<Person *>(obj);
if (p != nullptr) {
  p->walk();
}
typeid}आईडी ऑपरेटर std::type_info ऑब्जेक्ट को पुनः प्राप्त करता है जो किसी ऑब्जेक्ट के सबसे व्युत्पन्न प्रकार का वर्णन करता है:
if (typeid(Person) == typeid(*obj)) {
  serialize_person( obj );
}


ऑब्जेक्ट पास्कल

इस प्रकार से डेल्फी के मूल रिलीज के बाद से टाइप इंट्रोस्पेक्शन ऑब्जेक्ट पास्कल का भाग रहा है, जो विजुअल फॉर्म डिजाइन के लिए आरटीटीआई का भारी उपयोग करता है। ऑब्जेक्ट पास्कल में, सभी क्लास बेस टॉब्जेक्ट क्लास से उतरते हैं, जो मूलभूत आरटीटीआई कार्यक्षमता को लागू करता है। अतः आरटीटीआई उद्देश्यों के लिए प्रत्येक क्लास के नाम को कोड में संदर्भित किया जा सकता है; क्लास नाम पहचानकर्ता को क्लास के मेटाडेटा के सूचक के रूप में कार्यान्वित किया जाता है, जिसे घोषित किया जा सकता है और टीक्लास प्रकार के चर के रूप में उपयोग किया जा सकता है। इस प्रकार से भाषा में is ऑपरेटर सम्मिलित है, यह निर्धारित करने के लिए कि कोई वस्तु किसी दिए गए वर्ग से है या नहीं, एक as ऑपरेटर, एक टाइप-चेक टाइपकास्ट प्रदान करता है, और कई टीऑब्जेक्ट विधियाँ सम्मिलित हैं। गहन इंट्रोस्पेक्शन (क्षेत्रों और विधियों की गणना) पारंपरिक रूप से मात्र $M+ (एक प्राग्मा) स्थिति में घोषित वस्तुओं के लिए समर्थित है, सामान्यतः टीपरसिस्टेंट, और मात्र प्रकाशित अनुभाग में परिभाषित प्रतीकों के लिए है। अतः डेल्फ़ी 2010 ने इसे लगभग सभी प्रतीकों तक बढ़ा दिया था।

procedure Form1.MyButtonOnClick(Sender: TObject);
var
   aButton: TButton;
   SenderClass: TClass;
begin
   SenderClass := Sender.ClassType; //returns Sender's class pointer
   if sender is TButton then
   begin
      aButton := sender as TButton;
      EditBox.Text := aButton.Caption; //Property that the button has but generic objects don't
   end
   else begin
      EditBox.Text := Sender.ClassName; //returns the name of Sender's class as a string
   end;
end;


जावा

इस प्रकार से जावा में प्रकार इंट्रोस्पेक्शन का सबसे सरल उदाहरण instanceof[1] ऑपरेटर है। instanceof}of ऑपरेटर यह निर्धारित करता है कि क्या कोई विशेष ऑब्जेक्ट किसी विशेष क्लास (या उस क्लास के उपक्लास, या उस इंटरफ़ेस को लागू करने वाले क्लास) से संबंधित है। इस प्रकार से उदाहरण के लिए:

if (obj instanceof Person) {
    Person p = (Person)obj;
    p.walk();
}
java.lang.Class}ss[2] क्लास अधिक उन्नत इंट्रोस्पेक्शन का आधार है।

इस प्रकार से उदाहरण के लिए, यदि किसी ऑब्जेक्ट के वास्तविक क्लास को निर्धारित करना वांछनीय है (इसके अतिरिक्त कि क्या वह किसी विशेष क्लास का सदस्य है), Object.getClass() और Class.getName() उपयोग किया जा सकता है:

System.out.println(obj.getClass().getName());


पीएचपी

अतः पीएचपी में instanceof ऑपरेटर का उपयोग करके इंट्रोस्पेक्शन किया जा सकता है। इस प्रकार से उदाहरण के लिए:

if ($obj instanceof Person) {
    // Do whatever you want
}


पर्ल

इस प्रकार से पर्ल में ref और isa का उपयोग करके इंट्रोस्पेक्शन प्राप्त किया जा सकता है।

अतः हम निम्नलिखित क्लास और उनके संबंधित उदाहरणों का इंट्रोस्पेक्शन कर सकते हैं:

package Animal;
sub new {
    my $class = shift;
    return bless {}, $class;
}

package Dog;
use base 'Animal';

package main;
my $animal = Animal->new();
my $dog = Dog->new();

इनका उपयोग करते हुए:

print "This is an Animal.\n" if ref $animal eq 'Animal';
print "Dog is an Animal.\n" if $dog->isa('Animal');


मेटा-ऑब्जेक्ट प्रोटोकॉल

अतः पर्ल में अधिक शक्तिशाली इंट्रोस्पेक्शन मूस (पर्ल) ऑब्जेक्ट सिस्टम और Class::MOP मेटा-ऑब्जेक्ट प्रोटोकॉल का उपयोग करके प्राप्त किया जा सकता है;[3][4] इस प्रकार से उदाहरण के लिए, आप जाँच सकते हैं कि कि कोई दिए गए ऑब्जेक्ट X की भूमिका निभाती है या नहीं:

if ($object->meta->does_role("X")) {
    # do something ...
}

इस प्रकार आप उन सभी विधियों के पूर्ण रूप से योग्य नामों को सूचीबद्ध कर सकते हैं जिन्हें ऑब्जेक्ट पर लागू किया जा सकता है, साथ ही उन क्लास के साथ जिनमें उन्हें इस प्रकार से परिभाषित किया गया था:

for my $method ($object->meta->get_all_methods) {
    print $method->fully_qualified_name, "\n";
}


पायथन

अतः पायथन (प्रोग्रामिंग भाषा) में इंट्रोस्पेक्शन की सबसे सामान्य विधि किसी ऑब्जेक्ट की विशेषताओं का विवरण देने के लिए dir फंक्शन का उपयोग करना है। इस प्रकार से उदाहरण के लिए:

class Foo:
    def __init__(self, val):
        self.x = val

    def bar(self):
        return self.x
>>> dir(Foo(5))
['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__',
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__str__', '__weakref__', 'bar', 'x']

इसके अतिरिक्त, अंतर्निहित फंक्शन type और isinstance का उपयोग यह निर्धारित करने के लिए किया जा सकता है कि कोई ऑब्जेक्ट क्या है जबकि hasattr यह निर्धारित कर सकता है कि कोई ऑब्जेक्ट क्या करता है। इस प्रकार से उदाहरण के लिए:

>>> a = Foo(10)
>>> b = Bar(11)
>>> type(a)
<type 'Foo'>
>>> isinstance(a, Foo)
True
>>> isinstance(a, type(a))
True
>>> isinstance(a, type(b))
False
>>> hasattr(a, 'bar')
True


ActionScript (as3)

इस प्रकार से एक्शनस्क्रिप्ट में, फंक्शन flash.utils.getQualifiedClassName एकपक्षीय ऑब्जेक्ट के क्लास/प्रकार के नाम को पुनर्प्राप्त करने के लिए उपयोग किया जा सकता है।

// all classes used in as3 must be imported explicitly
import flash.utils.getQualifiedClassName;
import flash.display.Sprite;
// trace is like System.out.println in Java or echo in PHP
trace(flash.utils.getQualifiedClassName("I'm a String")); // "String"
trace(flash.utils.getQualifiedClassName(1)); // "int", see dynamic casting for why not Number
trace(flash.utils.getQualifiedClassName(new flash.display.Sprite())); // "flash.display.Sprite"

इस प्रकार से वैकल्पिक रूप से, ऑपरेटर is यह निर्धारित करने के लिए उपयोग किया जा सकता है कि कोई ऑब्जेक्ट किसी विशिष्ट प्रकार की है या नहीं:

// trace is like System.out.println in Java or echo in PHP
trace("I'm a String" is String); // true
trace(1 is String); // false
trace("I'm a String" is Number); // false
trace(1 is Number); // true

अतः इस दूसरे फ़ंक्शन का उपयोग वंशानुक्रम (वस्तु-उन्मुख प्रोग्रामिंग) माता-पिता के परीक्षण के लिए भी किया जा सकता है:

import flash.display.DisplayObject;
import flash.display.Sprite; // extends DisplayObject

trace(new flash.display.Sprite() is flash.display.Sprite); // true
trace(new flash.display.Sprite() is flash.display.DisplayObject); // true, because Sprite extends DisplayObject
trace(new flash.display.Sprite() is String); // false


मेटा-टाइप इंट्रोस्पेक्शन

इस प्रकार से पर्ल के जैसे, एक्शनस्क्रिप्ट क्लास का नाम प्राप्त करने से आगे बढ़ सकता है, परन्तु सभी मेटाडेटा, फ़ंक्शंस और अन्य अवयव जो flash.utils.describeType फंक्शन ऑब्जेक्ट का उपयोग करते हैं; अतः इसका उपयोग एक्शनस्क्रिप्ट में प्रतिबिंब (कंप्यूटर विज्ञान) लागू करते समय किया जाता है।

import flash.utils.describeType;
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;
import flash.display.Sprite;

var className:String = getQualifiedClassName(new flash.display.Sprite()); // "flash.display.Sprite"
var classRef:Class = getDefinitionByName(className); // Class reference to flash.display{{Not a typo|.}}Sprite
// eg. 'new classRef()' same as 'new  flash.display.Sprite()'
trace(describeType(classRef)); // return XML object describing type
// same as : trace(describeType(flash.display.Sprite));


यह भी देखें

संदर्भ


बाहरी संबंध