1. Objektumok és osztályok

Ma egy kicsit megtudhatja, hogyan működik egy tipikus Java program. Íme a nagy hír: minden Java program osztályokból és objektumokból áll.

Már tudja, mik az osztályok, de mik az objektumok?

Egy hasonlattal kezdem. Képzeld el, hogy egy kis hajót akarsz készíteni. Először egy tervrajzot kell készíteni, majd át kell adni a gyárnak, ahol a terv szerint hajót építenek. Vagy talán egy tucat. Vagy annyi hajót, amennyit csak akar. Tucatnyi egyforma hajót építenek egyetlen terv alapján. Ez itt a fontos.

Ugyanez van a Java programozásban is.

Tervrajzok

A programozó olyan, mint egy tervező. Egy tervező tervrajzokat készít, egy Java programozó pedig osztályokat ír. A tervrajzok alapján az alkatrészek, az osztályok alapján az objektumok jönnek létre.

Először osztályokat írunk (tervrajzokat készítünk), majd a program futása közben a Java gép ezen osztályok alapján objektumokat hoz létre. Ugyanúgy, ahogy a hajókat tervrajzokból hozzák létre.

Csak egy terv van, de sok hajó lehet. A hajók különböznek egymástól – különböző nevük van, és különböző rakományt szállítanak. De nagyon hasonlóak: mindannyian ugyanazt a kialakítást használják, és hasonló feladatokat tudnak ellátni.

Vagy itt egy másik hasonlat...

Hangyaboly

A hangyaboly jó példa arra, hogy a tárgyak hogyan hatnak egymásra. Egy egyszerű hangyabolyban a hangyák három osztálya található: a királynő, a katonák és a munkások.

Az egyes osztályok hangyáinak száma eltérő. Az egész hangyabolyban egyetlen királynő jár, de több tucat katona és több száz munkáshangya. Három osztály és több száz objektum. A hangyák egymással – azonos osztályukhoz tartozó hangyákkal és más osztályokhoz tartozó hangyákkal – szigorú szabályok szerint lépnek kapcsolatba.

Ez a tökéletes példa. Minden pontosan így van egy tipikus programban. Van egy elsődleges objektum, amely az összes többi osztály objektumát hozza létre. Az objektumok kölcsönhatásba lépnek egymással és a program „külvilágával”. Az objektumok viselkedése belsőleg kódolt.

Ez a két analógia ugyanannak az éremnek a két oldala. Az igazság középen van. Az első példa (a tervrajzról és a hajókról) az osztály és az osztály objektumai közötti kapcsolatot mutatja be. Ez egy erős analógia. A második példa (egy hangyabolyról) az írott osztályok és a program futása közben létező objektumok közötti kapcsolatot mutatja be.

Először osztályokat kell írnia a programban létező minden objektumhoz, majd le kell írnia, hogyan működnek együtt. Igen, ez így van, de könnyebb, mint amilyennek hangzik.

A Java-ban minden entitás futásidejű objektum, és a programírás az objektumok interakciójának különböző módjainak leírását jelenti. Az objektumok egyszerűen meghívják egymás metódusait, és átadják nekik a szükséges adatokat.

Dokumentáció

És honnan tudod, hogy milyen adatokat kell átadni a metódusoknak? Azok az emberek, akik előtted jártak, mindenre gondoltak.

Minden osztálynak általában van egy leírása, amely leírja, hogy mire jött létre. Ezenkívül minden nyilvános metódushoz általában van egy leírás, amely jelzi, hogy mit csinál, és milyen adatokat kell átadni neki.

Egy osztály használatához általános elképzeléssel kell rendelkeznie arról, hogy mit csinál. És pontosan tudnia kell, hogy az egyes módszerek mit csinálnak. De egyáltalán nem kell tudnia, hogyan csinálja. Olyan, mint egy varázspálca.

Nézzük meg a kódot egy fájl másolásához:

A c:\\data.txt fájl másolása a c:\\result.txt fájlba
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();
   }
}

Ha soronként elolvassa ezt a kódot, kitalálhatja, mit csinál általánosságban. Bár ehhez tapasztalat és gyakorlat kell. Egy idő után ez a kód ismerősnek és érthetőnek tűnik az Ön számára.


2. Program tervezése

A programtervezés egy teljes művészet. Egyszerre egyszerű és nehéz. Egyszerű, mert nincsenek szigorú törvények: ami nem tilos, az megengedett. Nos, és ez is nehezíti a dolgot: sokféleképpen lehet valamit csinálni, és nem könnyű megtalálni a legjobbat.

A program tervezése olyan, mint egy könyv írása. Egyrészt csak betűket, szavakat és mondatokat ír. Másrészt fontos a cselekmény, a szereplők, a belső ellentmondások, konfliktusok, a történetmesélés stílusa, az intrika stb.

A legfontosabb dolog az, hogy megértse, kinek írja a kódot. És írsz kódot más programozóknak .

A termékfejlesztés óhatatlanul változtatásokat is jelent: valamit hozzáadnak ide, valamit eltávolítanak onnan, valamit újraterveznek. Így születnek kis iterációkból nagy, óriási és gigantikus projektek.

A kód szempontjából az a legfontosabb, hogy más programozók számára érthető legyen. Az érthető hibás kód javítható. A helyes, de érthetetlen kódon nem lehet javítani.  Csak annyit tehet, hogy eldobja.

Szóval hogyan írj jó, tiszta kódot?

Ehhez három dologra van szükség:

  • Jó és érthető kód írása a metódusokon belül – ez a legegyszerűbb követelmény
  • Annak eldöntése, hogy mely entitások kerüljenek be a programba
  • A program helyes felosztása logikai részekre

Mi van e fogalmak mögött?

Jó kód írása metódusokon belül

Ha akár alapvető angol nyelvtudással is rendelkezel, akkor talán észrevetted, milyen könnyű néha angol mondatként olvasni a kódot:

  • class Cat extends Pet— Ez azt jelenti, hogy a Cat osztály kiterjeszti a Pet osztályt
  • while(stream.ready())- Amíg a folyam készen áll...
  • if (a<b) return a; else return b— ha akisebb, mint b, akkor return a, egyébként return b.

Ez szándékos. A Java egyike azon számos nyelvnek, amelyek megkönnyítik az öndokumentáló, azaz megjegyzések nélkül érthető kódok írását. A jó Java kódban sok módszer ugyanúgy olvasható, mint az angol mondatok.

A kód írásakor az a feladatod, hogy a lehető legegyszerűbb és tömörebb legyen. Gondoljon csak arra, hogy a kód könnyen olvasható-e, és máris elindulhat a helyes irányba.

A Java-ban könnyen olvasható kódot szokás írni. Lehetőleg egy metódus összes kódja elfér egyetlen képernyőn (azaz 20-30 sor). Ez a norma az egész Java közösség számára. Ha a kód javítható, javítani kell.

A legjobb módja annak, hogy megtanuljunk jó kódot írni, a gyakorlat. Írjon sok kódot, tanulmányozza mások kódját, és kérje meg tapasztaltabb kollégáit, hogy nézzék át a kódot.

És ne feledd, hogy abban a pillanatban, amikor azt mondod magadnak, hogy "elég jól hagyd békén", a növekedésed megáll.

Annak eldöntése, hogy mely entitások kerüljenek be a programba

Olyan kódot kell írnia, amelyet más programozók megértenek. Ha 10 programozóból 9 beépíti az A, B és C osztályokat egy programba, akkor az A, B és C osztályokat is be kell építeni a programjába. Olyan kódot kell írnia, amelyet mások is megértenek.

Remek, működő, gyors, de a nem szabványos kód rossz kód.

Tanulmányoznia kell mások projektjeit: ez a legjobb, leggyorsabb és legegyszerűbb módja annak, hogy magába szívja mindazt a bölcsességet, amely évtizedek óta felhalmozódott az IT-iparban.

És mellesleg máris hozzáférhet egy kiváló, népszerű és jól dokumentált projekthez – a Java SDK-hoz . Kezdje vele.

Elemezze az órákat és azok megszervezését. Gondolja át, hogy egyes módszerek miért statikusak, mások miért nem. Miért rendelkeznek a metódusok meghatározott paramétereivel, mások miért nem? Miért pontosan ezek a metódusok, és miért nevezik az osztályokat úgy, ahogyan nevezik őket, és miért vannak a saját csomagjukban.

Amint elkezdi megérteni a válaszokat ezekre a kérdésekre, képes lesz olyan kódot írni, amelyet mások is megértenek.

Ennek ellenére szeretném figyelmeztetni, hogy ne elemezze a kódot a Java SDK metódusaiban . Sok módszert átírtak a sebesség maximalizálása érdekében, olvashatóságuk megkérdőjelezhető.

A program helyes felosztása logikai részekre

Szinte minden program részekre vagy modulokra van felosztva. Mindegyik rész felelős a program saját aspektusáért.

A számítógépnek van alaplapja, monitorja és billentyűzete – ezek mind különálló, lazán összekapcsolt részek. Sőt, szabványos módon működnek együtt: USB, HDMI stb. Ha kávét önt a billentyűzetre, egyszerűen kimoshatja a mosogatóban, hagyhatja megszáradni, majd folytathatja a használatát.

De a laptop a monolitikus architektúra példája: úgy tűnik, külön logikai részeket tudunk megkülönböztetni, de sokkal jobban integráltak. MacBookPro esetén szét kell szerelni a laptop felét a billentyűzet tisztításához. És ha kiönti a kávéját egy laptopra, akkor érdemes új laptopot rendelni. Nem egy új csésze kávé.


3. Saját osztályok létrehozása

De mivel még csak programozni tanulsz, kezdd kicsiben azzal, hogy megtanulod létrehozni saját osztályaidat.

Természetesen már létrehoztál osztályokat, de meg kell tanulnod megérteni, hogy milyen osztályokat kell beilleszteni egy programba, hogyan kell elnevezni őket, és milyen módszerekkel kell rendelkezniük. És hogyan kell kölcsönhatásba lépniük egymással.

Az entitások listája

Ha nem tudja, hol kezdje, kezdje elölről.

Amikor először kezdi el a program tervezését, egyszerűen megragadhat egy papírt, és felírhatja azon entitások (objektumok) listáját, amelyeknek a programban szerepelniük kell. Ezután írjon kódot azon elv szerint, hogy minden entitás külön osztály.

Példa

Tegyük fel, hogy sakkjátszmát szeretne írni. A következő entitásokra lesz szüksége: egy sakktábla és 6 féle sakkfigura. A darabok különböző módon mozognak és különböző értékekkel bírnak. Érthető, hogy ezek külön osztályok. Valójában, amikor először elkezdi, minél több óra, annál jobb.

Nagyon ritkán találkozni kezdő programozóval, aki kettő helyett tíz órát ír. Ahelyett, hogy tíz órát írnának, a kezdők szeretnek két vagy esetleg csak egy órát írni. Szóval kérlek írjatok még órákat, programozó társaim. És a kódod mindenki számára világosabb lesz, kivéve talán téged 😛

Sakk

Tegyük fel, hogy úgy döntünk, hogy sakkórákat írunk: hogyan néznének ki ezek az órák?

A sakktábla csak egy 8x8-as tömb? Jobb egy külön osztályt létrehozni, amely belsőleg tárolja a hivatkozást egy tömbre. Ezután sok hasznos módszert hozzáadhat a "sakktábla" osztályhoz, például annak ellenőrzésére, hogy egy adott cella üres-e vagy foglalt.

Általánosságban elmondható, hogy a kezdéskor mindig ezt az alapelvet kövesse: A programnak különféle entitásai vannak, az entitásnak pedig típusa van. Ez a típus az osztály.


4. Statikus változók és módszerek

Ne feledkezzünk meg statikus változók és módszerek használatáról sem. Ha az egyik sakkfigurája kölcsönhatásba lép a másikkal a sakktáblán, akkor a kódnak olyan módszerre van szüksége, amely hivatkozik az első és a második figurára, valamint a sakktáblára.

A statikus változókat, amelyek a program bármely pontjáról elérhetők, általában arra használják, hogy elkerüljék a „mindig létező” objektumokra való hivatkozások állandó átadását.

Például így:

Kód jegyzet
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);
      ...
   }
}


Hivatkozás egyetlen ChessBoardobjektumra.
8x8-as kétdimenziós tömb, nem statikus változó.








Add hozzá a darabokat a táblához.

Vagy statikus változó helyett létrehozhat egy metódust, amely egy egyedi objektumot ad vissza. Például így:

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