1. वस्तुएँ और वर्ग

आज आप थोड़ा जानेंगे कि एक सामान्य जावा प्रोग्राम कैसे काम करता है। यहां बड़ी खबर है: प्रत्येक जावा प्रोग्राम में कक्षाएं और वस्तुएं होती हैं।

आप पहले से ही जानते हैं कि कौन सी कक्षाएं हैं, लेकिन वस्तुएं क्या हैं?

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

यह जावा प्रोग्रामिंग में समान है।

ब्लूप्रिंट

एक प्रोग्रामर एक डिजाइनर की तरह होता है। एक डिजाइनर ब्लूप्रिंट बनाता है, और एक जावा प्रोग्रामर कक्षाएं लिखता है। भागों को ब्लूप्रिंट के आधार पर बनाया जाता है, और वस्तुओं को कक्षाओं के आधार पर बनाया जाता है।

सबसे पहले, हम क्लास लिखते हैं (ब्लूप्रिंट बनाते हैं), और फिर, जैसे ही प्रोग्राम चलता है, जावा मशीन इन क्लासेस के आधार पर ऑब्जेक्ट बनाती है। ठीक उसी तरह जैसे ब्लूप्रिंट से जहाजों का निर्माण होता है।

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

या यहाँ एक और समानता है...

बांबी

एंथिल इस बात का एक अच्छा उदाहरण है कि वस्तुएं कैसे परस्पर क्रिया करती हैं। चींटियों के एक साधारण बांबी में तीन वर्ग होते हैं: रानी, ​​​​सैनिक और कार्यकर्ता।

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

यह उत्तम उदाहरण है। एक सामान्य कार्यक्रम में सब कुछ बिल्कुल ऐसा ही होता है। एक प्राथमिक वस्तु है जो अन्य सभी वर्गों की वस्तुओं का निर्माण करती है। वस्तुएं एक दूसरे के साथ और कार्यक्रम की "बाहरी दुनिया" के साथ बातचीत करना शुरू कर देती हैं। वस्तुओं का व्यवहार आंतरिक रूप से हार्डकोड किया गया है।

ये दोनों समानताएं एक ही सिक्के के दो पहलू हैं। सच्चाई बीच में है। पहला उदाहरण (एक खाका और जहाजों के बारे में) एक वर्ग और उस वर्ग की वस्तुओं के बीच के संबंध को दर्शाता है। यह एक मजबूत उपमा है। दूसरा उदाहरण (एक एंथिल के बारे में) लिखित कक्षाओं और प्रोग्राम के चलते मौजूद वस्तुओं के बीच के संबंध को दर्शाता है।

आपको पहले प्रोग्राम में मौजूद प्रत्येक वस्तु के लिए कक्षाएं लिखनी होंगी, और फिर यह भी वर्णन करना होगा कि वे कैसे इंटरैक्ट करते हैं। हाँ, यह सही है, लेकिन यह सुनने में जितना आसान लगता है, उससे कहीं ज्यादा आसान है।

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

प्रलेखन

और आप कैसे जानते हैं कि विधियों को कौन सा डेटा पास करना है? तुमसे पहले जो लोग आए उन्होंने सब कुछ सोचा।

प्रत्येक वर्ग में आमतौर पर एक विवरण होता है जो बताता है कि इसे किस लिए बनाया गया था। साथ ही, प्रत्येक सार्वजनिक विधि में आमतौर पर एक विवरण होता है जो इंगित करता है कि यह क्या करता है और इसे किस डेटा को पास करने की आवश्यकता है।

एक वर्ग का उपयोग करने के लिए, आपको एक सामान्य विचार होना चाहिए कि यह क्या करता है। और आपको यह जानने की जरूरत है कि प्रत्येक विधि वास्तव में क्या करती है। लेकिन आपको यह जानने की बिल्कुल भी जरूरत नहीं है कि यह कैसे करता है। यह एक जादू की छड़ी की तरह है।

आइए फाइल कॉपी करने के लिए कोड पर एक नजर डालें:

c:\\data.txt फ़ाइल को c:\\result.txt फ़ाइल में कॉपी करना
package com.codegym.lesson2;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileCopy
{
   public static void main(String[] args) throws IOException
   {
      FileInputStream fileInputStream = new FileInputStream("c:\\data.txt");
      FileOutputStream fileOutputStream = new FileOutputStream("c:\\result.txt");

      while (fileInputStream.available() > 0)
      {
         int data = fileInputStream.read();
         fileOutputStream.write(data);
      }

      fileInputStream.close();
      fileOutputStream.close();
   }
}

यदि आप इस कोड को लाइन से लाइन पढ़ते हैं, तो आप अनुमान लगा सकते हैं कि यह सामान्य शब्दों में क्या करता है। हालांकि यह अनुभव और अभ्यास लेता है। कुछ समय बाद यह कोड आपको जाना-पहचाना और समझ में आने लगेगा।


2. एक कार्यक्रम डिजाइन करना

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

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

मुख्य बात यह समझना है कि आप किसके लिए कोड लिख रहे हैं। और आप अन्य प्रोग्रामर के लिए कोड लिखते हैं ।

उत्पाद विकास अनिवार्य रूप से परिवर्तन करने का मतलब है: यहां कुछ जोड़ा जाता है, वहां कुछ और हटा दिया जाता है, कुछ नया रूप दिया जाता है। छोटे पुनरावृत्तियों से बड़ी, विशाल और विशाल परियोजनाएँ कैसे पैदा होती हैं।

कोड के लिए जो सबसे ज्यादा मायने रखता है वह यह है कि यह अन्य प्रोग्रामरों के लिए समझने योग्य होना चाहिए। समझने योग्य गलत कोड को ठीक किया जा सकता है। सही लेकिन समझ से बाहर कोड में सुधार नहीं किया जा सकता।  आप बस इतना कर सकते हैं कि इसे त्याग दें।

तो आप अच्छा, साफ कोड कैसे लिखते हैं?

ऐसा करने के लिए तीन चीजों की आवश्यकता होती है:

  • तरीकों के अंदर अच्छा और समझने योग्य कोड लिखना - यह सबसे आसान आवश्यकता है
  • यह तय करना कि किन संस्थाओं को कार्यक्रम में शामिल किया जाना चाहिए
  • प्रोग्राम को तार्किक भागों में सही ढंग से विभाजित करना

इन अवधारणाओं के पीछे क्या है?

तरीकों के अंदर अच्छा कोड लिखना

यदि आपके पास बुनियादी अंग्रेजी कौशल भी है, तो आपने देखा होगा कि कभी-कभी कोड को अंग्रेजी वाक्यों के रूप में पढ़ना कितना आसान हो सकता है:

  • class Cat extends Pet- इसका मतलब है कि कैट क्लास पेट क्लास का विस्तार करती है
  • while(stream.ready())- जब तक धारा तैयार है...
  • if (a<b) return a; else return b- यदि aसे कम है b, तो वापस लौटें a, अन्यथा वापस लौटें b

यह जानबूझकर है। जावा कई भाषाओं में से एक है जो स्व-दस्तावेजीकरण कोड लिखना आसान बनाता है, यानी कोड जो टिप्पणियों के बिना समझा जा सकता है। अच्छे जावा कोड में, कई विधियाँ अंग्रेजी वाक्यों की तरह ही पढ़ी जाती हैं।

कोड लिखते समय, आपका कार्य इसे यथासंभव सरल और संक्षिप्त बनाना है। बस इस बारे में सोचें कि क्या आपका कोड पढ़ने में आसान है और आप सही दिशा में आगे बढ़ना शुरू कर देंगे।

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

अच्छा कोड लिखने का तरीका सीखने का सबसे अच्छा तरीका अभ्यास है। बहुत सारे कोड लिखें, दूसरों के कोड का अध्ययन करें, और अधिक अनुभवी सहकर्मियों से अपने कोड की समीक्षा करने के लिए कहें।

और याद रखें कि जिस क्षण आप अपने आप से कहते हैं, "अच्छी तरह से अकेला छोड़ दें", आपका विकास रुक जाता है।

यह तय करना कि किन संस्थाओं को कार्यक्रम में शामिल किया जाना चाहिए

आपको कोड लिखने की आवश्यकता है जिसे अन्य प्रोग्रामर समझ सकें। अगर 10 में से 9 प्रोग्रामर किसी प्रोग्राम के डिजाइन में क्लास ए, बी और सी को शामिल करेंगे, तो आपको अपने प्रोग्राम में क्लास ए, बी और सी भी शामिल करनी चाहिए। आपको ऐसा कोड लिखना चाहिए जिसे दूसरे लोग समझ सकें।

बढ़िया, काम करने वाला, तेज़, लेकिन गैर-मानक कोड खराब कोड है।

आपको अन्य लोगों की परियोजनाओं का अध्ययन करने की आवश्यकता है: आईटी उद्योग में दशकों से संचित सभी ज्ञान को आत्मसात करने का यह सबसे अच्छा, तेज़ और आसान तरीका है।

और वैसे, आपके पास पहले से ही एक उत्कृष्ट, लोकप्रिय और अच्छी तरह से प्रलेखित परियोजना - जावा एसडीके तक पहुंच है । इसके साथ शुरू करो।

कक्षाओं का विश्लेषण करें और उन्हें कैसे व्यवस्थित किया जाता है। इस बारे में सोचें कि क्यों कुछ तरीके स्थिर हैं और अन्य नहीं हैं। विधियों के पास विशिष्ट पैरामीटर क्यों हैं लेकिन अन्य नहीं। ये विधियां वास्तव में क्यों हैं, और कक्षाओं का नाम क्यों रखा गया है, और वे अपने विशिष्ट पैकेज में क्यों शामिल हैं।

एक बार जब आप इन सभी सवालों के जवाबों को समझना शुरू कर देते हैं, तो आप कोड लिखने में सक्षम हो जाते हैं जिसे दूसरे लोग समझ सकते हैं।

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

प्रोग्राम को तार्किक भागों में सही ढंग से विभाजित करना

लगभग हर प्रोग्राम को भागों या मॉड्यूल में विभाजित किया जाता है। प्रत्येक भाग कार्यक्रम के अपने पहलू के लिए जिम्मेदार है।

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

लेकिन एक लैपटॉप एक अखंड वास्तुकला का एक उदाहरण है: ऐसा लगता है कि हम अलग-अलग तार्किक भागों को देख सकते हैं, लेकिन वे बहुत अधिक एकीकृत हैं। मैकबुकप्रो पर, आपको कीबोर्ड को साफ करने के लिए आधे लैपटॉप को अलग करना होगा। और लैपटॉप पर अपनी कॉफी बिखेरना एक नया लैपटॉप ऑर्डर करने का एक कारण है। कॉफी का नया कप नहीं।


3. अपनी खुद की कक्षाएं बनाना

लेकिन चूंकि आप केवल प्रोग्राम करना सीख रहे हैं, इसलिए आपको अपनी खुद की कक्षाएं बनाना सीखकर छोटी शुरुआत करनी चाहिए।

बेशक, आपने पहले ही कक्षाएं बना ली हैं, लेकिन आपको यह समझने की जरूरत है कि किसी कार्यक्रम में कौन सी कक्षाएं शामिल की जानी चाहिए, उनका नाम कैसे रखा जाना चाहिए और उनके पास क्या तरीके होने चाहिए। और उन्हें आपस में कैसे बातचीत करनी चाहिए।

संस्थाओं की सूची

यदि आप नहीं जानते कि कहां से शुरू करें, तो शुरुआत से शुरू करें।

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

उदाहरण

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

नौसिखिए प्रोग्रामर से मिलना बहुत दुर्लभ है जो दो के बजाय दस कक्षाएं लिखता है। दस कक्षाएं लिखने के बजाय नौसिखियों को दो कक्षाएं या शायद सिर्फ एक लिखना पसंद है। तो कृपया और अधिक कक्षाएं लिखें, मेरे साथी प्रोग्रामर। और आपका कोड शायद आपको छोड़कर सभी के लिए स्पष्ट हो जाएगा 😛

शतरंज

मान लीजिए कि हम शतरंज की कक्षाएं लिखने का निर्णय लेते हैं: ये कक्षाएं कैसी दिखेंगी?

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

सामान्य तौर पर, जैसा कि आप आरंभ करते हैं, हमेशा इस सिद्धांत द्वारा निर्देशित रहें: एक कार्यक्रम में विभिन्न संस्थाएं होती हैं, और एक इकाई का एक प्रकार होता है। यह प्रकार वर्ग है।


4. स्थैतिक चर और विधियाँ

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

स्थैतिक चर, जिन्हें कार्यक्रम में कहीं से भी एक्सेस किया जा सकता है, आमतौर पर "हमेशा मौजूद" वस्तुओं के संदर्भ में लगातार गुजरने से बचने के लिए उपयोग किया जाता है।

उदाहरण के लिए, इस तरह:

कोड टिप्पणी
public class ChessBoard
{
   public static ChessBoard board = new ChessBoard();
   public ChessItem[][] cells = new ChessItem[8][8];
   ...
}

public class Game
{
   public static void main(String[] args)
   {
      var board = ChessBoard.board;
      board.cells[0][3] = new King(Color.WHITE);
      board.cells[0][4] = new Queen(Color.WHITE);
      ...
   }
}


ChessBoardकिसी एक वस्तु का संदर्भ ।
एक 8x8 द्वि-आयामी सरणी, स्थिर चर नहीं।








टुकड़ों को बोर्ड में जोड़ें।

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

public class ChessBoard
{
   private static ChessBoard board = new ChessBoard();
   public static ChessBoard getBoard()
   {
      return board;
   }

   public ChessItem[][] cells = new ChessItem[8][8];
   ...
}

public class Game
{
   public static void main(String[] args)
   {
      var board = ChessBoard.getBoard();
      board.cells[0][3] = new King(Color.WHITE);
      board.cells[0][4] = new Queen(Color.WHITE);
      ...
   }
}