Showing posts with label हिन्दी. Show all posts
Showing posts with label हिन्दी. Show all posts

Thursday, October 31, 2024

JavaScript Callback function and Promise in JavaScript in Hindi

Question: जावास्क्रिप्ट function के पैरामीटर में कोई दूसरा function हो तो वह function कैसे और कब call होता है?
जावास्क्रिप्ट में, एक फ़ंक्शन के पैरामीटर के रूप में दूसरे फ़ंक्शन को पास करना एक common practice है, जिसे आमतौर पर कॉलबैक फ़ंक्शन कहा जाता है। जब आप एक फ़ंक्शन को कॉल करते हैं, तो आप उसे एक अन्य फ़ंक्शन (कॉलबैक) के रूप में पैरामीटर के रूप में दे सकते हैं, और यह उस फ़ंक्शन के अंदर किसी विशेष समय पर दूसरे फ़ंक्शन को कॉल किया जा सकता है।

उदाहरण
नीचे एक उदाहरण दिया गया है जिसमें एक फ़ंक्शन greet है जो एक कॉलबैक फ़ंक्शन callback को पैरामीटर के रूप में लेता है और इसे कुछ समय बाद कॉल करता है।

// कॉलबैक फ़ंक्शन
function sayHello() {
    console.log("Hello!");
}

// मुख्य फ़ंक्शन जो एक कॉलबैक फ़ंक्शन को पैरामीटर के रूप में लेता है
function greet(callback) {
    console.log("Greeting begins");
    
    // कुछ समय के बाद कॉलबैक फ़ंक्शन को कॉल करें
    setTimeout(function() {
        callback(); // यहाँ कॉलबैक फ़ंक्शन को कॉल किया गया है
    }, 2000); // 2 सेकंड का समय कॉलबैक फ़ंक्शन  call होगा 
}

// greet फ़ंक्शन को sayHello फ़ंक्शन के साथ कॉल करें
greet(sayHello);

कैसे काम करता है:
  1. कॉलबैक फ़ंक्शन (sayHello): यह एक साधारण फ़ंक्शन है जो "Hello!" संदेश को कंसोल में प्रदर्शित करता है।
  2. मुख्य फ़ंक्शन (greet): यह एक फ़ंक्शन है जो एक अन्य फ़ंक्शन को पैरामीटर के रूप में लेता है। यह पहले एक संदेश प्रिंट करता है और फिर setTimeout का उपयोग करते हुए 2 सेकंड बाद कॉलबैक फ़ंक्शन (callback) को कॉल करता है।
  3. greet(sayHello) कॉल: जब आप greet फ़ंक्शन को sayHello फ़ंक्शन के साथ कॉल करते हैं, तो greet फ़ंक्शन sayHello को पैरामीटर के रूप में लेता है। 2 सेकंड के बाद, sayHello फ़ंक्शन को कॉल किया जाता है, और "Hello!" कंसोल में प्रदर्शित होता है।

और उदाहरण:
आप विभिन्न परिदृश्यों में फ़ंक्शन के पैरामीटर के रूप में अन्य फ़ंक्शन का उपयोग कर सकते हैं। यहाँ एक और उदाहरण है जिसमें एक फ़ंक्शन डेटा को फ़िल्टर करता है:

// फ़िल्टर फ़ंक्शन
function filterArray(arr, callback) {
    let result = [];
    for (let item of arr) {
        if (callback(item)) { // कॉलबैक फ़ंक्शन का उपयोग
            result.push(item);
        }
    }
    return result;
}

// कॉलबैक फ़ंक्शन जो चेक करता है कि संख्या सम है या नहीं
function isEven(num) {
    return num % 2 === 0;
}

// एक एरे में से सम संख्याएँ फ़िल्टर करें
const numbers = [1, 2, 3, 4, 5, 6];
const evenNumbers = filterArray(numbers, isEven);
console.log(evenNumbers); // [2, 4, 6]
निष्कर्ष
जावास्क्रिप्ट में फ़ंक्शन के पैरामीटर में किसी दूसरे फ़ंक्शन को पास करना और उसे आवश्यक समय पर कॉल करना एक शक्तिशाली और लचीला तरीका है। इससे आप कोड को अधिक मॉड्यूलर और पुन: प्रयोज्य बना सकते हैं। कॉलबैक फ़ंक्शंस का उपयोग विशेष रूप से असिंक्रोनस प्रोग्रामिंग में, जैसे कि AJAX अनुरोध या टाइमर में, किया जाता है।

Thursday, November 4, 2021

C# Generics, its importance and dynamic keyword in Hindi

 


C# प्रोग्रामिंग के अंतर्गत जेनेरिक का उपयोग टाइप्सेफ प्रोग्रामिंग के लिए किया जाता है। हम जानते हैं कि C# एक टाइपसेफ प्रोग्रामिंग लैंग्वेज है परंतु C# एक बहुत ही लचीला प्रोग्रामिंग लैंग्वेज है जिसके कारण हम टाइप सेफ्टी के बिना भी कुछ स्थिति विशेष में प्रोग्रामिंग कर सकते हैं। उदाहरण के लिए C# के अंतर्गत System.Collections नेमस्पेस के भीतर जो विभिन्न प्रकार के क्लासेज जैसे ArrrayList, Hashtable हैं वे पूरी तरह टाइप्सेफ नहीं है। उदाहरण के लिए ArrayList और Hashtable के Add मेथड ऑब्जेक्ट टाइप के आइटम को add करते हैं। अतः यह पूरी तरह टाइपसेफ नहीं हैं। Syntax:

Add(Object item)

इसका मूल कारण यह है कि Add मेथड किसी ऑब्जेक्ट टाइप आइटम को add करने के लिए यूज किया जाता है। जैसा कि ऑब्जेक्ट किसी भी डाटाटाइप को रिप्रेजेंट करता है, अतः प्रोग्रामर द्वारा किसी भी डाटाटाइप के आइटम को Add मेथड के द्वारा ऐड किया जा सकता है। इससे टाइपसेफ्टी खत्म हो जाती है और यह टाइपसेफ्टी के दृष्टिकोण से एक बहुत बड़ी समस्या है। इसी समस्या को ध्यान में रखते हुए Generic की संकल्पना को C# में विकसित किया गया।

टाइपसेफ्टी के लिए C# के अंतर्गत जेनेरिक के लिए System.Collections.Generics नामक नेमस्पेस है। System.Collections.Generics नेमस्पेस के अंतर्गत ऐसे जेनेरिक क्लासेज हैं जो पूरी तरह टाइप्सेफ है। जैसे List<T>

यहाँ ब्रैकेट के बीच में T एक प्लेसहोल्डर का कार्य करता है जो बताता है की List क्लास किस प्रकार के डाटा को हैंडल करता है। प्रोग्रामर के द्वारा यह डाटाटाइप प्लेसहोल्डर में पास किया जाता है। जैसे List<int> यह इंगित करता है कि यह List क्लास केवल int डाटाटाइप के डाटा को हैंडल करता है।

जेनेरिक वस्तुतः एक ऐसी युक्ति है जो इसी क्लास, स्ट्रक्चर, मेथड, फील्ड, प्रॉपर्टी इत्यादि को एक ओर जहां Object टाइप की तरह टाइप की सामान्यता प्रदान करता है, वहीं दूसरी ओर यह टाइप्सेफ्टी भी प्रदान करता है। प्रोग्रामर जेनेरिक के टाइप को एक प्लेसहोल्डर की तरह यूज करता है और उस प्लेसहोल्डर को जो भी टाइप दिया जाता है वही टाइप उस जेनरिक का हो जाता है।

जेनेरिक का अभिप्राय ऐसे टाइप से है जो किसी खास टाइप का प्रतिनिधित्व नहीं करता हो बल्कि जेनेरिक टाइप ऐसा टाइप है जो प्रोग्रामर को यह सुविधा देता है कि वह किसी भी टाइप को ध्यान में रखते हुए जेनेरिक टाइप को यूज़ कर सकता है और तब जेनेरिक टाइप उस खास टाइप की तरह कार्य करने लगता है। यह बात हम आगे उदाहरण से स्पष्ट करेंगे।

यह भी बात याद रखने वाली है कि C# के अंतर्गत कोई क्लास, स्ट्रक्चर, इंटरफेस या क्लास का मेंबर जैसे फील्ड, प्रॉपर्टी, मेथड इत्यादि जेनेरिक हो सकता है। 

जेनेरिक क्लास और जेनेरिक मेथड के बारे में हम आगे सोदाहरण अध्ययन करेंगे।

सबसे पहले हम एक जेनेरिक क्लास का उदाहरण देखते हैं जिसके अंतर्गत एक जेनेरिक फील्ड Age यूज किया गया है। 

public class GenericClassA<T>

{

private T Age;

}

ध्यान दीजिए कि Age का डाटाटाइप T दिया गया है जो कि वास्तविक डाटाटाइप के लिए प्लेसहोल्डर का कार्य करता है। जेनेरिक क्लास को यूज करते समय प्रोग्रामर के द्वारा वास्तविक डाटाटाइप को प्लेसहोल्डर के भीतर दिया जाएगा। 

निम्नलिखित उदाहरण में Compare एक नन जेनेरिक मेथड है जबकि CompareG जेनेरिक मेथड है। जेनेरिक मेथड में पैरामीटर्स डाटाटाइप के प्लेसहोल्डरस है जबकि ननजेनेरिक मेथड का पैरामीटर Object डाटाटाइप का है। प्रोग्राम के कमेंट्स को ध्यान से पढ़िए और जेनेरिक मेथड और नन जेनेरिक मेथड के बीच के अंतर को समझें।

अब एक प्रश्न का उत्तर दीजिए- क्या जेनेरिक मेथड का रिटर्न टाइप जेनेरिक हो सकता है?

  
using System;

namespace GenericsDemo
{
    class GenericEx1
    {
        public bool Compare(Object a, Object b)
        {
            if (a.Equals(b))
                return true;
            return false;
        }
        public bool CompareG(T a, T b)
        {
            if (a.Equals(b))
                return true;
            return false;
        }
    }
}
using System;

namespace GenericsDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Before using generic method:");
            GenericEx1 obj = new GenericEx1();
            Console.WriteLine(obj.Compare(10, 10));
            Console.WriteLine(obj.Compare(10, 10.0));
            Console.WriteLine(obj.Compare(10, 12));
            Console.WriteLine("After using generic method with implicit type:");
            Console.WriteLine(obj.CompareG(10, 10)); // implicit type is int
            Console.WriteLine(obj.CompareG(10, 10.0)); // implicit type is double
            Console.WriteLine(obj.CompareG(10, 12)); // implicit type is int
            Console.WriteLine("After using generic method:");
            Console.WriteLine(obj.CompareG(10, 10)); // explicit type is int
            //Console.WriteLine(obj.CompareG(10, 10.0)); // explicit type is int, error as 2nd argument is not int
            Console.WriteLine(obj.CompareG(10, 12)); // explicit type is int
            Console.ReadKey();
        }
    }
}


© अजीत कुमार, सर्वाधिकार सुरक्षित।

इस आलेख को उद्धृत करते हुए इस लेख के लिंक का भी विवरण दें। इस आलेख को कॉपीराइट सूचना के साथ यथावत साझा करने की अनुमति है। कृपया इसे ऐसे स्थान पर साझा न करें जहाँ इसे देखने के लिए शुल्क देना पडे।

Saturday, August 14, 2021

An Introduction : Classic ASP in Hindi

वर्तमान तकनीकी युग में डॉट नेट टेक्नोलॉजी के अंतर्गत ASP.NET MVC और ASP.NET Core जैसे टेक्नोलॉजी का प्रयोग होता है जबकि एक जमाना था जब ASP टेक्नोलॉजी का उपयोग वेबसाइट बनाने में बहुत ज्यादा होता था। हम क्लासिक ASP के बारे में इस लेख में समझेंगे। आज भी क्लासिक ASP की बहुत सारी चीजे समझने लायक है। ASP पेज इंटरप्रेट किया जाता है जबकि asp.net के अंतर्गत वेब पेज का कंपाइलेशन होता है, हम इन सब चीजों को आगे देखेंगे, पहले हम ASP को समझते हैं।

इस लेख में हम क्लासिक ASP एक्टिव सर्वर पेज के बारे में समझेंगे कि एक्टिव सर्वर पेज वास्तव में कैसे काम करता है। एक्टिव सर्वर पेज एक आम एचटीएमएल पेज ही होता है लेकिन इसमें कुछ अतिरिक्त विशेषताएं होती है जिन विशेषताओं के कारण यह आम एचटीएमएल से कुछ ज्यादा है और इसका फ़ाइल एक्सटेंशन .asp होता है न कि .Html अथवा .htm

ASP के अंतर्गत तीन मुख्य विशेषताएं हैं, जो इस प्रकार है:
१) Server side scripts: ASP के भीतर सर्वर साइड स्क्रिप्ट होता है जो वेब सर्वर के भीतर रन होता है। इस कारण गत्यात्मक वेबपेज dynamic webpage बनाना सम्भव हो पाता है

२) Built-in Objects: ASP के भीतर कुछ बने बनाए ऑब्जेक्ट्स होते हैं जिन ऑब्जेक्ट्स का उपयोग कर हम विभिन्न प्रकार के इंफॉर्मेशन को एकत्र कर सकते हैं। उदाहरण के लिए, Request रिक्वेस्ट ऑब्जेक्ट का उपयोग कर हम यह जानकारी प्राप्त कर सकते हैं कि यूजर ने जब एचटीएमएल फॉर्म को पोस्ट किया तो उसमें क्या-क्या इंफॉर्मेशन भेजा है।

३) Components: ASP के अंतर्गत कुछ अतिरिक्त कॉम्पोनेंट्स होते हैं जिन कॉम्पोनेंट्स की वजह से ASP की उपयोगिता बढ़ जाती है। हम थर्ड पार्टी कंपोनेंट्स भी उपयोग कर सकते हैं अथवा हम अपना खुद भी कंपोनेंट्स बना सकते हैं। इस तरीके से ASP की क्षमता को बढ़ाया जा सकता है। कम्पोनेंट क्या होता है इसके बारे में हम आगे देखेंगे।

ASP शब्द के निहितार्थ
अब हम समझेंगे कि ASP शब्द का क्या निहित अर्थ है। देखिए, एक्टिव सर्वर का मतलब निकलता है कि सर्वर एक्टिव है। एक्टिव से तात्पर्य यह है कि सर्वर डायनेमिक कंटेंट बना सकता है। इसका अर्थ यह हुआ कि एचटीएमएल फाइल का कंटेंट/सामग्री प्रोग्रामेटिकली तैयार होगा ना कि वह स्टैटिक एचटीएमएल पेज होगा। स्थैतिक और गत्यात्मक html पेज के बारे में यह बात आगे स्पष्ट हो जाएगी। पढ़ना जारी रखें।

एक्टिव सर्वर पेज का मतलब है कि सर्वर के एक्टिव होने के कारण asp पेज एचटीएमएल पेज में डायनेमिक रूप से रूपांतरित हो जाए। अगर स्टैटिक एचटीएमएल पेज भेजना हो तो उसके लिए एक सर्वर को एक्टिव होने की जरूरत नहीं है, उसे कुछ ज्यादा नहीं करना है बस उसे अपने ड्राइव से वांछित स्टैटिक फाइल को सर्च कर निकालना है और ब्राउज़र को भेज देना जबकि डायनेमिक एचटीएमएल पेज के केस में वेब सर्वर को कुछ अतिरिक्त काम करना पड़ता है जिसकी वजह से उसकी एक्टिविटी बढ़ जाती है।( यह बात हम आगे समझेंगे। इसकी व्याख्या मैंने आगे की है। ) यही कारण है कि हम ASP सम्बंधित सर्वर को एक्टिव सर्वर कहते हैं। जब इस तरह के गत्यात्मक पेज को वेब सर्वर क्लाइंट को भेजता है तो ऐसे पेज को एक्टिव सर्वर पेज कहते हैं।

ASP का वेबसर्वर
आमतौर ASP के अंतर्गत IIS आईआईएस वेबसर्वर का उपयोग किया जाता है परंतु यह कोई जरूरत नहीं है कि हम आईआईएस वेब सर्वर का ही उपयोग करें, हम किसी अन्य वेब सर्वर का भी उपयोग करके ASP वेब एप्लीकेशन को बना सकते हैं। 

HTML पेज की प्रक्रिया
अब हम यह देखेंगे किसी HTML पेज को जब सर्वर द्वारा प्रस्तुत किया जाता है तो उसके कितने चरण है। आमतौर पर यह पांच चरणों में विभाजित किया जाता है जो निम्न प्रकार है।

१) प्रथम चरण: जब यूजर वेब ब्राउज़र के भीतर एड्रेस बार में किसी वेब पेज के लिए रिक्वेस्ट करता है तो वह एड्रेस बार में पूरा यूआरएल लिखता है। यूआरएल के बारे में हम आगे विस्तार से पढेंगे।

२) दूसरा चरण: जब ब्राउज़र उस रिक्वेस्ट को वेब पेज के लिए वेब सर्वर को भेजता है 

३) तीसरा चरण: वेब सर्वर उस रिक्वेस्ट को प्राप्त करता है और यह पहचान करता है कि यह रिक्वेस्ट किस तरह के एचटीएमएल फाइल के लिए आया है क्योंकि जब फाइल की रिक्वेस्ट की जाती है तो उसका एक्सटेंशन एचटीएम या एचटीएमएल होता है।

४) चौथा चरण: वेब सर्वर उचित प्रॉपर एचटीएमएल फाइल को सर्च कर प्राप्त कर अपने सर्वर के डिस्क या मेमोरी से निकालकर वापस ब्राउज़र को भेज देता है।

५) पांचवा चरण: वेब ब्राउज़र उस एचटीएमएल फाइल को इंटरप्रेट करता है और अंतिम रिजल्ट ब्राउज़र के विंडो में प्रदर्शित कर देता है।

ASP पेज की प्रक्रिया
अब हम यह देखेंगे किसी ASP पेज को जब सर्वर द्वारा प्रस्तुत किया जाता है तो उसके कितने चरण है। आमतौर पर यह आठ चरणों में विभाजित किया जाता है जो निम्न प्रकार है।

१) प्रथम चरण: जब यूजर वेब ब्राउज़र के भीतर एड्रेस बार में किसी वेब पेज के लिए रिक्वेस्ट करता है तो वह एड्रेस बार में पूरा यूआरएल लिखता है। यूआरएल के बारे में हम आगे विस्तार से पढेंगे।

२) दूसरा चरण: जब ब्राउज़र उस रिक्वेस्ट को वेब पेज के लिए वेब सर्वर IIS को भेजता है।

३) तीसरा चरण: वेब सर्वर उस रिक्वेस्ट को प्राप्त करता है और यह पहचान करता है कि यह रिक्वेस्ट किस तरह के ASP फाइल के लिए आया है क्योंकि जब फाइल की रिक्वेस्ट की जाती है तो उसका एक्सटेंशन .asp होता है।

४) चौथा चरण: वेब सर्वर प्रॉपर ASP फाइल को सर्च कर अपने सर्वर के डिस्क या मेमोरी से निकालता है।

५) पांचवा चरण: वेबसर्वर उस फ़ाइल को प्रोसेस करने के लिए एक खास प्रोग्राम ASP.dll को भेज देता है।

६) छठा चरण: वह प्रोग्राम उस फ़ाइल को इंटरप्रेट line by line करता है। और उसको एचटीएमएल में बदल देता है।

७) सातवें चरण: सर्वर उस एचटीएमएल फ़ाइल को वापस ब्राउज़र को भेज देता है।

५) आठवा चरण: वेब ब्राउज़र उस एचटीएमएल फाइल को इंटरप्रेट करता है और अंतिम रिजल्ट ब्राउज़र के विंडो में प्रदर्शित कर देता है।

नोट: जब भी ASP पेज में किसी प्रकार का परिवर्तन किया जाता है तो उसे दोबारा इंटरप्रेट करने के लिए सर्वर पर भेजा जाता है और सर्वर पर स्थित ASP.dll प्रोग्राम उसको दोबारा इंटरप्रेट करता है। जब भी पेज  में परिवर्तन होता है तो यह प्रक्रिया आमतौर पर होती है।

वेब सर्वर के लिए एचटीएमएल पेज और ASP पेज में बहुत बड़ा अंतर होता है। जब सर्वर से किसी एचटीएमएल पेज के लिए रिक्वेस्ट किया जाता है तो वह उस एचटीएमएल पेज को बिना प्रोसेस किए ब्राउज़र को भेज देता है जबकि इसके विपरीत किसी ASP पेज की रिक्वेस्ट सर्वर से की जाती है तो सर्वर उस ASP पेज को पूरा प्रोसेस कराता है और प्रोसेस करने के बाद उसे एचटीएमएल पेज में कन्वर्ट करके ब्राउज़र को भेज देता है। याद रखें कि ब्राउज़र HTML को ही समझता है। पेज में किसी भी प्रकार का स्क्रिप्ट हो उसको HTML में परिवर्तित करने के बाद ही ब्राउज़र को उपलब्ध कराया जाता है क्योंकि ब्राउज़र केवल HTML भाषा को ही समझता है।

ASP के भीतर आमतौर पर VBScript का उपयोग किया जाता है। हम किसी अन्य स्क्रिप्टिंग लैंग्वेज का प्रयोग भी ASP के अंतर्गत कर सकते हैं, जैसे JScript और PerlScript लेकिन आमतौर पर VBScript का उपयोग ASP के भीतर किया जाता है।

ASP में स्क्रिप्टिंग
ASP का एक्सटेंशन .asp होता है जैसा कि हमने पीछे देखा है। अब सवाल है कि इसमें कोडिंग कैसे की जाती है? आमतौर पर जो एचटीएमएल फाइल होता है उसमें केवल एचटीएमएल की कोडिंग होती है जबकि ASP फाइल के भीतर एचटीएमएल के साथ-साथ ASP के स्क्रिप्ट की कोडिंग होती है। जहां जहां ASP का स्क्रिप्ट यूज करना होता है उसके लिए हम स्क्रिप्ट डेलीमीटर का उपयोग करते हैं जो <% से शुरू होता है और %> से समाप्त होता है। स्क्रिप्टिंग डेलीमीटर के भीतर अगर हम किसी खास स्क्रिप्टिंग लैंग्वेज का उपयोग करना चाहते हैं तो हम लैंग्वेज डायरेक्टिव का उपयोग करते हैं।

<%@ Language=JScript %>

ASP के बिल्कुल टॉप में पहली लाइन में हम इस डायरेक्टिव का उपयोग करते हैं। ध्यान दीजिए कि हम डायरेक्टिव का उपयोग करने के लिए ऐड द रेट @ सिंबल का प्रयोग परसेंटेज % संकेत के बिल्कुल सटे हुए करते हैं।

जैसा कि हम जानते हैं कि किसी एचटीएमएल पेज के भीतर क्लाइंट साइड स्क्रिप्टिंग भी हो सकती है और सर्वर साइड भी। जब ASP के अंतर्गत सर्वर साइड स्क्रिप्टिंग करनी होती है तो इस <script> टैग के भीतर runat ="server" आट्रिब्यूट का प्रयोग करते हैं। इससे यह स्पष्ट होता है कि यह स्क्रिप्ट सर्वर पर रन होगा।

Output directive 
ASP के अंतर्गत किसी एक्सप्रेशन के मान को आउटपुट करने के लिए हम आउटपुट डायरेक्टिव का उपयोग करते हैं इस डायरेक्टर का उपयोग करने के लिए हमें script delimiter के starting delimiter के बाद बराबर का निशान देना होता है। <%=expression%>

ASP की क्षमता को बढ़ाने के लिए कई सारे बने बनाए ऑब्जेक्ट्स और कॉम्पोनेंट्स उपलब्ध है। हम जैसा कि जानते हैं कि ऑब्जेक्ट के मेथडस और प्रॉपर्टीज होते हैं जिनका उपयोग कर हम वांछित कार्य करते हैं।

Some in-built objects
नीचे हम ASP के ऑब्जेक्टस के बारे में बात करेंगे।

१) Application object एप्लीकेशन ऑब्जेक्ट

२) Request रिक्वेस्ट ऑब्जेक्ट 

३) Response रिस्पांस ऑब्जेक्ट

४) Server सर्वर ऑब्जेक्ट 

५) Session सेसन ऑब्जेक्ट 

६) Object Context ऑब्जेक्ट कॉन्टेक्स्ट ऑब्जेक्ट

जैसा कि हम जानते हैं कि किसी ऑब्जेक्ट के भीतर डाटा या इंफॉर्मेशन store होता है। अतः ऊपर दिए गए विभिन्न प्रकार के ऑब्जेक्ट्स के द्वारा हम किसी डाटा को या तो संचित store कर सकते हैं अथवा प्राप्त retrieve कर सकते हैं।

हम देखेंगे कि कि इन अलग-अलग ऑब्जेक्ट्स में किस तरह के डाटा को स्टोर किया जाता है।

Application object
एप्लीकेशन ऑब्जेक्ट का उपयोग इस तरह के इंफॉर्मेशन को स्टोर करने के लिए किया जाता है जिसको एप्लीकेशन के सभी प्रकार के यूजर के बीच साझा करना होता है। Application ऑब्जेक्ट एक बना बनाया ऑब्जेक्ट होता है, अतः इसको डेवलपर को क्रिएट नहीं करना पड़ता है।

Request object
जब ब्राउज़र के द्वारा इंफॉर्मेशन को सर्वर पर भेजा जाता है तो उस इंफॉर्मेशन या डाटा के बारे में जानकारी प्राप्त करने के लिए हम रिक्वेस्ट ऑब्जेक्ट का उपयोग करते हैं। Request Object ब्राउज़र के नाम, वर्शन इत्यादि की जानकारी को भी सर्वर पर भेजता है। Request ऑब्जेक्ट एक बना बनाया ऑब्जेक्ट होता है, अतः इसको डेवलपर को क्रिएट नहीं करना पड़ता है।

Response object
जब सर्वर के द्वारा इंफॉर्मेशन को ब्राउज़र के पास भेजा जाता है तो उस इंफॉर्मेशन के बारे में जानकारी प्राप्त करने के लिए हम रिस्पांस ऑब्जेक्ट का उपयोग करते हैं। उदाहरण के लिए जब सर्वर ब्राउज़र के पास कोई डेटा भेजता है और ब्राउज़र उस डाटा को डिस्प्ले करना चाहता है तो उसके लिए हम रिस्पांस ऑब्जेक्ट के Write मेंथड यूज करते हैं। Response ऑब्जेक्ट एक बना बनाया ऑब्जेक्ट होता है, अतः इसको डेवलपर को क्रिएट नहीं करना पड़ता है।

Server object
सर्वर ऑब्जेक्ट का उपयोग करके हम सर्वर के बारे में कई प्रकार की जानकारी प्राप्त कर सकते हैं उदाहरण के लिए सर्वर ऑब्जेक्ट का उपयोग करके हम किसी स्क्रिप्ट के रन होने के टाइम लेंथ को कंट्रोल कर सकते हैं। Server ऑब्जेक्ट एक बना बनाया ऑब्जेक्ट होता है, अतः इसको डेवलपर को क्रिएट नहीं करना पड़ता है।

Session object
सेशन ऑब्जेक्ट का उपयोग करके किसी भी यूजर के सेशन को कंट्रोल किया जा सकता है। इसका अभिप्राय यह है कि जब कोई यूज़र किसी बेव एप्लिकेशन को यूज करता है तो उसकी एक सेशन क्रिएट की जाती है और उस सेशन की एक्सपायरी भी तय की जाती है। इसके लिए सेसन ऑब्जेक्ट का उपयोग किया जाता है। इस तरीके से किसी भी यूजर के क्रियाकलापों और डाटा के परसिस्टेंस अर्थात स्थायित्व/स्थिरता को कंट्रोल किया जाता है। जैसा कि हम जानते हैं कि एचटीटीपी प्रोटोकोल एक क्षणभंगुर प्रोटोकॉल है अर्थात यह किसी भी इंफॉर्मेशन या स्टेट को स्टोर करके सर्वर पर नहीं रखता है परंतु अगर इंफॉर्मेशन को परसिस्ट करना हो अर्थात किसी सेशन विशेष के लिए उसे स्टोर करना हो तो ऐसी हालत में सेशन ऑब्जेक्ट का उपयोग कर इंफॉर्मेशन को स्टोर कर लेते हैं। Session ऑब्जेक्ट एक बना बनाया ऑब्जेक्ट होता है, अतः इसको डेवलपर को क्रिएट नहीं करना पड़ता है।

ऑब्जेक्टकॉन्टेक्स्ट का उपयोग किसी ट्रांजैक्शन के दौरान होने वाले क्रियाकलापों को कंट्रोल करने के लिए किया जाता है।

ऊपर बताए गए ASP के ऑब्जेक्टस के बारे में एक बहुत महत्त्वपूर्ण बात यह है कि डेवलपर को इन ऑब्जेक्ट्स को क्रिएट नहीं करना पड़ता है, यह बने बनाए ऑब्जेक्ट्स हैं और डेवलपर अपने code में इनको सीधे डायरेक्टली यूज कर सकता है।

ASP Components
अभी हमने ASP के अंतर्गत उपयोग होने वाले कुछ महत्वपूर्ण बने बनाए ऑब्जेक्टस की चर्चा की। अब हम ASP के अंतर्गत उपयोग किए जाने वाले कॉम्पोनेंट्स की चर्चा करेंगे। ऑब्जेक्ट की तुलना में कॉम्पोनेंट्स खास होते हैं क्योंकि इनका उपयोग किसी खास काम के लिए किया जाता है, उदाहरण के लिए AdRotator एडरोटेटर कंपोनेंट, इसका उपयोग किसी बैनर एडवर्टाइजमेंट को वेब पेज पर दिखाने के लिए किया जाता है। इसी तरह काउंटर कंपोनेंट का उपयोग वेबसाइट पर विजिट करने वाले विजिटर की संख्या की गिनती करने के लिए किया जाता है जबकि पेज काउंटर कंपोनेंट का उपयोग ना केवल विजिटर के विजिट की संख्या को ट्रैक करने के लिए आता है बल्कि किसी खास पेज पर कितना हिट हुआ उसकी भी काउंटिंग की जाती है। इसके अलावा और भी कई तरह के कंपोनेंट है जैसे एक्टिवेक्स डाटा ऑब्जेक्ट एडीओ ADO कंपोनेंट्स जिसका उपयोग कर किसी डेटाबेस जैसे माइक्रोसॉफ्ट एसक्यूएल सर्वर में डाटा को स्टोर किया जा सकता है और उस सर्वर से फिर डाटा को प्राप्त किया जा सकता है।

जैसा कि हमने देखा कि ASP के कुछ ऊपरलिखित ऑब्जेक्ट्स को क्रिएट करने की डेवलपर को जरूरत नहीं होती है क्योंकि ये ऑब्जेक्ट्स बने बनाए होते हैं जबकि इसके विपरीत कंपोनेंट्स को क्रिएट करने के लिए यूजर को खुद प्रयास करना होता है। यूजर को कंपोनेंट्स खुद क्रिएट करना होता है। जब किसी कंपोनेंट को क्रिएट किया जाता है तो उसका लाइफ और स्कोप तय किया जाता है। जिस प्रकार किसी वेरिएबल का स्कोप होता है, लाइफ होता है, ठीक उसी प्रकार कंपोनेंट्स का भी लाइफ और स्कोप होता है।

Page Scope
सर्वर पर किसी कंपोनेंट को क्रिएट करने के लिए Server ऑब्जेक्ट का उपयोग किया जाता है। उसके CreateObject मेथड का उपयोग कर कंपोनेंट को क्रिएट किया जाता है जैसा कि नीचे के उदाहरण में दिखाया गया है।

Set myDix = Server.CreateObject("Scripting.Dictionary")

Vbscript  की ऊपर कॉडिंग है।

ऊपर के उदाहरण में myDix वेरिएबल का स्कोप वहीं पेज है जिस पेज में इस कोड को लिखा गया है। जैसे ही उस पेज को छोड़कर यूज़र दूसरे पेज पर जाता है तब यह वेरिएबल अपने आप नष्ट/डिस्ट्रॉय हो जाता है।

Session Scope
अगर हम चाहते हैं कि ऊपर क्रिएट किए गए कंपोनेंट का लाइफ़ या स्कोप दूसरे पेज पर भी हो अर्थात जब यूजर एक पेज से दूसरे पेज पर जाए तब भी कंपोनेंट एक्जिस्ट करें, उपस्थित हो, नष्ट न हो तो इसके लिए हम सेशन ऑब्जेक्ट का उपयोग करते हैं। सेशन ऑब्जेक्ट की मदद से हम किसी कंपोनेंट के स्कोप को सेशन लेवल का कर देते हैं।

<%

Set Session("myDix" ) = Server.CreateObject("Scripting.Dictionary")

%>

दूसरा तरीका
किसी कंपोनेंट के स्कोप को सेसन स्तर का बनाने के लिए एक दूसरा तरीका भी है। इसके अंतर्गत एचटीएमएल के भीतर <OBJECT> Tag का उपयोग करते हैं। इस टैग के attributes द्वारा सेसन स्तर निश्चित किया जाता है।

<OBJECT RUNAT="SERVER" SCOPE="SESSION" ID="myDix" PROGID="MSWC.BrowserType">

ध्यान दीजिए कि सर्वर लेवल के कंपोनेंट को बनाने के लिए 4 प्रॉपर्टीज का उपयोग किया गया है। RUNAT="SERVER" बताता है कि यह कंपोनेंट सर्वर  पर रन होगा जबकि इस कंपोनेंट के स्कोप को बताने के लिए स्कोप प्रॉपर्टी का उपयोग किया गया है और उसकी वैल्यू सेशन दी गई है जो यह बता रहा है कि पूरे सेशन के दौरान यह कंपोनेंट उपस्थित होगा। तीसरा प्रोपर्टी आईडी है, आईडी का उपयोग कोड के भीतर इस कंपोनेंट की पहचान के लिए है जबकि PROGID="MSWC.BrowserType" का उपयोग सर्वर के द्वारा इस कंपोनेंट की पहचान के लिए है। इस नाम के द्वारा कंपोनेंट का रजिस्ट्रेशन सर्वर करता है।

Application level Scope

जब किसी कंपोनेंट को एप्लीकेशन लेवल का बनाया जाता है तो यह कंपोनेंट तब तक उपलब्ध होता है जब तक इस सर्वर डाउन ना हो जाए अथवा एप्लीकेशन को शटडाउन न कर दिया जाए।

एप्लीकेशन स्कोप को तय करने के लिए भी दो तरीके हैं जैसा कि सेशन स्कोप के लिए है।

पहला तरीका
अगर हम चाहते हैं कि ऊपर क्रिएट किए गए कंपोनेंट का लाइफ़ या स्कोप पूरे एप्लिकेशन की लाइफ के दौरान हो, कंपोनेंट एक्जिस्ट करें, उपस्थित हो, नष्ट न हो तो इसके लिए हम एप्लिकेशन ऑब्जेक्ट का उपयोग करते हैं। एप्लिकेशन ऑब्जेक्ट की मदद से हम किसी कंपोनेंट के स्कोप को एप्लिकेशन लेवल का कर देते हैं।

<%

Set Application("myDix" ) = Server.CreateObject("Scripting.Dictionary")

%>

दूसरा तरीका
किसी कंपोनेंट के स्कोप को एप्लिकेशन स्तर का बनाने के लिए एक दूसरा तरीका भी है। इसके अंतर्गत एचटीएमएल के भीतर <OBJECT> Tag का उपयोग करते हैं। इस टैग के attributes द्वारा एप्लिकेशन स्तर निश्चित किया जाता है।


<OBJECT RUNAT="SERVER" SCOPE="Application" ID="myDix" PROGID="MSWC.BrowserType">

जैसा कि हमने देखा कि ASP के अंतर्गत कुछ बने बनाए ऑब्जेक्ट्स होते हैं जिनका डेवलपर अपने कोड में उपयोग कर वांछित इंफॉर्मेशन को प्राप्त कर सकता है। खास करके रिक्वेस्ट Request ऑब्जेक्ट और Response रिस्पांस ऑब्जेक्ट का उपयोग वेब डेवलपमेंट के दौरान बहुत ज्यादा करते हैं। Request ऑब्जेक्ट की सहायता से रिक्वेस्ट इनफार्मेशन मैसेज के बारे में जानकारी प्राप्त की जाती है जबकि Response ऑब्जेक्ट की सहायता से response इनफार्मेशन मैसेज के बारे में जानकारी प्राप्त की जाती है।  हम इन सब चीजों के बारे में आगे पढ़ेंगे परंतु इसके पहले वेब से जुड़े कुछ बेसिक बातों के बारे में जानकारी होना जरूरी है। इनके अभाव में किसी नए डेवलपर के लिए आगे मुश्किल हो सकती है अतः बिल्कुल बेसिक स्तर से इस लेख में रिक्वेस्ट और रिस्पांस ऑब्जेक्ट से जुड़ी बातों को बताया गया है। 

यह बात याद रखें की वेब टेक्नोलॉजी के अंतर्गत वेब कम्युनिकेशन हमेशा दो मशीनों के बीच में होता है। जो मशीन रिक्वेस्ट को भेजता है उसे क्लाइंट मशीन कहते हैं और जो मशीन उस रिक्वेस्ट को प्रोसेस करके रिस्पांस देता है उसे सर्वर मशीन कहते हैं। सर्वर मशीन को वेबसर्वर/फ़ाइल सर्वर/मेल सर्वर भी कहते हैं, यह नाम उनके सर्विसेज के आधार पर निर्धारित किया जाता है। वेबसर्वर सॉफ्टवेयर है जिसका उपयोग रिक्वेस्ट को प्रोसेस करने के लिए किया जाता है।

एक डेवलपर के रूप में जब हम वेब ऐप्लिकेशन डिवेलप करते हैं तब जिस मशीन पर हम कोडिंग करते हैं वह मशीन क्लाइंट मशीन का भी काम करता है और सर्वर मशीन का भी काम करता है। जो भी सर्वर से जुड़े सॉफ्टवेयर होते हैं वह क्लाइंट मशीन पर इंस्टॉल होता है। 

वास्तविक जगत में जो वेबसाइट होते हैं वह किसी वेब सर्वर पर होस्ट होते हैं। होस्ट होने का अर्थ यह है कि वेबसाइट जो कि कई सारे वेबपेज से मिलकर बना होता है, सर्वर के किसी drive के फोल्डर में इंस्टॉल होता है। वस्तुतः वेबपेज और अन्य संसाधनों का संग्रह वेबसाइट कहलाता है। 

यूआरएल की संरचना और पोर्ट संख्या
निम्नलिखित यूआरएल के उदाहरण पर विचार करें।
http://www.example.com:80/resourcepath
किसी भी यूआरएल के अलग-अलग हिस्से होते हैं जिनको समझना जरूरी है। 
scheme://prefix.host:port/path/filename?queryString
यूआरएल हमेशा कुछ शर्तों के अधीन लिखा जाता है। यूआरएल के कई हिस्से होते हैं। यूआरएल के अंगों को एक निश्चित क्रम में लिखा जाता है। सबसे पहले यूआरएल scheme लिखा जाता है जो नेटवर्क के प्रोटोकॉल स्कीम को बताता है जैसे http, https, ftp, file इत्यादि। इसके बाद नेटवर्क के prefix को लिखा जाता है जो आमतौर पर www होता है। इसके बाद होस्ट आईपी एड्रेस या डोमेन नेम लिखा जाता है और colon के बाद port नम्बर लिखा जाता है। उसके बाद resource का path लिखा जाता है जो फोल्डर और उस फोल्डर के अधीन के फ़ोल्डर्स को बताता हैं। तत्पश्चात उस फ़ाइल का नाम लिखा जाता है जिसको यूजर प्राप्त करना चाहता है। कभी कभी यूजर डाटा को सर्वर पर भेजना चाहता है जिसके लिए क्वेरी स्ट्रींग का उपयोग ? चिह्न के बाद किया जाता है। क्वेरी स्ट्रिंग और पोर्ट नम्बर वैकल्पिक हैं। सभी यूआरएल में यह होना अनिवार्य नहीं है।
यूआरएल एनकोडिंग
यूआरएल के कैरेक्टर्स के बीच में किसी प्रकार का गैप नहीं होना चाहिए और यूआरएल में यह आशा की जाती है कि यूआरएल में केवल ASCII कैरेक्टर्स यूज किया गया है। अब अगर इस शर्त का पालन नहीं हो तो यूआरएल के कैरेक्टर्स की इनकोडिंग की जाती है जिसे यूआरएल इनकोडिंग कहते हैं।
यूआरएल इनकोडिंग के अंतर्गत जितने भी non-ASCII कैरेक्टर्स होते हैं, उनको ASCII कैरक्टर्स में कन्वर्ट कर दिया जाता है और इसी प्रकार अगर कैरेक्टर्स के बीच में व्हाईटस्पेस है तो उसे भी ASCII कैरेक्टर्स में कन्वर्ट कर दिया जाता है।
यूआरएल का उद्देश्य
जब भी क्लाइंट मशीन सर्वर मशीन से किसी डाटा की रिक्वेस्ट करता है तो इसके लिए ब्राउज़र के एड्रेसबार में यूआरएल को लिखा जाता है। यूआरएल का पूरा अर्थ है यूनिफॉर्म रिसोर्स लोकेटर। हिंदी में इसका अर्थ हुआ सामान्य संसाधन resource की स्थिति को बताने वाला। अब इसका अर्थ यह हुआ कि किसी संसाधन जैसे html या asp या पीडीएफ फ़ाइल की प्राप्ति के लिए उसका एड्रेस लिखना। जब एड्रेस बार में सर्वर मशीन के डोमेन नेम को लिखा जाता है तो वह वस्तुतः आईपी एड्रेस में बदल जाता है। साथ ही प्रोटोकॉल को ध्यान में रखते हुए डोमेन नेम के बाद पोर्ट की संख्या कॉलन के बाद लिखी जाती है। 

पोर्ट संख्या किसी सॉफ्टवेयर सर्विस के बारे में बताता है। HTTP के लिए पोर्ट संख्या 80 है जबकि DNS के लिए यह 53 है जबकि SMTP के लिए यह 25 है।

आमतौर पर HTTP प्रोटोकॉल के अंतर्गत पोर्ट संख्या निश्चित होती है और उसका मान 80 होता है। कहने का अर्थ यह है कि HTTP प्रोटोकोल के लिए पोर्ट की संख्या सामान्यतः 80 होता है अतः उसे यूआरएल में लिखा भी नहीं जाता है। ऐसी स्थिति में यह 80 मान लिया जाता है। निम्नलिखित उदाहरण को देखे इसमें पोर्ट संख्या का उल्लेख नहीं किया गया है और प्रोटोकॉल HTTP है अतः पोर्ट संख्या 80 होगी।

http://www.example.com/resourcepath

लेकिन अगर आप चाहते हैं कि किसी अन्य पोर्ट से एचटीटीपी प्रोटोकोल का पालन किया जाए तो उस संख्या को हम लिख सकते हैं। http://www.example.com:8080/resourcepath

उपर्युक्त उदाहरण में पोर्ट की संख्या स्पष्ट रूप से 8080 दी गई है यद्यपि HTTP प्रोटोकॉल का उपयोग यूआरएल में किया गया है।

पोर्ट का महत्व क्या है?
पोर्ट का अर्थ होता है किसी चीज को एक जगह से दूसरी जगह पहुंचाने का स्थल जैसे बंदरगाह, एयरपोर्ट इत्यादि। जब माल एक जगह से दूसरी जगह भेजा जाता है तो उसे एक्सपोर्ट export कहते हैं और जब माल दूसरी जगह से उस स्थान पर आता है तो उसे इंपोर्ट import कहते हैं। 

कम्युनिकेशन के अंतर्गत भी बिल्कुल इसी तरह की बात है। इंफॉर्मेशन को हम माल मान सकते हैं जिसका वहन एक जगह से दूसरी जगह अर्थात क्लाइंट मशीन से सर्वर मशीन और सर्वर मशीन से क्लाइंट मशीन पर होता है। 

जिस तरह अलग-अलग तरह के माल होते हैं और उनकी ढुलाई के लिए अलग-अलग तरह के उपाय हैं जैसे कुछ माल हवाई जहाज से एयरपोर्ट से जाता है जबकि कुछ माल जलमार्ग से। कुछ माल ज्यादा सुरक्षित तरीके से पहुंचाया जाता है जबकि कुछ बिना किसी सुरक्षा उपाय के। ठीक इसी तरह, इंटरनेट कम्युनिकेशन के अंतर्गत कुछ सूचनाएं अत्यंत ही सुरक्षित तरीके से पहुंचाई जाती है तो कुछ सामान्य तरीके से। अलग अलग तरह की सूचनाओं के लिए अलग अलग पोर्ट संख्या का उपयोग होता है। 

पोर्ट संख्या अर्थात निश्चित सॉफ्टवेयर सेवा
पोर्ट संख्या वस्तुतः उस सॉफ्टवेयर सर्विस को इंगित करता है जिसका उपयोग उस इंफॉर्मेशन को प्रोसेस करने के लिए किया जाता है जैसे कि कोई मेल सर्विस है तो उस मेल सर्विस के लिए एक खास तरह का पोर्ट बनाया गया है। जब भी किसी कंप्यूटर से कोई ईमेल दूसरे कंप्यूटर पर जाता है तो उसके लिए एक निश्चित पोर्ट संख्या है जिस संख्या पर मेल जाता है और ईमेल सॉफ्टवेयर की सहायता से उस ईमेल की प्रोसेसिंग की जाती है।

जैसा की मैंने पहले ही बताया है कि पोर्ट संख्या किसी सॉफ्टवेयर सर्विस के बारे में बताता है। HTTP के लिए पोर्ट संख्या 80 है जबकि DNS के लिए यह 53 है जबकि SMTP के लिए यह 25 है। ये सभी अलग अलग पोर्ट अलग अलग सॉफ्टवेयर सर्विसेज के लिए आरक्षित हैं।

विकिपीडिया के पेज से निम्नलिखित वाक्यांश लिए गए हैं यह इसी बात को बताता है कि port नम्बर सॉफ्टवेयर सर्विस से सम्बंधित है।

पोर्ट नंबर हमेशा होस्ट के आईपी एड्रेस और संचार के लिए उपयोग किए जाने वाले transport प्रोटोकॉल के प्रकार से जुड़ा होता है। यह किसी संदेश के गंतव्य या उत्पत्ति नेटवर्क एड्रेस को पूरा करता है। जब request मेसेज सर्वर मशीन पर पहुंचता है तो यह नहीं मानना चाहिए कि सन्देश गन्तव्य तक पहुंच गया। वस्तुतः उस सन्देश को उस मशीन के उस सॉफ्टवेयर एप्लिकेशन तक पहुंचाना होता है जहां उस सन्देश की प्रोसेसिंग हो सके। अतः पोर्ट नम्बर गन्तव्य एड्रेस को पूरा करता है।

विशिष्ट पोर्ट नंबर विशिष्ट सेवाओं की पहचान करने के लिए आरक्षित हैं ताकि एक आने वाले पैकेट को आसानी से उस सेवा से सम्बंधित एप्लिकेशन को अग्रेषित/forwarded किया जा सके।  यह सुरक्षा उपाय भी प्रदान करता है क्योंकि केवल आरक्षित सेवा के लिए वह पोर्ट उपलब्ध होता है।

विकिपीडिया के अनुसार,
A port number is always associated with an IP address of a host and the type of transport protocol used for communication. It completes the destination or origination network address of a message. Specific port numbers are reserved to identify specific services so that an arriving packet can be easily forwarded to a running application. For this purpose, port numbers lower than 1024 identify the historically most commonly used services and are called the well-known port numbers.

Applications implementing common services often use specifically reserved well-known port numbers for receiving service requests from clients. This process is known as listening, and involves the receipt of a request on the well-known port potentially establishing a one-to-one server-client dialog, using this listening port.

The port numbers are divided into three ranges: the well-known ports, the registered ports, and the dynamic or private ports.

यूआरएल और पोर्ट संख्या के बारे में जानने के बाद हम वापस अपने मूल विषय पर आते हैं।
वेबसाइट को एक वर्चुअल डायरेक्टरी से इंगित किया जाता है। जब भी किसी वेबसाइट को एक्सेस करना होता है तो यूजर उस वेबसाइट के डोमेन नेम को यूआरएल में लिखता है। जैसे http://www google.com  यूआरएल में डोमेन नेम लिखने से यूजर को उस वेबसाइट या डोमेन के आईपी एड्रेस को याद नहीं रखना होता है। हकीकत तो यह है यह किसी भी वेबसाइट का एक अद्वितीय यूनिक आईपी एड्रेस होता है और उस यूनिक आईपी ऐड्रेस से उस वेबसाइट को एक्सेस किया जाता है। इस बात को हम अब समझेंगे। 

जब हम यूआरएल में http://www लिखते हैं तो यह बताता है कि यूआरएल के जिस resource जैसे html या asp पेज को एक्सेस करना है उसे एचटीटीपी प्रोटोकोल के द्वारा www नेटवर्क से प्राप्त करना है। www पूरा अर्थ वर्ल्ड वाइड वेब है जिसका हिंदी हुआ संसार भर में बिछा हुआ जाल। यह जाल वस्तुतः कम्प्यूटर के नेटवर्क का होता है जो इंटरनेट पर उपलब्ध होता है। इंटरनेट एक टेक्नोलॉजी है जिसकी सहायता से किसी भी दो कंप्यूटर को एक दूसरे से कम्युनिकेशन करने के लिए जोड़ा जा सकता है। 

इंटरनेट में कम्युनिकेशन के लिए ऐसे तो कई सारे प्रोटोकॉल उपलब्ध है जिनकी सहायता से ही तो कंप्यूटर आपस में कम्युनिकेट करते हैं परंतु इंटरनेट पर सबसे ज्यादा प्रचलित प्रोटोकोल एचटीटीपी प्रोटोकोल है और हम जब यूआरएल में http:// लिखते हैं तो यह स्पष्ट हो जाता है कि जो कम्युनिकेशन सर्वर से या रिक्वेस्ट जो सर्वर से है वह एचटीटीपी प्रोटोकॉल के द्वारा होगी। 

एचटीटीपी के अलावा कुछ अन्य कम्युनिकेशन प्रोटोकोल है जैसे ftp, file, gopher, इत्यादि

http://www. के बाद डोमेन नेम को लिखा जाता है जैसे google.com

इस डोमेन नेम को आईपी में कन्वर्ट करने के लिए डोमेन नेम सर्वर डीएनएस का उपयोग किया जाता है। डीएनएस के द्वारा यह डोमेन नेम यूनीक आईपी एड्रेस में बदल जाता है। दूसरे शब्दों में डोमेन नेम की मैपिंग आईपी एड्रेस से की जाती है। प्रत्येक डोमेन नेम का एक यूनीक आईपी होता है।

जब यूजर डोमेन नेम के बाद किसी रिसोर्स का नाम नहीं लिखता है तो उस डोमेन नेम से जुड़े सर्वर द्वारा एक इंडेक्स पेज या डिफॉल्ट पेज रेस्पॉन्स के रूप में ब्राउज़र/यूजर के पास भेज दिया जाता है। उदाहरण के लिए 
http://www.google.com इस यूआरएल में किसी फ़ाइल का ज़िक्र नहीं है, अतः सर्वर डिफॉल्ट पेज भेजेगा लेकिन यदि किसी फ़ाइल का ज़िक्र यूआरएल में हो जैसे http://www.google.com/sales.html
तब सर्वर उस रिक्वेस्ट फ़ाइल को भेजेगा। यदि वह फ़ाइल सर्वर पर नहीं है तब सर्वर रेस्पॉन्स इन्फॉर्मेशन में तत्सम्बन्धी सूचना भेज देगा।

इंटरनेट पर क्लाइंट मशीन और सर्वर मशीन के बीच में सूचना के आदान-प्रदान की प्रक्रिया किसी चिट्ठी के भेजने की प्रक्रिया से बहुत मिलता जुलता है। इस बात को हम आगे देखते हैं। 

जब हम किसी चिट्ठी को लिखते हैं तो उसमें सूचना होती है लेकिन हम उस सूचना को गुप्त रखने के लिए उस चिट्ठी को किसी लिफाफे में रख देते हैं और उस पर गोंद भी लगा देते हैं ताकि वह सूचना सुरक्षित हो जाए। साथ ही, लिफाफे के बाहर जिस व्यक्ति को सूचना भेजना है उस व्यक्ति का पूरी एड्रेस लिख देते हैं। साथ ही हम अपना पता भी लिख देते हैं ताकि अगर रिसीवर व्यक्ति उस सूचना को प्राप्त नहीं करें तो लिफाफे को वापस भेजने वाले के पास भेजा जा सके। 

बिल्कुल यही बात इंटरनेट में दो कंप्यूटर के बीच में कम्युनिकेशन के बीच में होती है। जब भी किसी सूचना को कोई कंप्यूटर नेटवर्क की सहायता से सर्वर पर भेजता है तो उस सूचना को इंक्रिप्ट कर देता है ताकि वह सूचना सुरक्षित हो जाएं। जिस कंप्यूटर को यह सूचना भेजना है उस कंप्यूटर के बारे में पूरी जानकारी रिक्वेस्ट ऑब्जेक्ट के भीतर सारा डिटेल होता है। साथ ही उस रिक्वेस्ट ऑब्जेक्ट के भीतर भेजने वाले कंप्यूटर की भी पूरी डिटेल होती है जैसे किस ब्राउज़र की मदद से, किस मशीन से, उसका आईपी ऐड्रेस इत्यादि से सूचना भेजी गई। इन सभी request तथ्यों या सूचनाओं को दो भागों में बांटते हैं एक को header और दूसरे को body कहते हैं।

गूगल क्रोम या मोज़िला जैसे किसी भी ब्राउज़र में इस जानकारी को देखा जा सकता है।

अतः डेवलपर को यह बात हमेशा याद रखना है कि उसका कोड दो मशीनों के बीच कम्युनिकेशन से जुड़ा हुआ है, यद्यपि नए डेवलपर को यह बात समझने में थोड़ा समय लग सकता है।

सबसे पहले यह बात याद रखें वेब डेवलपमेंट के अंतर्गत Request और Response हमेशा एचटीटीपी प्रोटोकोल के अंतर्गत ही होती है। जैसा कि हम जानते हैं कि HTTP प्रोटोकोल stateless प्रोटोकॉल है, स्टैटलेस प्रोटोकोल होने के कारण रिक्वेस्ट से संबंधित इंफॉर्मेशन को सर्वर स्टोर करके नहीं रखता। जब भी क्लाइंट को किसी इंफॉर्मेशन की जरूरत होती तब वह सर्वर को रिक्वेस्ट भेजता है। जैसा की रिक्वेस्ट भेजना एक क्रिया है इस क्रिया को HTTP प्रोटोकोल के अंतर्गत HTTP VERB के द्वारा निर्धारित किया जाता है। Request क्रिया कई प्रकार का हो सकता है जैसे GET, POST, PUT, DELETE इत्यादि। इसे हम आगे समझेंगे। 

HTTP प्रोटोकॉल के क्रिया के अतिरिक्त एक और विषय समझने लायक है। वह है कनेक्शन ओरिएंटेड प्रोटोकाल। HTTP प्रोटोकॉल एक कनेक्शन ओरिएंटेड प्रोटोकॉल है। इसका क्या अर्थ है? यह हम आगे देखेंगे। 

लेखक अजीत कुमार १४ अगस्त २०२१
अंतिम बार ९ अक्टूबर को अद्यतन किया।

© अजीत कुमार, सर्वाधिकार सुरक्षित।

इस आलेख को उद्धृत करते हुए इस लेख के लिंक का भी विवरण दें। इस आलेख को कॉपीराइट सूचना के साथ यथावत साझा करने की अनुमति है। कृपया इसे ऐसे स्थान पर साझा न करें जहाँ इसे देखने के लिए शुल्क देना पडे।



Wednesday, August 11, 2021

C# Type conversion in hindi

सीशार्प भाषा के अंतर्गत किसी expression के डाटा टाइप को जानने के लिए अथवा उसे किसी अन्य टाइप में परिवर्तित करने के लिए कई तरह का ऑपरेटर प्रदान किया गया है जिसका ज्ञान किसी भी सीशार्प प्रोग्रामर के लिए अति आवश्यक है क्योंकि प्रोग्रामिंग के अंतर्गत टाइप कंवर्सन एक सामान्य बात है।

आमतौर पर रनटाइम के समय किसी expression की वैल्यू क्या होगी और उसका डाटा टाइप क्या होगा यह जानना प्रोग्रामर के लिए जरूरी होता है और इसके लिए उसे कुछ ऑपरेटर की जरूरत पड़ती है जिसकी सहायता से वह किसी expression की डाटा टाइप हो जान ले और उसके अनुरूप वह संबंधित डाटा टाइप वाले वेरिएबल में उस एक्सप्रेशन की वैल्यू को assign करें। सीशार्प एक type safe भाषा है अतः किसी compatible टाइप में ही किसी टाइप के expression को assign किया जा सकता है। इसके लिए प्रोग्रामर को टाइप कंवर्सन करना भी पड़ सकता है। टाइप कंवर्सन के लिए सी शार्प लैंगुएज में कुछ मेथड और ऑपरेटर उपलब्ध हैं।

सबसे पहले तो यह मन में यह प्रश्न उठा होगा की expression के लिए हम क्यों बात कर रहे हैं। देखिए, एक्सप्रेशन का evaluation मूल्यांकन रनटाइम के समय होता है। अगर हम किसी explicit वैल्यू जैसे "ajeet" को जिसका डाटा टाइप स्ट्रिंग है को किसी दूसरे डाटा टाइप के वेरिएबल में assign करते हैं तो इस प्रकार का असाइनमेंट करने पर कंपाइल टाइम में ही कंपाइलर exception दे देगा। इसके विपरीत, जब किसी एक्सप्रेशन को किसी variable को assign किया जाता है तो उसका evaluation रन टाइम पर होता है। सीशार्प एक type safe भाषा है अतः किसी compatible टाइप में ही किसी टाइप के expression को assign किया जा सकता है। अगर एक्सप्रेशन को किसी उपयुक्त टाइप वाले वेरिएबल में assign नहीं किया जाये है तो runtime में exception उत्पन्न होगा।

यही कारण है कि मैंने लेख के आरम्भ में ही रनटाइम के दौरान evaluate किए जाने वाले expression के संबंध में बात की।

प्रोग्रामिंग में उपयोग की जाने वाले expression को दो भागों में बांटा जा सकता है। कुछ expression ऐसे होते हैं जिन्हें हम न्यूमैरिक expression कह सकते हैं और इसके अतिरिक्त जो एक्सप्रेशन है उन्हें गैर न्यूमैरिक expression कह सकते हैं। 

जितने भी न्यूमैरिक एक्सप्रेशन है उनके इवेलुएशन के बाद जो वैल्यू प्राप्त होती है उसका डाटा टाइप किसी न्यूमैरिक टाइप का हो सकता है जैसे byte, int short, long, double, float इत्यादि।

गैर न्यूमैरिक expression का डाटा टाइप  bool या string हो सकता है।

सीशार्प भाषा के अंतर्गत किसी एक्सप्रेशन E का मान किसी datatype T प्रकार का हो सकता है। इसकी जांच के लिए is ऑपरेटर का प्रयोग किया जाता है। सामान्य सूत्र यह है कि E is T का मूल्यांकन करने पर इसका मान True या False हो सकता है। 

उदाहरण १
public class Base { }

public class Derived : Base { }

public static class IsOperatorExample
{
    public static void Main()
    {
        object b = new Base();
        Console.WriteLine(b is Base);  // output: True
        Console.WriteLine(b is Derived);  // output: False

        object d = new Derived();
        Console.WriteLine(d is Base);  // output: True
        Console.WriteLine(d is Derived); // output: True
    }
}
उदाहरण २
int i = 27;
Console.WriteLine(i is System.IFormattable);  // output: True

object iBoxed = i;
Console.WriteLine(iBoxed is int);  // output: True
Console.WriteLine(iBoxed is long);  // output: False
Declaration and type patterns

You use declaration and type patterns to check if the run-time type of an expression is compatible with a given type. With a declaration pattern, you can also declare a new local variable. When a declaration pattern matches an expression, that variable is assigned a converted expression result, as the following example shows:

उदाहरण ३
object greeting = "Hello, World!";
if (greeting is string message)
{
    Console.WriteLine(message.ToLower());  // output: hello, world!
}
The run-time type of an expression result is a nullable value type with the underlying type T.
A boxing or unboxing conversion exists from the run-time type of an expression result to type T.

उदाहरण ४
int? xNullable = 7;
int y = 23;
object yBoxed = y;
if (xNullable is int a && yBoxed is int b)
{
    Console.WriteLine(a + b);  // output: 30
}
Cast expression
किसी expression को कास्ट करने से अभिप्राय उस expression के डाटा टाइप को किसी दूसरे डाटा टाइप में परिवर्तित करने से है। इसके लिए () ऑपरेटर का प्रयोग किया जाता है और इस () के भीतर उस डाटा टाइप को दिया जाता है जिस डाटा टाइप में एक्सप्रेशन को परिवर्तित करना होता है। संकेत रूप में यदि E एक्सप्रेशन को T datatype में बदलना हो तो (T)E लिखेंगे। ऐसा करने पर सम्भव है कि E का datatype परिवर्तित हो कर T हो जाये परन्तु कोई गारण्टी नहीं है कि कास्टिंग सफल हो। ऐसी स्थिति में exception उत्पन्न होगा।

उदाहरण ५
double x = 1234.7;
int a = (int)x;
Console.WriteLine(a);   // output: 1234

IEnumerable numbers = new int[] { 10, 20, 30 };
IList list = (IList)numbers;
Console.WriteLine(list.Count);  // output: 3
Console.WriteLine(list[1]);  // output: 20
  

© अजीत कुमार, सर्वाधिकार सुरक्षित।

इस आलेख को उद्धृत करते हुए इस लेख के लिंक का भी विवरण दें। इस आलेख को कॉपीराइट सूचना के साथ यथावत साझा करने की अनुमति है। कृपया इसे ऐसे स्थान पर साझा न करें जहाँ इसे देखने के लिए शुल्क देना पडे।

Tuesday, August 10, 2021

C# Access Modifiers in Hindi

सी शार्प लैंग्वेज के अंतर्गत किसी टाइप जैसे class या struct के लिए दो तरह के access modifier का प्रयोग किया जाता है, उनके नाम public और internal हैं। बाय डिफॉल्ट, जब किसी टाइप के साथ मॉडिफाईर नहीं दिया होता है तब हम मानते हैं कि उस टाइम के साथ इंटरनल मोडीफायर का प्रयोग हुआ है।

struct
यह बात याद रखें किए स्ट्रक्ट एक ऐसा टाइप है जिसका derived टाइप नहीं बनाया जा सकता है जबकि क्लास का derived टाइप होता है। कहने का मतलब पैरंट क्लास है तो derived क्लास भी हो सकता है जबकि किसी स्ट्रक्ट का derived स्ट्रक्ट नहीं होता है। दूसरे शब्दों में स्ट्रक्ट इन्हेरिटेंस को सपोर्ट नहीं करता है।

internal
जब किसी टाइप जैसे क्लास या स्ट्रक्ट के साथ internal मॉडिफाइर का प्रयोग किया जाता है तब उस टाइप का प्रयोग केवल उसी एसेंबली के भीतर किया जा सकता है जिसके भीतर उस टाइप को डिफाइन किया गया होता है।

public
जब किसी टाइप जैसे क्लास या स्ट्रक्ट के साथ public मॉडिफाइर का प्रयोग किया जाता है तब उस टाइप का प्रयोग  न केवल उसी एसेंबली के भीतर किया जा सकता है बल्कि किसी दूसरे असेम्बली के भीतर भी उस टाइप का प्रयोग किया जा सकता है।

Access modifiers
एक्सेस मोडीफायर का उपयोग ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के एनकैप्सूलेशन के अवधारणा को ध्यान में रखते हुए किया जाता है। एक्सेस मोडीफायर की वजह से कोई क्लास या स्ट्रक्चर एनकैप्सूलेट्स हो जाता है। कहने का अर्थ यह है कि इस क्लास या स्ट्रक्ट को किस-किस असेम्बली में एक्सेस किया जा सकता है, इसका निर्धारण एक्सेस मोडीफायर के द्वारा तय हो जाता है।

Access modifiers of members of a type
जिस तरह टाइप का एक्सेस मोडीफायर होता है उसी प्रकार उस टाइप के मेंबर के लिए भी एक्सेस मोडीफायर का प्रयोग किया जाता है। जहां तक टाइप के एक्सेस मोडीफायर की बात है यह दो प्रकार का होता है पब्लिक और इंटरनल जैसा कि हमने पहले देख लिया है। परंतु टाइप के मेंबर्स के एक्सेस मोडीफायर की संख्या इनसे ज्यादा होती है टाइप के मेंबर्स किए एक्सेस मोडीफायर्स इस प्रकार से है पब्लिक, प्राइवेट, प्रोटेक्टेड, इंटरनल, प्रोटेक्टेड इंटरनल, प्राइवेट इंटरनल।

Types of member
किसी टाइप के भीतर दो तरह के मेंबर होते हैं।
१) वेरिएबल मेंबर या फील्ड और २) मेथड मेंबर 

Field and method
क्लास के भीतर किसी वेरिएबल मेंबर को फील्ड कहा जाता है। यह क्लास के state को बताता है। क्लास के भीतर बने function को method कहा जाता है। यह क्लास के behaviour को बताता है।

अब एक-एक करके हम टाइप के मेंबर के एक्सेस मोडीफायर को समझेंगे। यहां टाइप से तात्पर्य class या struct से है।

public
जब कोई टाइप मेंबर पब्लिक होता है तो इसका अभिप्राय यह है कि यह मेंबर किसी भी दूसरे टाइप में एक्सेस किया जा सकता है। अब एक बात समझने वाली है कि क्या ऐसा संभव है की टाइप का एक्सेस मोडीफायर इंटरनल हो और उसके मेंबर का एक्सेस मोडीफायर पब्लिक हो? यह पाठक स्वयं सोचे और विसुअल स्टूडियो में प्रयोग कर समझें।

private
जब कोई टाइप मेंबर प्राइवेट होता है तो इसका अभिप्राय यह है कि यह मेंबर केवल इसी टाइप के भीतर प्रयोग किया जा सकता है। इस टाइप के अलावा अन्यत्र इसका प्रयोग नहीं किया जा सकता है। अगर टाइप पब्लिक है तो किसी बाहरी असेम्बली में इस टाइप का प्रयोग हो सकता है और तब कहने की जरूरत नहीं है कि तब उसके प्राइवेट मेम्बर का उस बाहरी असेम्बली में प्रयोग होगा।

protected
जब कोई टाइप मेंबर प्रोटेक्टेड होता है इसका अभिप्राय यह है कि यह मेंबर ना केवल इस टाइप के भीतर प्रयोग किया जा सकता है अपितु इस टाइप से derived टाइप के भीतर भी प्रयोग किया जा सकता है। अब यहां दो संभावना बनती है १) अगर टाइप इंटरनल हो और मेंबर प्रोटेक्टर हो और २) दूसरी संभावना यह है की टाइप पब्लिक हो और उसका मेंबर प्रोटेक्टर हो।

अगर टाइप इंटरनल हो और मेंबर प्रोटेक्टेड हो तो ऐसी हालत में इस प्रोटेक्टेड मेंबर का प्रयोग वर्तमान असेम्बली के भीतर ही किया जा सकता है परन्तु शर्त यह है कि इसका प्रयोग उस टाइप के अतिरिक्त उस टाइप से व्युत्पन्न टाइप के भीतर किया जा सकता है, अन्यत्र नहीं।

अगर टाइप पब्लिक हो और मेंबर प्रोटेक्टेड हो तो ऐसी हालत में इस प्रोटेक्टेड मेंबर का प्रयोग वर्तमान और बाह्यअसेम्बली के भीतर किया जा सकता है परन्तु शर्त यह है कि इसका प्रयोग उस टाइप के अतिरिक्त उस टाइप से व्युत्पन्न टाइप के भीतर किया जा सकता है, अन्यत्र नहीं।

ध्यान देने वाली बात यह है कि struct टाइप का व्युत्पन्न टाइप नहीं होता। दूसरे शब्दों में, struct टाइप inheritance को सपोर्ट नहीं करता है। अतः struct टाइप के मेम्बर protected नहीं हो सकते हैं। इसका अर्थ यह भी है कि ये मेम्बर्स protected internal और private protected भी नहीं हो सकते हैं। protected internal और private protected के बारे में आगे चर्चा की गई है।

प्रोटेक्टेड इंटरनल protected internal
अगर टाइप पब्लिक हो और मेंबर प्रोटेक्टेड इंटरनल हो तो ऐसी हालत में इस प्रोटेक्टेड इंटरनल मेंबर का प्रयोग वर्तमान असेम्बली के भीतर ही किया जा सकता है किसी बाहरी असेम्बली में नहीं। वर्तमान असेम्बली में इसका प्रयोग उस टाइप के अतिरिक्त उस टाइप से व्युत्पन्न टाइप के भीतर किया जा सकता है, अन्यत्र नहीं।

प्रोटेक्टेड इंटरनल मोडीफायर का प्रयोग तब करना चाहिए जब टाइप पब्लिक हो और आप चाहते हैं कि उस टाइप के मेंबर का प्रयोग किसी बाहरी असेम्बली में नहीं हो। बल्कि उसका प्रयोग वर्तमान असेम्बली के भीतर टाइप के अतिरिक्त उस टाइप के व्युत्पन्न टाइप में ही हो।

प्राइवेट प्रोटेक्टेड




Sunday, August 8, 2021

Web Technologies : CSS Framework Bootstrap

बूटस्ट्रैप क्या है? 

बूटस्ट्रैप सीएसएस और जावास्क्रिप्ट फ्रेमवर्क है जिसका उपयोग कम कोडिंग की सहायता से वेब पेज में सीएसएस को अप्लाई करना होता है। 

जैसा कि हम जानते हैं कि सीएसएस जिसका की फुल फॉर्म है कैस्केडिंग स्टाइल शीट्स की मदद से वेब पेज के किसी भी एलिमेंट को स्टाइल दिया जा सकता है। आमतौर पर कोई भी वेब डेवलपर जब सीएसएस की मदद से किसी भी पेज के एलिमेंट की स्टायलिंग करता है तो इसमें उसे ज्यादा कोडिंग करना होता है और कोड में फॉल्ट होने पर कोड की डिबगिंग करना भी मुश्किल होता है। साथ ही स्टाइल को रेस्पॉन्सिव बनाने की समस्या अलग से होती है। 

इन सब समस्याओं से निजात के लिए बूटस्ट्रैप नामक सीएसएस फ्रेमवर्क का उपयोग किया जाता है। सबसे पहले इस फ्रेमवर्क का उपयोग ट्विटर में किया गया था बाद में यह फ्रेमवर्क ओपन सोर्स के रूप में उपलब्ध हो गया और आज दुनिया भर की वेबसाइट में सीएसएस की स्टाइलिंग के लिए बूटस्ट्रैप नामक फ्रेमवर्क का उपयोग किया जाता है। बूटस्ट्रैप की सहायता से स्टाइलिंग करना अत्यंत ही सरल है। एक दो सप्ताह के भीतर कोई भी वेब डेवलपर इसको सरलता से सीख सकता है बशर्ते वह मनोयोग से इसका अध्ययन करें।

किसी भी वेब पेज के किसी एलिमेंट की स्टाइलिंग करने के लिए बूटस्ट्रैप के क्लास का उपयोग करना होता है। क्लास का अभिप्राय CSS के क्लास से ही होता है जो किसी वेब टैग में अप्लाई किया जाता है। इस बने बनाए क्लास के डेफिनिशन को हम बूटस्ट्रैप की सीएसएस के सोर्स कोड में देख सकते हैं।

बूटस्ट्रैप की सबसे बड़ी खासियत यह है कि रेस्पॉन्सिव वेब डिजाइनिंग में मदद करता है और यह मोबाइल फर्स्ट एप्रोच को फॉलो करता है। रेस्पॉन्सिव वेब डिजाइनिंग का अभिप्राय यह है कि वेब पेज पर की गई स्टाइलिंग अलग-अलग तरह के स्क्रीन साइज के डिवाइसेज पर बिगड़ता नहीं है बल्कि इसमें इतनी फ्लैक्सिबिलिटी यानी लचीलापन होती है कि अलग-अलग स्क्रीन साइज पर भी स्टाइल सुंदर बना रहता है। यहां स्क्रीन साइज से अभिप्राय व्यूपोर्ट की साइज से है। व्यूपोर्ट से अभिप्राय स्क्रीन की लंबाई और चौड़ाई से है जिसके भीतर कोई दृश्य देखा जाता है। आमतौर पर व्यूपोर्ट के बारे में meta टैग में वर्णन किया जाता है।

जैसा कि हम जानते हैं कि मोबाइल, टेबलेट, डेस्कटॉप, लैपटॉप और टीवी स्क्रीन पर अगर किसी भी वेब पेज को देखा जाए तो उनके व्यूपोर्ट की साइज अलग-अलग होती है परंतु अगर उसके पेज की स्टाइलिंग बूटस्ट्रैप की मदद से की जाती है तो अलग-अलग व्यूपोर्ट के होने पर भी यह पेज की स्टाइलिंग को बिगड़ती नहीं देता। 

अलग-अलग साइज के व्यूपोर्ट के लिए विभिन्न सिंबल का प्रयोग बूटस्ट्रैप में किया जाता है जैसे xs, sm, md, lg, xl इन सिंबल को हम एक्स्ट्रा स्मॉल, स्मॉल, मीडियम, लार्ज, एक्स्ट्रा लार्ज कहते हैं। हम आगे देखेंगे कि इन सिंबल्स का प्रयोग किस प्रकार किया जाता है। 

बूटस्ट्रैप ग्रिड
अब हम बूटस्ट्रैप के एक बहुत ही महत्वपूर्ण कंसेप्ट को समझेंगे जिसको की ग्रिड कहते हैं।

बूटस्ट्रैप के अंतर्गत किसी भी व्यूपोर्ट को हम 12 कॉलम्स में डिवाइड अर्थात विभाजित करते हैं इसका अभिप्राय क्या है? इसको समझने के लिए हमें बूटस्ट्रैप के कंटेनर container और row क्लास के कंसेप्ट को समझना होगा। container क्लास की मदद से बूटस्ट्रैप के द्वारा किसी भी वेब पेज को अलग-अलग हिस्सों में बांटा जाता है जिसमें कि हम किसी कंटेंट को रखते हैं। अब प्रश्न यह है कि इस क्लास का प्रयोग किस तरह के टैग के साथ किया जाता है। आमतौर पर container क्लास का उपयोग div टैग के साथ किया जाता है। div टैग की मदद से आमतौर पर किसी भी वेब पेज को अलग-अलग अलग-अलग भागों में विभाजित किया जाता है। इसके अलावा सेक्शन section जैसे टैग के साथ भी container क्लास का उपयोग किया जा सकता है।

बूटस्ट्रैप का कंटेनर क्लास content के लिए स्पेस बनाता है जिसके भीतर वेब कंटेंट को रखा जाता है परंतु यह पेज के दोनों छोरों अर्थात मार्जिन में 15 पिक्सेल का मार्जिन छोड़ देता है। इस प्रकार कंटेंट पेज के मध्य में रखने के लिए container टैग का उपयोग किया जाता है। याद रखे कि container टैग वेब पेज के दोनों ओर कुछ जगह छोड़ देता है और बीच के बचे स्थान में कंटेंट को रखा जाता है। 

इसके अलावा container-fluid नाम का भी क्लास बूटस्ट्रैप प्रदान करता है जिसका उपयोग तब करना चाहिए जब आप वेबपेज के दोनों छोरों में किसी प्रकार का गैप नहीं छोड़ना चाहते हैं। जैसा कि मैंने पहले बताया कि container क्लास की मदद से वेबपेज के दोनों साइड में कुछ मार्जिन दे दिया जाता है जबकि container-fluid के केस में वेब पेज के दोनों छोरों पर किसी भी प्रकार का मार्जिन नहीं होता है और कंटेंट बिल्कुल वेबपेज के एक छोर से शुरू होता है और दूसरे छोर तक जाता है।

ऊपर हमने देखा कि यह स्पेसिंग के लिए container और container-fluid नाम के क्लास का उपयोग किया जाता है। अब इस स्पेस को हम कई सारे अलग-अलग कतार या row में बांट सकते हैं और इस काम को करने के लिए बूटस्ट्रैप के row क्लास का उपयोग किया जाता है। अगर आप किसी div के साथ row क्लास का उपयोग करते हैं तो वह div एक row उपलब्ध कराएगा। इस तरीके से एक container के भीतर हम कई सारे row बना सकते हैं।

इसके बाद col क्लास की बारी आती है। col क्लास का उपयोग हम किसी row को अलग-अलग कॉलम्स में बांटने के लिए करते हैं। बूटस्ट्रैप के अंतर्गत किसी भी row को ज्यादा से ज्यादा 12 कॉलम में विभाजित किया जा सकता है। अगर आप इससे ज्यादा कॉलम 1 row में देंगे तो वह एक्स्ट्रा कॉलम नीचे चला जाएगा अर्थात वह उसी row में नहीं रहेगा।

कॉलम की संख्या को दर्शाने के लिए हम col के बाद उस संख्या को लिख देते हैं। जैसे col-2 इसका अर्थ यह है कि यह दो कॉलम के बराबर की जगह लेगा। सामान्य सूत्र हुआ col-n जहां n  का मान 1 से लेकर 12 के बीच में कोई भी पूर्णांक संख्या हो सकती है।

अगर आपको ब्रेकप्वाइंट को भी दर्शाना हो तो col के बाद ब्रेक प्वाइंट और उसके बाद कॉलम्स की संख्या को लिखते हैं उदाहरण के लिए col-md-4 इसका अर्थ बाकी मीडियम साइज के रिपोर्ट में 4 कॉलम के बराबर जगह लेगा। मीडियम साइज के ऊपर के जितने भी स्क्रीन है उसके लिए भी यह चार कॉलम ही लेगा लेकिन अगर मीडियम साइज से कम का कोई स्क्रीन है तो उस हालत में कॉलम की संख्या 4 से कम हो जाएगी। इस तरह की फ्लैक्सिबिलिटी बूटस्ट्रैप की रेस्पॉन्सिव प्रकृति के कारण होती है।

सामान्य सूत्र हुआ col-breakpoint-n जहां n  का मान 1 से लेकर 12 के बीच में कोई भी पूर्णांक संख्या हो सकती है और breakpoint के लिए हम xs, sm, md, lg, xl चिह्नों का उपयोग करते हैं। हमने पहले ही देखा है कि 
इन सिंबल को हम एक्स्ट्रा स्मॉल, स्मॉल, मीडियम, लार्ज, और एक्स्ट्रा लार्ज कहते हैं।

यह समझने वाली है कि प्रत्येक दो कॉलम के बीच में कुछ दूरी होती है जिसको gutter कहते हैं। अगर इस तरह के guttter को नहीं देना हो तो उसके लिए .nogutters नामक क्लास का प्रयोग .row के साथ करते हैं।

लेखक अजीत कुमार

What is API and Web API. REST Principles in Hindi

लेखक अजीत कुमार 

इस लेख में मैंने अत्यंत ही सरल तरीके से वेब एपीआई के बारे में जानकारी उपलब्ध कराई है। कोई भी व्यक्ति जो पहली बार वेब एपीआई के बारे में पढ़ रहा है, वह इसे पढ़ कर समझ सकता है।


वेब एपीआई क्या होता है? 

वेब एपीआई के बारे में जाने से पहले यह जानना जरूरी है कि एपीआई क्या होता है। एपीआई का फुलफॉर्म एप्लीकेशन प्रोग्रामिंग इंटरफेस है। जिस तरह किसी एप्लिकेशन के यूजर इंटरफेस के द्वारा यूजर इंटरेक्शन करता है, ठीक उसी तरह, जब कोई एप्लीकेशन किसी दूसरे एप्लीकेशन के साथ इंटरेक्शन करना चाहता है अर्थात दूसरे एप्लीकेशन की सर्विस हासिल करना चाहता है तो उसे जिस इंटरफेस की जरूरत पड़ती है, उसे प्रोग्रामिंग इंटरफेस कहते हैं और इस प्रोग्रामिंग इंटरफेस के लिए, सर्वर एप्लीकेशन में प्रोग्राम के रूप में ऑब्जेक्ट्स और मेथड्स होते हैं जो क्लाइंट एप्लीकेशन के लिए इंटरफेस के रूप में काम करते हैं। यह बात हम आगे समझेंगे। सर्विस देने वाली अर्थात सर्वर एप्लीकेशन के इस फीचर को ही समग्र रूप में एप्लीकेशन प्रोग्रामिंग इंटरफेस करते हैं। 

सवाल है कि किसी एप्लीकेशन को दूसरे एप्लीकेशन से इंटरेक्शन / सर्विस करने के लिए क्या करना होगा। इसके लिए वस्तुतः सर्विस प्रदाता एप्लीकेशन के फंक्शन या मेथठ का उपयोग करना होता है। जब एक एप्लीकेशन को किसी दूसरे एप्लीकेशन के किसी मेथड या फंक्शन को यूज़ करना होता है तो उसके लिए वह उस सर्विस प्रदाता एप्लीकेशन के एपीआई अर्थात एप्लीकेशन प्रोग्रामिंग इंटरफेस का उपयोग करता है। सर्विस को प्राप्त करने वाले एप्लीकेशन को क्लाइंट एप्लीकेशन कहते हैं और सर्विस देने वाले एप्लीकेशन को सर्वर एप्लीकेशन कहते हैं। इस तरह के सिस्टम को क्लाइंट सर्वर सिस्टम कहा जाता है।

उदाहरण के लिए, किसी डीएलएल डायनामिक लिंक लाइब्रेरी के भीतर कई सारे मेथडस या फंक्शनस बने होते हैं और उस डीएलएल को दूसरे एप्लीकेशन में या प्रोजेक्ट में इंपोर्ट कर अथवा उसका रेफेरेंस देकर उस डीएलएल के मेथड या फंक्शन का उपयोग कर लिया जाता है। अतः डीएलएल एक तरह का एपीआई होता है।

एक अन्य उदाहरण के रूप में, अगर कोई डेस्कटॉप एप्लीकेशन जैसे एक्सेल एप्लिकेशन किसी दूसरे एप्लिकेशन से इंटरैक्शन करना चाहे अर्थात उस एप्लिकेशन की सर्विसेज को यूज करना चाहे तो दूसरे एप्लिकेशन को अपने एप्लिकेशन के ऑब्जेक्ट्स और उसके मेथड्स को एक्सपोस करना होता है। यहाँ एक्सेल एप्लिकेशन, क्लाइंट एप्लिकेशन हुआ और दूसरा एप्लिकेशन सर्वर एप्लिकेशन हुआ। सर्वर एप्लिकेशन के ऑब्जेक्टस के एक्सपोसिंग के लिए एपीआई का उपयोग किया जाता है। एपीआई के अंतर्गत एक्सपोज़ होने योग्य ऑब्जेक्ट्स और मेथड्स होते हैं। 

अभी हमने बात डेस्कटॉप एप्लीकेशन का किया। बिल्कुल इसी तरीके से जुड़ा हुआ मामला वेब एप्लीकेशन के बीच में भी हो सकता है। जब कोई एक वेब एप्लिकेशन दूसरी वेब एप्लिकेशन के साथ इंटरेक्शन करना चाहता है तो उसके लिए उसे एपीआई अर्थात एप्लीकेशन प्रोग्रामिंग इंटरफेस की जरूरत पड़ती है। एप्लीकेशन के बीच में इंटरेक्शन के लिए बने ऐसे एपीआई को वेब एपीआई कहते हैं। 

जैसा कि हमने क्लाइंट सर्वर आर्किटेक्चर की बात की और यह बताया कि सर्वर अपने ऑब्जेक्ट और मेथड स्कोर क्लाइंट के सामने एक्सपोज करता है और क्लाइंट एप्लीकेशन उस ऑब्जेक्ट्स ओर मेथड को यूज करता है या कंज्यूम करता है। यहां यह बात याद रखने वाली है कि सर्वर अपने मेथड्स को एक्सपोज तो करता है परंतु उसकी इंप्लीमेंटेशन हिडन अर्थात छिपी हुई होती है।

वेब एपीआई के अंतर्गत भी जब कोई क्लाइंट एप्लीकेशन किसी सर्वर से कोई रिकवेस्ट करता है तो उसके लिए क्लाइंट एप्लीकेशन वेब एपीआई एप्लीकेशन सर्वर को युआरआई या यूआरएल भेजता है इस युआरआई के अंतर्गत ही वेब एपीआई के मेथड को एक्सपोज किया जाता है। और युआरआई के आधार पर तब वेब एपीआई एप्लीकेशन, क्लाइंट एप्लीकेशन को अपना वेब सर्विस प्रदान कर देता है।

वेब एप्लीकेशन एचटीटीपी प्रोटोकोल के अंतर्गत कार्य करते हैं और इन का कार्य मुख्य रूप से वेब सर्विसेज के रूप में सर्वर पर उपलब्ध डाटा को क्लाइंट एप्लीकेशन को भेजना होता है। क्लाइंट एप्लीकेशन वेब ब्राउज़र हो सकता है या कोई मोबाइल एप्लीकेशन अथवा इंटरनेट ऑफ थिंग्स या कोई अन्य एप्लीकेशन भी हो सकता है। जब क्लाइंट एप्लीकेशन के पास डाटा जाती है तब वह डाटा क्लाइंट एप्लीकेशन अपनी जरूरत के अनुसार रिप्रेजेंट कर देती है। 

अब आपको यह जानना जरूरी है कि जितने भी वेब एप्लीकेशन होते हैं वह किसी न किसी प्रोटोकॉल पर आधारित होते हैं। आमतौर पर जो भी वेब प्रोटोकॉल प्रचलित है वह एचटीटीपी प्रोटोकोल है। इसके अलावा वेब के अंतर्गत एफटीपी प्रोटोकोल, एसएमटीपी प्रोटोकोल, टेलनेट, गोफर, POP, UDP, IP, TCP इत्यादि अनेको प्रोटोकोल भी है लेकिन लगभग 70 से 80% वेव प्रोटोकॉल्स एचटीटीपी प्रोटोकोल है अर्थात जितने भी वेब एप्लीकेशंस होते हैं उनमें एचटीटीपी प्रोटोकोल बहुतायत है। ऐसे वेब एप्लिकेशन को हम एचटीटीपी आधारित एप्लिकेशन कहते हैं। इसके अलावा एफटीपी एप्लीकेशन, एसएमटीपी एप्लीकेशन और अन्य दूसरे प्रोटोकॉल पर आधारित एप्लीकेशन भी बनते हैं लेकिन हम अपना ध्यान एसटीटीपी आधारित वेब एप्लीकेशन पर केंद्रित करेंगे क्योंकि ऐसे वेब एप्लिकेशन ही मुख्य रूप से उपयोग होते हैं।  

वेब एप्लिकेशन को समझने के लिए अथवा उस एप्लीकेशन की प्रोग्रामिंग करने के लिए एचटीटीपी प्रोटोकोल का ज्ञान बहुत जरूरी है, खासकर वेब एपीआई को बनाने के लिए। वेब एपीआई में एचटीटीपी प्रोटोकोल से जुड़े कई सारी बातों का ध्यान रखना होता है।

जब हम वेब एप्लिकेशन की बात करते हैं तो उसमें रेस्टफुल वेब एप्लिकेशन की बात आती है। रेस्टफुल वेब एप्लीकेशन ऐसे वेब एप्लीकेशन है जो रेस्ट के सिद्धांत पर आधारित है। रेस्ट का सिद्धांत क्या है? रेस्ट का सिद्धांत कोई तकनीक या टेक्नोलॉजी नहीं है। बस यह एक सैद्धांतिक आधार है जिस आधार पर कोई भी वेब एप्लीकेशन बनता है। कोई जरूरी नहीं कि सारे ही वेब एप्लीकेशन रेस्ट के सिद्धांत पर आधारित हो लेकिन जो भी वेब एप्लिकेशन रेस्ट के सिद्धांत पर आधारित होते हैं उनको हम रेस्टफुल वेब एप्लिकेशन कहते हैं। 

अब कई बार ऐसा भी होता है कि कोई वेब एप्लिकेशन रेस्ट के सारे सिद्धांतों का अनुपालन न किया गया हो, ऐसे वेब एप्लिकेशन को हम पार्सियल रेस्ट एप्लीकेशन या सिंपली रेस्ट एप्लीकेशन कह सकते हैं ना कि उसे रेस्टफुल वेब एप्लीकेशन कहेंगे। रेस्टफुल वेब एप्लीकेशन में पूर्णरूप से रेस्ट के सिद्धांतों का अनुपालन किया जाता है। 

रेस्ट का सिद्धांत क्या है? 
REST रेस्ट का शाब्दिक अर्थ है Representational State Transfer

अब हम देखेंगे कि रेस्ट का सिद्धांत क्या है। रेस्ट का सिद्धांत यह कहता है कि जो वेब एप्लीकेशन है उसमें जो सिस्टम बना है वह सिस्टम क्लाइंट और सर्वर आधारित सिस्टम है अर्थात इस सिस्टम में दो हिस्से हैं एक क्लाइंट हिस्सा दूसरा सर्वर हिस्सा । क्लाइंट जो है वह सर्वर से किसी सर्विस के लिए आग्रह करता है और सर्वर उस आग्रह या रिक्वेस्ट को पूरा प्रोसेस करने के बाद क्लाइंट के पास भेज देता है। क्लाइंट सर्वर आर्किटेक्चर को रेस्टफुल वेब सर्विस में जगह दिया गया है। क्लाइंट के रूप में कोई भी user-agent हो सकता है जैसे वेब ब्राउजर और सर्वर के अंतर्गत कोई भी वेब सर्वर जैसे कि आईआईएस सर्वर, अपाचे सर्वर इत्यादि हो सकता है। यह तो पहली खूबी हुई रेस्टफुल वेब सर्विस की जिसमें क्लाइंट सर्वर आधारित सिस्टम को मान्यता दी गई है। दूसरी बात आती है स्टेटलेसनेस की। 


स्टेटलेसनेस की खूबी Stateless

स्टेटलेसनेस का मतलब है कि सर्वर क्लाइंट के भेजे गए किसी भी रिक्वेस्ट डाटा को अपने पास स्टोर करके नहीं रखता है। स्टेट अर्थात डाटा को सर्वर में स्टोर करके नहीं रखा जाता है इसके लिए सेसन या कुकी ऑब्जेक्ट जैसी चीजों का प्रयोग नहीं होता है। आमतौर पर एमवीसी एप्लीकेशन में स्टेट मैनेजमेंट के लिए सेशन ऑब्जेक्ट और कुकी ऑब्जेक्ट का उपयोग किया जाता है इन ऑब्जेक्ट की सहायता से एमवीसी एप्लीकेशन स्टेट मैनेजमेंट करता है जबकि वेव एपीआई के अंतर्गत स्टेट मैनेजमेंट नहीं किया जाता है। 


क्लाइंट अपनी रिक्वेस्ट को सर्वर के पास भेजता है सर्वर उस रिक्वेस्ट को प्रोसेस करता है और रिक्वेस्ट को प्रोसेस करने के बाद रिस्पांस को क्लाइंट के पास वापस भेज देता है क्लाइंट की किसी भी डाटा या स्टेट को अपने पास सर्वर नहीं रखता है।


यूनिफॉर्म इंटरफ़ेस  की खूबी 

रेस्टफुल आर्किटेक्चर के अंतर्गत तीसरी खूबी यूनिफॉर्म इंटरफ़ेस की होती है यूनिफॉर्म इंटरफेस से अभिप्राय क्या है देखिए जब यूज़र user-agent की सहायता से रिक्वेस्ट को सर्वर के पास भेजता है तो उसके लिए वह यूआरआई या यूआरएल का उपयोग करता है। रेस्टफुल वेब आर्किटेक्चर के अंतर्गत यूआरआई या यूआरएल बहुत ही इन्फॉर्म पैटर्न में लिखे जाते हैं जिसके कारण किसी किसी भी आम व्यक्ति को समझना या यूज करना आसान होता है। उदाहरण के लिए निम्न यूआरएल को देखिए 

api/Employee

api/Employee/1

इन यूआरएल को देख कर सहज ही अंदाज लगाया जा सकता है की क्लाइंट अपने सर्वर से क्या रिक्वेस्ट कर रहा है।


कैश की खूबी  Cacheable  

रेस्टफुल आर्किटेक्चर की एक और भी खूबी होती है वह खूबी है केस प्रॉपर्टी। इससे अभिप्राय यह है कि सर्वर के द्वारा भेजे गए रिस्पांस डाटा को कैश मेमोरी में यूजर एजेंट द्वारा निश्चित अवधि के लिए स्टोर करके रखना ताकि यूज़र भविष्य में उस डाटा का पुनः उपयोग कर सके। इसका फायदा यह होता है क्लाइंट को उसी रिक्वेस्ट को दोबारा सर्वर के पास नहीं भेजना होता है जिसके कारण सर्वर पर लोड नहीं पड़ता, बैंडविड्थ भी सही रहता है, एप्लिकेशन की एफिशिएंसी भी सही रहती है इत्यादि। अतः एप्लीकेशन को उपयोगिता भी बढ़ जाती है। 


इस तरीके से हमने रेस्ट की चार खूबियों या चारित्रिक विशेषताओं को देखा। आगे हम देखेंगे की किस तरह इन विशेषताओं का उपयोग माइक्रोसॉफ्ट के एएसपी डॉट नेट वेब एपीआई में होता है।

भाग २ 

जैसा कि हमने पिछले लेख में देखा कि वेब एप्पलीकेशन और वेब एपीआई एप्पलीकेशन के लिए एचटीटीपी प्रोटोकोल का ज्ञान होना जरूरी है। इस लेख में हम एचटीटीपी प्रोटोकोल के बारे में देखेंगे जितना ज्ञान हमें वेब एपीआई के लिए आवश्यक है। एचटीटीपी प्रोटोकॉल का उपयोग इंटरनेट पर कम्युनिकेशन प्रोटोकोल के रूप में किया जाता है। इंटरनेट से जुड़े एप्लिकेशन एचटीटीपी प्रोटोकॉल का पालन आपस मे सम्प्रेषण अर्थात कम्युनिकेशन के लिए करते हैं।

जैसा कि हमने देखा कि क्लाइंट सर्वर मॉडल के अंतर्गत क्लाइंट के द्वारा सर्वर को मेसेज प्रेषित किया जाता है। सम्प्रेषण की शुरुआत सदैव क्लाइंट एप्लिकेशन द्वारा ही किया जाता है। सर्वर के द्वारा क्लाइंट के मेसेज का रिप्लाई प्रेषित किया जाता है। इन्फॉर्मेशन या डाटा आदान प्रदान के लिए क्लाइंट सर्वर के बीच में संप्रेषण होता है। इसे डाटा कम्युनिकेशन या क्लाइंट सर्वर कम्युनिकेशन कहते हैं। मैसेज की फॉर्मेट के बारे में हम आगे समझेंगे, वेब एप्लिकेशन के अंतर्गत मैसेज के फॉर्मेट को समझना बहुत ही आवश्यक है।

एचटीटीपी का फुलफॉर्म हाइपरटेक्स्ट ट्रांसफर प्रोटोकोल है। इसका शाब्दिक अर्थ हुआ कि हाइपरटेक्स्ट को ट्रांसफर करने के लिए उपयोग किए जाने वाला प्रोटोकोल। इसमें कुछ बातें समझने वाली है। सबसे पहले यह समझना है कि हाइपरटेक्स्ट होता क्या है और दूसरी बात यह समझना है कि प्रोटोकॉल क्या होता है। 

हाइपरटेक्स्ट का अभिप्राय क्या है?

देखिए, इंटरनेट के उदय के समय एचटीएमएल का विकास हुआ। एचटीएमएल जिसका फुलफॉर्म है हाइपरटेक्स्ट मार्कअप लैंग्वेज। इस लैंगुएज का विकास इंटरनेट के अग्रदूत टीम बर्नर ली द्वारा इंटरनेट पर कम्युनिकेशन माध्यम के रूप में हुआ था। इंटरनेट के शुरुआती दिनों में कम्युनिकेशन के दौरान केवल टेक्स्ट का ही आदान प्रदान होता था और टेक्स्ट के बीच के संबंध को स्थापित करने के लिए लिंक बने होते थे जिनको हाइपरलिंक कहते हैं। ऐसे टेक्स्ट को हाइपरटेक्स्ट कहा जाता था जिनके द्वारा विभिन्न टेक्स्ट के बीच में संबंध स्थापित होता था। इसे जुड़ा हुआ एक और भी शब्द है  हाइपरटेक्स्ट रीफरेंस जिसे संक्षेप में एचआरईएफ कहते हैं। हाइपरटेक्स्ट रीफरेंस के द्वारा किसी लिंक को क्लिक करने पर किस दूसरे टेस्ट पर पहुंचा जा सकता है उसका रिफरेंस एचआरईएफ के अंतर्गत दिया जाता है। इस तरह अरैखिक सम्प्रेषण को करना सम्भव हुआ।

शुरुआती दिनों में वेब कम्युनिकेशन के अंतर्गत केवल टेक्स्ट का ही आदान-प्रदान कम्युनिकेशन मीडियम के रूप में होता था। परंतु जैसे जैसे इंटरनेट का विकास हुआ तब ना केवल टेक्स्ट बल्कि ऑडियो वीडियो और अन्य मीडिया का भी उपयोग कम्युनिकेशन के रूप में होने लगा। अब हाइपरटेक्स्ट की जगह हाइपरमीडिया शब्द का प्रयोग किया जाने लगा परंतु एचटीटीपी प्रोटोकॉल के अंतर्गत हाइपरटेक्स्ट वर्ड को ना बदला गया जबकि होना यह चाहिए था कि हाइपरटेक्स्ट ट्रांसफर प्रोटोकोल को हाइपरमीडिया ट्रांसफर प्रोटोकॉल कहा जाता परंतु पुराना एक्रोनीम ही प्रचलित रहा क्योंकि एचटीटीपी शब्द अत्यंत ही रूढ़ हो चला था और इसी कारण अब भी एचटीटीपी को हाइपरटेक्स्ट ट्रांसफर प्रोटोकोल ही कहा जाता है। 

प्रोटोकॉल का अभिप्राय क्या है?
एचटीटीपी के अंतर्गत दूसरा शब्द महत्वपूर्ण शब्द प्रोटोकॉल है। प्रोटोकॉल से अभिप्राय लिखित और अलिखित नियम कानूनों अथवा शर्तों से होता है जिसका पालन किसी प्रक्रिया के अंतर्गत किया जाता है। उदाहरण के लिए, संप्रेषण प्रक्रिया में जिन नियम कानूनों का पालन किया जाता है, वे संप्रेषण प्रोटोकॉल है। उदाहरण के लिए यदि कोई व्यक्ति किसी दूसरे व्यक्ति से बातचीत करना चाहता है तो उसके लिए उसे कई सारे प्रोटोकॉल का पालन करना होता है। जैसे दोनों व्यक्ति के बीच प्रयोग किए जाने वाले संप्रेषण की भाषा समान होनी चाहिए। साथ ही, अगर पहला व्यक्ति कोई बात कहता है तो दूसरे व्यक्ति को उसकी बात का जवाब देना जरूरी होता है तभी संप्रेषण हो सकता है। इसका अर्थ यह है कि संप्रेषण के अंतर्गत प्रेषक और रिसीवर दोनों की एक्टिविटी जरूरी है। प्रेषक मैसेज भेजता है और रिसीवर उस मैसेज पर अपनी प्रतिक्रिया प्रेषक के पास भेज देता है। अगर यह दोनों बातें ना हो तो कम्युनिकेशन अर्थात संप्रेषण संभव नहीं होगा। तीसरी एक और भी महत्त्वपूर्ण बात है, वह यह है कि दोनों के बीच में कम्युनिकेशन के दौरान रिक्वेस्ट रेस्पांस की समय अवधि में फर्क ज्यादा नहीं होना चाहिए।   कहने का अर्थ यह है कि जब प्रेषक का मैसेज रिसीवर के पास पहुंचता है तो रिसीवर एक समय अवधि के भीतर प्रेषक के पास रिप्लाई दे देता है। अगर ऐसा ना हो तो संप्रेषण संभव नहीं होगा। 

एचटीटीपी रिक्वेस्ट और एचटीटीपी रिस्पांस
ऊपर जिन तीन बातों का उल्लेख उदाहरण में किया गया है बिल्कुल यही बात इंटरनेट पर क्लाइंट सर्वर एप्लिकेशन के बीच में संप्रेषण के दौरान होता है। जब कोई क्लाइंट एप्लीकेशन सर्वर एप्लीकेशन के पास कोई मैसेज भेजता है तो सर्वर एप्लीकेशन उस मैसेज पर अपनी प्रतिक्रिया व्यक्त करता है और दोनों client-server के बीच में कम्युनिकेशन किए लिए प्रयोग किए जाने वाले लैंग्वेज समान होते हैं। क्लाइंट जब मैसेज को सर्वर के पास भेजता है तो उसे रिक्वेस्ट कहा जाता है और सर्वर उस रिक्वेस्ट पर रिप्लाई करता है तो उसे रिस्पांस कहा जाता है। एचटीटीपी प्रोटोकोल के अंतर्गत इस तरह के रिक्वेस्ट और रिस्पांस को एचटीटीपी रिक्वेस्ट और एचटीटीपी रिस्पांस कहा जाता है और ऐसे मैसेज को एचटीटीपी मैसेज कहा जाता है।

एचटीटीपी कॉन्टेक्स्ट
एचटीटीपी प्रोटोकॉल के अंतर्गत क्लाइंट और सर्वर के बीच में मैसेज संप्रेषण के दौरान एक वातावरण तैयार होता है जिसको एचटीटीपी कॉन्टेक्स्ट कहते हैं। एचटीटीपी कॉन्टेक्स्ट के अंतर्गत क्लाइंट और सर्वर से सम्बंधित कई बातें आ जाती है। उदाहरण के लिए, क्लाइंट किस तरह के ब्राउज़र या user-agent का उपयोग कर रहा है। मैसेज को भेजने के लिए किस एचटीटीपी VERB का उपयोग किया गया, रिक्वेस्ट के अंतर्गत किस भाषा में, किस एन्कोडिंग में डाटा की प्राप्ति के लिए रिक्वेस्ट किया गया इत्यादि। एचटीटीपी Verb के बारे में आगे चर्चा की गई है। इस तरीके से एक सर्वर के अंतर्गत सर्वर ने किस तरह का किस टाइप का डाटा रिप्लाई किया उसके भी सब टाइप इत्यादि कई बातों का संबंध एचटीटीपी कॉन्टेक्स्ट से होता है।

मैसेज की संरचना


एचटीटीपी रिक्वेस्ट मैसेज


एचटीटीपी रेस्पॉन्स मैसेज


एचटीटीपी क्रियाएँ HTTP Verbs

एचटीटीपी क्रिया से अभिप्राय ऐसे ऑपरेशन से है जिसके क्रियान्वयन के लिए क्लाइंट एप्लीकेशन द्वारा सर्वर एप्लीकेशन से आग्रह किया जाता है। जब क्लाइंट एप्लीकेशन  द्वारा मैसेज भेजा जाता है तब मैसेज में इस क्रिया का उल्लेख होता है।

GET - इस ऑपरेशन का उपयोग वेब सर्वर से डेटा प्राप्त करने के लिए किया जाता है।

POST - इस ऑपरेशन का उपयोग वेब सर्वर पर डेटा का एक नया आइटम बनाने के लिए किया जाता है।

PUT - इस ऑपरेशन का उपयोग वेब सर्वर पर डेटा के किसी आइटम को अपडेट करने के लिए किया जाता है।

PATCH - इस ऑपरेशन का उपयोग वेब सर्वर पर डेटा के एक आइटम को अपडेट करने के लिए किया जाता है, जिसमें निर्देशों के एक सेट का वर्णन किया जाता है कि आइटम को कैसे संशोधित किया जाना चाहिए।  नमूना आवेदन में इस क्रिया का उपयोग नहीं किया जाता है।

DELETE - इस ऑपरेशन का उपयोग वेब सर्वर पर डेटा के किसी आइटम को हटाने के लिए किया जाता है।

अंतिम बार अद्यतन ८/९/२०२१

© अजीत कुमार, सर्वाधिकार सुरक्षित।

इस आलेख को उद्धृत करते हुए इस लेख के लिंक का भी विवरण दें। इस आलेख को कॉपीराइट सूचना के साथ यथावत साझा करने की अनुमति है। कृपया इसे ऐसे स्थान पर साझा न करें जहाँ इसे देखने के लिए शुल्क देना पडे।


Web Technologies : CSS Selectors


वेब डिजाइनिंग के अंतर्गत कैस्केडिंग स्टाइल शीट्स जिसको संक्षेप में सीएसएस कहते हैं, एक वेब डिजाइनिंग तकनीक है, जिसकी सहायता से वेबपेज की स्टायलिंग व डिजाइनिंग की जाती है। CSS फ़ाइल का एक्सटेंशन .CSS होता है। इस फ़ाइल का उपयोग किसी वेबसाइट के पेजों की स्टायलिंग करने के लिए किया जाता है। CSS वस्तुतः स्टायलिंग के नियमों को उपलब्ध कराता है जिसका उपयोग वेबपेजों की डिजाइन करने के लिए किया जाता है। इसका मुख्य उद्देश्य पेजों की प्रेजेंटेशन को मनोभावन बनाना है। 

किसी वेबपेज में CSS यूज करने के लिए css फ़ाइल बनाना अनिवार्य नहीं है। किसी वेबपेज के भीतर <style> टैग के भीतर CSS रूल्स को लिखकर पेज की स्टायलिंग की जा सकती है। जब CSS रूल्स को .CSS फ़ाइल में लिखा गया होता है तो उसे external CSS कहते हैं जबकि style टैग के भीतर css रूल्स होने पर उसे inernal CSS कहते हैं। ऐसा सम्भव है कि किसी वेबसाइट में external और internal CSS दोनों का उपयोग किया गया हो। इस बारे में हम आगे समझेंगें।

वेबपेज के जिस एलिमेंट के ऊपर सीएसएस को अप्लाई करना होता है, उसके लिए, सबसे पहले उस एलिमेंट को या एलिमेंट्स को सेलेक्ट करना होता है। इसके लिए सीएसएस सिलेक्टर्स को समझना जरूरी है।

वेब पेज के विभिन्न एलिमेंट्स को सेलेक्ट करने के लिए कुछ रूल्स बनाए गए हैं और एलिमेंट्स को सेलेक्ट करने के लिए जो रूल्स है वह सिलेक्टर्स पर अप्लाई किया जाता है। रूल्स को कर्ली ब्रेस { } के भीतर लिखा जाता है। जैसे selector {attribute:value; }  

ध्यान दीजिए कि किसी सेलेक्टर के विभिन्न प्रकार के attributes होते हैं। किसी एट्रीब्यूट की value सेट करने के लिए attribute और वैल्यू को कोलन से separate करते हैं और colon के बाद वैल्यू लिखते हैं। एट्रीब्यूट वैल्यू pair के इस स्टेटमेंट को semicolon से terminate किया जाता है। स्टेटमेंट्स को एक ही लाइन में लिखा जा सकता है अथवा प्रत्येक स्टेटमेंट को अलग अलग लाइन में लिखा जा सकता है।
Selector { 
attribute1:value; attribute2:value; 
}

यदि किसी एट्रीब्यूट के एक से ज्यादा values हैं तो उन values को comma से separate करते हैं। 
Selector { 
attribute:value1, value2, value3;
attribute2:value;
 }

Compound word दो या उससे अधिक वर्ड्स से बनते हैं और वर्ड्स के बीच मे स्पेस होता है जैसे Times New Roman । यदि किसी एट्रीब्यूट का value कंपाउंड वर्ड हो तो उसको single quota में लिखते हैं।
selector { attribute: 'compound word'; }

सीएसएस के अंतर्गत कई प्रकार के सिलेक्टर्स का प्रयोग किया जाता है। अलग-अलग प्रकार के सिलेक्टर्स के लिए अलग-अलग तरह के सिंबल्स का प्रयोग किया जाता है। उदाहरण के लिए यूनिवर्सल सिलेक्टर के लिए * symbol का प्रयोग किया जाता है जबकि आईडी सिलेक्टर के लिए # सिंबल का प्रयोग किया जाता है। इसी तरह, क्लास सिलेक्टर के लिए डॉट(.) सिंबल का प्रयोग किया जाता है जबकि चाइल्ड सेलेक्टर के लिए > सिंबल का प्रयोग किया जाता है। इन सब बातों को हम आगे लेख में उदाहरण सहित देखेंगे।

Universal selector *
सबसे पहला सिलेक्टर है यूनिवर्सल सिलेक्टर। यूनिवर्सल सिलेक्टर की सहायता से वेबपेज के सभी एलिमेंट्स को एकसाथ सिलेक्ट किया जाता है। कई बार ऐसा होता है कि हम वेबपेज के सभी एलिमेंट्स के किसी कॉमन एट्रीब्यूट को एक समान स्टाइलिंग देना चाहते हैं तो इसके लिए यूनिवर्सल सेक्टर का उपयोग किया जाता है। यूनिवर्सल सिलेक्टर के लिए * सिंबल का प्रयोग किया जाता है। ऐसा बहुत कम होता है कि हम पूरे वेब पेज पर सभी एलिमेंट्स के लिए एक समान स्टाइलिंग करें, अतः यूनिवर्सल सिलेक्टर का प्रयोग बहुत कम होने का चांस होता है। उदाहरण के लिए
*{
    margin:0px;
}

Id selector #
इसके बाद दूसरे प्रकार का सिलेक्टर है जिसे आईडी सिलेक्टर कहते हैं। आईडी सिलेक्टर की सहायता से हम वेबपेज के किसी एलमेंट को उसके आइडी के आधार पर सिलेक्ट करते हैं और स्टायलिंग करते हैं। जैसा कि हम जानते हैं कि किसी भी एलिमेंट का आईडी यूनिक होता है, अतः आईडी सिलेक्टर की मदद से हम किसी एक एलमेंट को ही स्टाइलिंग दे सकते हैं। आईडी किसी एलिमेंट का एक एट्रिब्यूट होता है। उदाहरण के लिए

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS Selectors</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <p> Paragraph before primary div...</p>
    <div id="primary-div"> 
        Lorem, ipsum dolor sit amet consectetur adipisicing elit. Magni qui laborum veniam unde nam laboriosam ipsum distinctio perspiciatis? Provident, ipsum!
        <p>First Paragraph inside div tag...</p>
    </div>
    <div class="secondary">
        Lorem, ipsum dolor sit amet consectetur adipisicing elit. Ratione, officiis!
        <p>It is a paragraph inside 2nd div...</p>
        <p>It is another paragraph inside 2nd div...</p>
    </div>
</body>
</html>


#primary-div {
    background-color: yellow;
}

Element selector
एलिमेंट सिलेक्टर का उपयोग करके हम उस नाम के जितने भी एलिमेंट वेबपेज में हैं उन सभी एलिमेंट्स पर हम स्टाइलिंग अप्लाई कर सकते हैं। एलिमेंट सेलेक्टर को हम टैग सेलेक्टर भी कह सकते हैं। उदाहरण के लिए

p{
    color: red;
}




Grouping selector
Comma separator is used to group different selectors.
एलिमेंट्स ग्रुपिंग सिलेक्टर की मदद से हम विभिन्न प्रकार के एलिमेंट्स को ग्रुप कर लेते हैं और उन पर स्टायल अप्लाई करते हैं। मान लीजिए आपके पास कुछ अलग अलग एलिमेंट्स हैं और उन सभी एलिमेंट्स पर एक ही जैसा स्टाइल अप्लाई करना है तो ऐसी हालत में ग्रुपिंग सिलेक्टर का प्रयोग करते हैं। एलिमेंट्स को ग्रुप करने के लिए हम कौमा सेपरेटर का प्रयोग करते हैं। उदाहरण के लिए

<body>
    <h1>Heading First</h1>
    <p> Paragraph before primary div...</p>
    <div class="secondary">
        Lorem, ipsum dolor sit amet consectetur adipisicing elit. Ratione, officiis!
        <p>It is a paragraph inside 2nd div...</p>
        <p>It is another paragraph inside 2nd div...</p>
    </div>
</body>

/* grouping selector */
h1, p {
    text-transform: uppercase;
}



Class Selector .
Dot operator is used to create a class selector.
सबसे महत्वपूर्ण सिलेक्टर है क्लास सिलेक्टर। क्लास सिलेक्टर सबसे ज्यादा प्रयोग किए जाने वाला स्टाइलिंग सिलेक्टर है। क्लास सिलेक्टर का अभिप्राय यह है कि हम वेब पेज के अलग अलग एलिमेंट्स को समान क्लास एट्रिब्यूट देकर हम उस क्लास के आधार पर स्टाइलिंग कर सकते हैं। जिस जिस एलिमेंट में क्लास का नाम समान होंगा उन उन एलिमेंट पर उस क्लास के नाम से बना स्टाइलिंग एप्लाई हो जाएगा।

किसी खास एलिमेंट के ऊपर क्लास सिलेक्टर का प्रयोग करने के लिए हम Element.Class सिलेक्टर का प्रयोग करते हैं। उदाहरण के लिए

<body>
    <h1>Heading First</h1>
    <p> Paragraph before primary div...</p>
    <div class="secondary">
        Lorem, ipsum dolor sit amet consectetur adipisicing elit. Ratione, officiis!
        <p>It is a paragraph inside 2nd div...</p>
        <p>It is another paragraph inside 2nd div...</p>
    </div>
    <div>
        <h2>heading level Two Again</h2>
    </div>
</body>

/* class selector */
.secondary {
    color: blue;
}



Child selector >
Greater than symbol is used to create a child selector.
चाइल्ड सेलेक्टर से अभिप्राय वेबपेज के एलिमेंट्स के बीच पैरंट चाइल्ड रिलेशनशिप को ध्यान रखते हुए जो चाइल्ड एलिमेंट्स हैं उन चाइल्ड एलिमेंट्स पर स्टाइलिंग का प्रयोग करना है। उदाहरण के लिए
<body>
    <h1>Heading First</h1>
    <p> Paragraph before primary div...</p>
    <div class="secondary">
        Lorem, ipsum dolor sit amet consectetur adipisicing elit. Ratione, officiis!
        <p>It is a paragraph inside 2nd div...</p>
        <p>It is another paragraph inside 2nd div...</p>
    </div>
    <div>
        <h2>heading level Two Again</h2>
    </div>
</body>

/* child selector */
div > p {
    color:blue;
}





Descendant selector
Space operator is used to create a descendant selector.
डिसेंडेंट सिलेक्टर। असेंडिंग का अर्थ चढ़ना होता है और डिसेंडिंग का अर्थ उतरना होता है। जिस प्रकार एक पिता के पुत्र के पुत्र के पुत्र इत्यादि हो सकते हैं तो यह सारे पुत्र प्रथम पिता के डिसेंडेंट माने जाएंगे। ठीक इसी प्रकार जब किसी भी वेबपेज के भीतर वेब एलिमेंट्स के बीच में पूर्वज और पश्चज/अगली पीढ़ी का एक लंबा संबंध हो तो आने वाली पीढ़ी के एलिमेंट को सेलेक्ट करने के लिए डिसेंडेंट सिलेक्टर का प्रयोग किया जाता है। चाइल्ड सिलेक्ट की मदद से जहां एक ओर बिल्कुल अगली next पीढ़ी का सिलेक्शन होता है, ठीक उसी तरह, उससे थोड़ा आगे जाकर डिसेंडेंट सिलेक्टर के अंतर्गत किसी एलिमेंट के जितने भी अगले चाइल्ड एलिमेंट से है और उस चाइल्ड की चाइल्ड है, उन सभी एलिमेंट्स को सिलेक्ट किया जा सकता है।डिसेंडेंट सेलेक्टर के लिए हम ब्लेंक स्पेस ऑपरेटर का उपयोग करते हैं। इस बात को हम उदाहरण की सहायता से ज्यादा अच्छे तरीके से समझ सकते हैं। उदाहरण के लिए

<body>
    <h1>Heading First</h1>
    <p> Paragraph before primary div...</p>
    <div class="secondary">
        Lorem, ipsum dolor sit amet consectetur adipisicing elit. Ratione, officiis!
        <p>It is a paragraph inside 2nd div...</p>
        <h2> heading level Two</h2>
        <p>It is another paragraph inside 2nd div...</p>
    </div>
    <div>
        <h2>heading level Two Again</h2>
    </div>
</body>

/* Descendant selector */
div  p {
    color:blue;
}



Siblings selector +
Plus operator is used to create a Siblings selector.
सिबलिंग सेलेक्टर। चाइल्ड कलेक्टर और डिसेंडिंग कलेक्टर के अंतर्गत जहाँ अगली पीढ़ी के एलिमेंट्स को सिलेक्ट करते हैं वही सिबलिंग सिलेक्टर के द्वारा हम एक ही पीढ़ी के एलिमेंट्स को सेलेक्ट कर सकते हैं। जिस प्रकार एक पिता के कई पुत्र पुत्रियां होते हैं, उन पुत्र पुत्रियों को हम सिबलिंग कहते हैं। ठीक इसी प्रकार वेबपेज के जो अलग-अलग एलिमेंट्स है उन अलग-अलग एलिमेंट्स के बीच में जो संबंध होता है वह संबंध या तो पिता पुत्र संबंध होता है अथवा एक ही पीढ़ी के सिबलिंग का संबंध होता है। सिबलिंग भी दो तरह के माने जाते हैं। उदाहरण के लिए
<body>
    <h1>Heading First</h1>
    <p> Paragraph before primary div...</p>
    <div class="secondary">
        Lorem, ipsum dolor sit amet consectetur adipisicing elit. Ratione, officiis!
        <p>It is a paragraph inside 2nd div...</p>
        <h2> heading level Two</h2>
        <p>It is another paragraph inside 2nd div...</p>
    </div>
    <div>
        <h2>heading level Two Again</h2>
    </div>
</body>
/* Siblings selector */
h2 + p {
    color:blue;
}



Adjacent Siblings + और general Siblings ~
जब दो सिबलिंग एलिमेंट्स बिल्कुल एक दूसरे के अगल-बगल में होते हैं ऐसी सिब्लिंग्स को एडजसेन्ट सिबलिंग कहते हैं अन्यथा उन्हें जनरल सिबलिंग के अंतर्गत माना जाएगा। इस तथ्य को हम उदाहरण से ज्यादा अच्छी तरीके से समझ सकते हैं। उदाहरण के लिए

कैस्केडिंग स्टाइल शीट्स का उपयोग किसी वेब पेज में करने के 3 तरीके होते हैं। 

External style sheet or Linked style
पहला तरीका यह है जिसके अंतर्गत किसी बाहरी स्टाइल शीट अर्थात एक css फ़ाइल जिसका फ़ाइल एक्सटेंशन css होता है को उस वेबपेज में लिंक कर दिया जाता है जिस वेबपेज के एलिमेंट्स पर css की स्टाइल अप्लाई करनी होती है। ऐसा करने के लिए link टैग का उपयोग उस वेबपेज के head टैग के भीतर किया जाता है।

Embedded style
किसी भी वेबपेज पर सीएसएस को अप्लाई करने का दूसरा तरीका <style> टैग है। इसके लिए स्टाइल टैग्स के भीतर css को लिखा जाता है।

Inline style
किसी वेबपेज के अंतर्गत सीएसएस को अप्लाई करने का तीसरा तरीका यह है कि जिस एलिमेंट के ऊपर सीएसएस अप्लाई करना है, उस एलिमेंट के भीतर स्टाइल अटरीब्यूट के द्वारा सीएसएस को परिभाषित कर दिया जाता है। इस तरीके से जब सीएसएस को परिभाषित किया जाता है तो वह सीएसएस केवल उसी एलिमेंट के ऊपर अप्लाई होता है।

लेखक अजीत कुमार

Tuesday, August 3, 2021

Simple Design Pattern in Software Development

सिंपल फैक्ट्री डिजाइन पैटर्न एक बहुत ही उपयोगी और प्रचलित डिजाइन पैटर्न है। सिंपल फैक्ट्री डिजाइन पैटर्न के अतिरिक्त और भी कई तरह के मिलते जुलते डिजाइन पैटर्न है जैसे फैक्ट्री मेथड पैटर्न, एब्स्ट्रेक्ट फैक्ट्री पैटर्न इत्यादि।

इस लेख में हम सिंपल फैक्ट्री डिजाइन पैटर्न के बारे में अध्ययन करेंगे। 

सबसे पहले हमें यह समझना है की डिजाइन पैटर्न क्यों यूज़ किया जाता है। डिजाइन पैटर्न यूज करने के पीछे सबसे बड़ा कारण यह है कि इसके कारण एप्लिकेशन की एफिशिएंसी बढ़ जाती है। इस पैटर्न के यूज करने पर एप्लिकेशन में रेक्विरेमेंट चेंज होने पर एप्लिकेशन के अलग अलग कोड में ज्यादा परिवर्तन नहीं करना पड़ता है। 

जब हम क्लाइंट क्लास के भीतर किसी क्लास के ऑब्जेक्ट को क्रिएट करते हैं तब अगर भविष्य में उस क्लास के ऑब्जेक्ट के बजाय किसी अन्य क्लास के ऑब्जेक्ट को क्रिएट करना हो तो हमें कोड में जगह-जगह जाकर उस क्लास के कोड को परिवर्तित करना होगा जो कि एक बहुत ही मुश्किल कार्य होगा। इसी तरह अगर हमें क्रिएट किए हुए क्लास के कॉन्स्ट्रक्टर में पैरामीटर की संख्या को बढ़ाना घटाना इत्यादि हो तो भी हमें कोड में जगह-जगह जाकर उस क्रिएट ऑब्जेक्ट के कोड को परिवर्तित करना होगा जो कि एक दुःसाध्य कार्य होगा।

इन सब समस्याओं पर विचार करके यह देखा गया कि क्लाइंट क्लास के भीतर जब किसी ऑब्जेक्ट को क्रिएट करना हो जहां पर वह ऑब्जेक्ट किसी भी मिलते जुलते क्लास का हो सकता है तो ऐसी स्थिति में new ऑपरेटर के द्वारा ऑब्जेक्ट को क्रिएट करने की बजाए हम एक फैक्ट्री class का उपयोग करते हैं जो कि मिलते जुलते क्लास के किसी भी ऑब्जेक्ट को क्रिएट कर सकता है। इस तरीके से हमारा कोड किसी एक पार्टीकूलर क्लास के ऑब्जेक्ट से बाउंड न होकर फैक्ट्री क्लास से बाउंड हो जाता है और फैक्ट्री क्लास में ही ऑब्जेक्ट क्रिएट करने की लॉजिक इंप्लीमेंट होती है। 

किस हालत में किस क्लास के ऑब्जेक्टिव क्रिएट करना है फैक्ट्री क्लास के भीतर सटेटिक मेथड में दिया होता है, जिस मेथड के भीतर एक पैरामीटर भी होता है जो यह डिसाइड करता है कि किस क्लास को क्रिएट करना है। फैक्टरी क्लास का मेथड सटेटिक इसलिए दिया जाता है ताकि क्लाइंट क्लास के भीतर किसी क्लास के ऑब्जेक्ट को क्रिएट करते समय फैक्ट्री क्लास का ऑब्जेक्ट क्रिएट न करना पड़े। आमतौर पर किसी भी हेल्पर मेथड को static रखा जाता है। याद रखने वाली बात यह है कि फैक्ट्री क्लास का स्टैटिक मेथड इंटरफ़ेस को रिटर्न करता है। यह इंटरफेस अलग-अलग क्लास के कॉमन मेथड को अपने भीतर समाहित किया होता है।

अब हम सिंपल डिजाइन पैटर्न की बात करेंगे। सिंपल फैक्ट्री डिजाइन पैटर्न में हम एक फैक्ट्री क्लास बनाते हैं और यह फैक्ट्री क्लास अलग-अलग तरह के क्लासेज के ऑब्जेक्ट क्रिएट करने में सक्षम होता है। यह बात समझने वाली है कि जो अलग-अलग तरह के क्लासेज है उनमें क्रियाकलापों अर्थात methods की समानता होती है। इसका अभिप्राय यह है कि जो अलग अलग क्लास है उसमें एक ही तरह के कॉमन मेथड्स होते हैं। यह अलग बात है कि समान नाम के method होने पर भी उनकी इंप्लीमेंटेशन में भिन्नता होती है। 

इसका क्या अर्थ निकलता है? इसका अर्थ यह निकलता है कि जो यह अलग-अलग क्लासेज है उनका एक पैरंट क्लास या बेस क्लास पॉसिबल/ संभव है। इस बात को हम दिए हुए समस्या पर विचार करके समझ सकते हैं। मान लीजिए कि आपके पास 5 क्लास है जैसे फिजिक्स टीचर, केमिस्ट्री टीचर, बायोलॉजी टीचर, हिंदी टीचर और अंग्रेजी टीचर। इन पांचों टीचर क्लास में Teach नामक एक कॉमन मेथड है तो हम यह कह सकते हैं कि इन पांचों क्लासेज का एक बेस क्लास संभव है या इंटरफेस सम्भव है जो Teach मेथड को डिक्लेअर करेंगे।

आमतौर पर कॉमन मेथड को इंटरफ़ेस में डिक्लेअर कर देते हैं और प्रत्येक क्लास उस इंटरफेस को इंप्लीमेंट करता है। 

यहां तक हमने समझ लिया जो अलग-अलग क्लास हमारे पास है उसमें पहले मेथड डिफाइन था लेकिन अब हम जब उन कौमन मेथड को इंटरफेस में दे देते हैं तो उस इंटरफेस को यह सारे क्लास इम्प्लीमेंट करते हैं।

अब हम सबसे महत्वपूर्ण तथ्य पर बात करेंगे। हम एक फैक्ट्री क्लास बनाएंगे इस फैक्ट्री क्लास का नाम हम समस्या के अनुसार कुछ भी दे सकते हैं लेकिन इस फैक्ट्री क्लास की सबसे बड़ी खासियत यह होगी कि इसमें एक स्टैटिक मेथड होगा जो मेथड हमारे दिए गए इंटरफ़ेस को रिटर्न करेगा और इस मेथड में एक पैरामीटर होगा जिसके द्वारा क्लाइंट मेथड जिस क्लास के ऑब्जेक्ट को बनाना होगा उसके संबंध में मेथड पैरामीटर में इनपुट दे देगा। अब इस इनपुट के आधार पर फैक्ट्री क्लास के मेथड में सारे लॉजिक लिखा जाएगा और उस लॉजिक में यह होगा की new ऑपरेटर की सहायता से जिस क्लास का ऑब्जेक्ट क्रिएट करना है। फैक्ट्री क्लास में उसे क्रिएट करेंगे लेकिन इस क्रिएट हुए ऑब्जेक्ट को हम इंटरफ़ेस के वेरिएबल में assign कर देंगे। क्योंकि फैक्ट्री क्लास का मेथड इंटरफ़ेस को रिटर्न कर रहा है तो यह बात भी समझने लायक है की इंटरफ़ेस वेरिएबल में क्रिएट ऑब्जेक्ट को assign किया गया है।

अब इसका सबसे बड़ा फायदा यह होता है कि क्लाइंट के भीतर जब फैक्ट्री क्लास के स्टैटिक मेथड को इन्वोक अर्थात कॉल किया जाता है तब हम केवल इनपुट पैरामीटर देकर यह बता देते हैं कि हमें किस तरह का ऑब्जेक्ट क्रिएट करना है लेकिन ऑब्जेक्ट क्रिएट होने की सारी लॉजीक क्लाइंट को हिडन होती है। यह फैक्ट्री क्लास की रेस्पॉन्सिविटी होती है कि इनपुट पैरामीटर के आधार पर वह निश्चित करता है कि किस क्लास के ओबजेक्ट को क्रिएट करना है।

यद्यपि हमें सिंपल फैक्ट्री डिजाइन पैटर्न से कई सारी समस्याओं से निजात मिल जाता है परंतु फिर भी कई सारी समस्याएं बनी रह जाती है। उदाहरण के लिए जब क्लाइंट क्लास में फैक्ट्री क्लास के स्टैटिक मेथड को कॉल किया जाता है तो उस स्टैटिक मेथड में पैरामीटर पास किया जाता है जो निर्धारित करता है कि कौन से क्लास का ऑब्जेक्ट क्रिएट होगा तो अगर हम विचार करें तो हम पाएंगे कि यहां भी एक समस्या रह जाती है की इनपुट पैरामीटर को हमें कोड में बदलना होगा अगर हमें किसी अन्य तरह का ऑब्जेक्ट क्रिएट करना है। इस समस्या का हल हम किसी अन्य डिजाइन पैटर्न से कर सकते हैं इस पर हम आगे विचार करेंगे।

लेखक अजीत कुमार

Hot Topics