1. वस्तू आणि वर्ग

आज तुम्ही ठराविक Java प्रोग्राम कसे कार्य करतो याबद्दल थोडेसे शिकाल. ही मोठी बातमी आहे: प्रत्येक Java प्रोग्राममध्ये वर्ग आणि ऑब्जेक्ट्स असतात.

तुम्हाला आधीच माहित आहे की वर्ग काय आहेत, परंतु वस्तू काय आहेत?

मी एका साधर्म्याने सुरुवात करेन. कल्पना करा की तुम्हाला एक लहान जहाज बनवायचे आहे. प्रथम आपल्याला ब्लूप्रिंट तयार करणे आवश्यक आहे आणि नंतर ते कारखान्याला द्यावे लागेल, जेथे ब्लूप्रिंटनुसार जहाज तयार केले जाईल. किंवा कदाचित डझनभर. किंवा तुम्हाला आवडेल तितकी जहाजे. एकाच ब्ल्यूप्रिंटनुसार डझनभर समान जहाजे बांधली जातात. हीच इथे महत्त्वाची गोष्ट आहे.

जावा प्रोग्रामिंगमध्येही तेच आहे.

ब्लूप्रिंट

प्रोग्रामर हा डिझायनरसारखा असतो. डिझायनर ब्लूप्रिंट तयार करतो आणि जावा प्रोग्रामर वर्ग लिहितो. ब्लूप्रिंटच्या आधारे भाग तयार केले जातात आणि वर्गांच्या आधारे वस्तू तयार केल्या जातात.

प्रथम, आम्ही वर्ग लिहितो (ब्लूप्रिंट बनवतो), आणि नंतर, जसे प्रोग्राम चालतो, जावा मशीन या वर्गांवर आधारित वस्तू तयार करते. ब्लूप्रिंट्सपासून जहाजे तयार केली जातात त्याच प्रकारे.

फक्त एक ब्लूप्रिंट आहे, परंतु अनेक जहाजे असू शकतात. जहाजे वेगळी आहेत - त्यांची नावे भिन्न आहेत आणि भिन्न मालवाहतूक करतात. परंतु ते खूप समान आहेत: ते सर्व समान डिझाइन सामायिक करतात आणि समान कार्ये करू शकतात.

किंवा इथे आणखी एक साधर्म्य आहे...

अँथिल

वस्तू कशा प्रकारे संवाद साधतात याचे अँथिल हे उत्तम उदाहरण आहे. साध्या अँथिलमध्ये मुंग्यांचे तीन वर्ग असतात: राणी, सैनिक आणि कामगार.

प्रत्येक वर्गातील मुंग्यांची संख्या वेगळी असते. संपूर्ण अँथिलसाठी एकच राणी आहे, परंतु तेथे डझनभर सैनिक आणि शेकडो कामगार मुंग्या आहेत. तीन वर्ग आणि शेकडो वस्तू. मुंग्या एकमेकांशी संवाद साधतात — त्यांच्या समान वर्गाच्या मुंग्यांसह आणि इतर वर्गाच्या मुंग्यांशी — कठोर नियमांनुसार.

हे परिपूर्ण उदाहरण आहे. ठराविक कार्यक्रमात सर्व काही असेच असते. एक प्राथमिक वस्तू आहे जी इतर सर्व वर्गांच्या वस्तू तयार करते. ऑब्जेक्ट्स एकमेकांशी आणि प्रोग्रामच्या "बाहेरील जगाशी" संवाद साधू लागतात. वस्तूंचे वर्तन आंतरिक हार्डकोड केलेले आहे.

या दोन साधर्म्य एकाच नाण्याच्या दोन बाजू आहेत. सत्य मध्यभागी आहे. पहिले उदाहरण (ब्लूप्रिंट आणि जहाजांबद्दल) वर्ग आणि त्या वर्गातील वस्तू यांच्यातील संबंध दर्शविते. हे एक मजबूत साधर्म्य आहे. दुसरे उदाहरण (अँथिल बद्दल) लिखित वर्ग आणि प्रोग्राम चालू असताना अस्तित्वात असलेल्या वस्तूंमधील संबंध दर्शविते.

आपण प्रथम प्रोग्राममध्ये अस्तित्वात असलेल्या प्रत्येक ऑब्जेक्टसाठी वर्ग लिहिणे आवश्यक आहे आणि नंतर ते कसे संवाद साधतात याचे वर्णन देखील करा. होय, ते बरोबर आहे, परंतु ते वाटते त्यापेक्षा सोपे आहे.

Java मध्ये, सर्व घटक रनटाइमच्या वेळी ऑब्जेक्ट्स असतात आणि प्रोग्राम लिहिणे हे ऑब्जेक्ट्सच्या परस्परसंवादाच्या विविध मार्गांचे वर्णन करणे आहे. ऑब्जेक्ट्स फक्त एकमेकांच्या पद्धती कॉल करतात आणि त्यांना आवश्यक डेटा पास करतात.

दस्तऐवजीकरण

आणि पद्धतींना कोणता डेटा पास करायचा हे तुम्हाला कसे कळेल? तुमच्या आधी आलेल्या लोकांनी प्रत्येक गोष्टीचा विचार केला.

प्रत्येक वर्गात सामान्यत: एक वर्णन असते जे ते कशासाठी तयार केले गेले हे सांगते. तसेच, प्रत्येक सार्वजनिक पद्धतीमध्ये सामान्यत: एक वर्णन असते जे ते काय करते आणि त्यावर कोणता डेटा पास करणे आवश्यक आहे हे सूचित करते.

वर्ग वापरण्यासाठी, तुम्हाला ते काय करते याची सामान्य कल्पना असणे आवश्यक आहे. आणि प्रत्येक पद्धत काय करते हे आपल्याला माहित असणे आवश्यक आहे. परंतु ते कसे होते हे जाणून घेण्याची अजिबात गरज नाही. हे जादूच्या कांडीसारखे आहे.

फाइल कॉपी करण्यासाठी कोड बघूया:

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аपेक्षा कमी असल्यास b, परत करा а, अन्यथा परत करा b.

हे मुद्दाम आहे. जावा ही अनेक भाषांपैकी एक आहे जी स्वयं-दस्तऐवजीकरण कोड लिहिणे सोपे करते, म्हणजेच टिप्पण्यांशिवाय समजण्यायोग्य कोड. चांगल्या जावा कोडमध्ये, अनेक पद्धती इंग्रजी वाक्यांप्रमाणेच वाचतात.

कोड लिहिताना, तुमचे कार्य ते शक्य तितके सोपे आणि संक्षिप्त करणे आहे. तुमचा कोड वाचायला सोपा आहे की नाही याचा विचार करा आणि तुम्ही योग्य दिशेने वाटचाल सुरू कराल.

जावामध्ये, वाचण्यास सोपा कोड लिहिण्याची प्रथा आहे. शक्यतो, पद्धतीचे सर्व कोड एकाच स्क्रीनवर (म्हणजे 20-30 ओळी) बसतील. संपूर्ण जावा समुदायासाठी हा आदर्श आहे. जर कोड सुधारता येत असेल तर तो सुधारला पाहिजे.

चांगला कोड कसा लिहायचा हे शिकण्याचा सर्वोत्तम मार्ग म्हणजे सराव. भरपूर कोड लिहा, इतरांच्या कोडचा अभ्यास करा आणि अधिक अनुभवी सहकाऱ्यांना तुमच्या कोडचे पुनरावलोकन करण्यास सांगा.

आणि लक्षात ठेवा की ज्या क्षणी तुम्ही स्वतःला "पुरेसे एकटे सोडा" असे म्हणता, तेव्हा तुमची वाढ थांबते.

कार्यक्रमात कोणत्या घटकांचा समावेश करावा हे ठरवणे

तुम्हाला कोड लिहावा लागेल जो इतर प्रोग्रामरना समजू शकेल. जर 10 पैकी 9 प्रोग्रामर प्रोग्रामच्या डिझाइनमध्ये वर्ग A, B आणि C समाविष्ट करत असतील, तर तुम्ही तुमच्या प्रोग्राममध्ये वर्ग A, B आणि C देखील बनवावेत. तुम्ही इतरांना समजेल असा कोड लिहावा.

उत्तम, कार्यरत, जलद, परंतु गैर-मानक कोड हा वाईट कोड आहे.

तुम्हाला इतर लोकांच्या प्रकल्पांचा अभ्यास करणे आवश्यक आहे: आयटी उद्योगात अनेक दशकांपासून जमा झालेले सर्व शहाणपण आत्मसात करण्याचा हा सर्वोत्तम, जलद आणि सर्वात सोपा मार्ग आहे.

आणि तसे, तुम्हाला आधीपासूनच एका उत्कृष्ट, लोकप्रिय आणि चांगल्या-दस्तऐवजीकरण केलेल्या प्रकल्पात प्रवेश आहे — Java SDK . यापासून सुरुवात करा.

वर्ग आणि ते कसे आयोजित केले जातात याचे विश्लेषण करा. काही पद्धती स्थिर का आहेत आणि इतर का नाहीत याचा विचार करा. पद्धतींमध्ये विशिष्ट पॅरामीटर्स का असतात पण इतर नसतात. या पद्धती नेमक्या का आहेत, आणि वर्गांना काय नाव दिले आहे आणि ते त्यांच्या विशिष्ट पॅकेजमध्ये का समाविष्ट आहेत.

एकदा तुम्ही या सर्व प्रश्नांची उत्तरे समजण्यास सुरुवात केली की, तुम्ही इतरांना समजू शकणारे कोड लिहू शकाल.

ते म्हणाले, मी तुम्हाला Java SDK च्या पद्धतींमध्ये कोडचे विश्लेषण करण्याविरूद्ध चेतावणी देऊ इच्छितो . गती वाढवण्यासाठी अनेक पद्धती पुन्हा लिहिल्या गेल्या आणि त्यांची वाचनीयता शंकास्पद आहे.

प्रोग्रामला तार्किक भागांमध्ये योग्यरित्या विभाजित करणे

जवळजवळ प्रत्येक प्रोग्राम भाग किंवा मॉड्यूलमध्ये विभागलेला असतो. प्रत्येक भाग कार्यक्रमाच्या स्वतःच्या पैलूसाठी जबाबदार आहे.

संगणकामध्ये मदरबोर्ड, मॉनिटर आणि कीबोर्ड असतो — हे सर्व वेगळे, सैल-जोडलेले भाग आहेत. इतकेच काय, ते प्रमाणित मार्गांनी संवाद साधतात: यूएसबी, एचडीएमआय, इ. तुम्ही तुमच्या कीबोर्डवर कॉफी टाकल्यास, तुम्ही ती फक्त सिंकमध्ये धुवून, कोरडे होऊ द्या आणि नंतर वापरणे सुरू ठेवू शकता.

परंतु लॅपटॉप हे मोनोलिथिक आर्किटेक्चरचे एक उदाहरण आहे: असे दिसते की आपण वेगळे तार्किक भाग ओळखू शकतो, परंतु ते अधिक एकात्मिक आहेत. MacBookPro वर, कीबोर्ड साफ करण्यासाठी तुम्हाला अर्धा लॅपटॉप डिस्सेम्बल करावा लागेल. आणि लॅपटॉपवर तुमची कॉफी सांडणे हे नवीन लॅपटॉप ऑर्डर करण्याचे एक कारण आहे. नवा कप कॉफी नाही.


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);
      ...
   }
}