1. Nesneler ve sınıflar

Bugün tipik bir Java programının nasıl çalıştığı hakkında biraz bilgi edineceksiniz. İşte büyük haber: Her Java programı sınıflardan ve nesnelerden oluşur.

Sınıfların ne olduğunu zaten biliyorsunuz, ancak nesneler nedir?

Bir benzetme ile başlayacağım. Küçük bir gemi yapmak istediğinizi hayal edin. Önce bir plan oluşturmanız ve ardından plana göre bir geminin inşa edileceği fabrikaya vermeniz gerekir. Ya da belki düzinelerce. Veya istediğiniz kadar gemi. Düzinelerce aynı gemi, tek bir plana göre inşa edildi. Burada önemli olan bu.

Java programlamada da durum aynıdır.

Taslaklar

Bir programcı bir tasarımcı gibidir. Bir tasarımcı planları oluşturur ve bir Java programcısı sınıfları yazar. Parçalar, planlara göre oluşturulur ve nesneler, sınıflara göre oluşturulur.

Önce sınıflar yazarız (planlar yaparız) ve ardından program çalışırken Java makinesi bu sınıflara dayalı nesneler oluşturur. Aynı şekilde, gemiler planlardan yaratılıyor.

Sadece bir plan var ama birçok gemi olabilir. Gemiler farklıdır - farklı isimleri vardır ve farklı yükler taşırlar. Ancak çok benzerler: hepsi aynı tasarımı paylaşır ve benzer görevleri yerine getirebilir.

Ya da işte başka bir benzetme...

Karınca yuvası

Bir karınca yuvası, nesnelerin nasıl etkileşime girdiğine iyi bir örnektir. Basit bir karınca yuvasında üç karınca sınıfı vardır: kraliçe, askerler ve işçiler.

Her sınıfın karınca sayısı farklıdır. Tüm karınca yuvası için tek bir kraliçe var ama düzinelerce asker ve yüzlerce işçi karınca var. Üç sınıf ve yüzlerce nesne. Karıncalar birbirleriyle - aynı sınıftaki karıncalarla ve diğer sınıftaki karıncalarla - katı kurallara göre etkileşime girer.

Bu mükemmel bir örnek. Tipik bir programda her şey aynen böyledir. Diğer tüm sınıfların nesnelerini oluşturan birincil bir nesne vardır. Nesneler birbirleriyle ve programın "dış dünyası" ile etkileşime girmeye başlar. Nesnelerin davranışı dahili olarak kodlanmıştır.

Bu iki benzetme aynı madalyonun iki yüzüdür. Gerçek ortada. İlk örnek (bir taslak ve gemiler hakkında), bir sınıf ile o sınıfın nesneleri arasındaki ilişkiyi gösterir. Bu güçlü bir benzetmedir. İkinci örnek (bir karınca yuvası hakkında), yazılı sınıflar ile program çalışırken var olan nesneler arasındaki ilişkiyi gösterir.

Programda var olacak her nesne için önce sınıflar yazmalı ve ardından bunların nasıl etkileştiğini de tanımlamalısınız. Evet, bu doğru, ama göründüğünden daha kolay.

Java'da, tüm varlıklar çalışma zamanında nesnelerdir ve bir program yazmak, nesnelerin etkileşime girdiği farklı yolları açıklamakla ilgilidir. Nesneler basitçe birbirlerinin yöntemlerini çağırır ve gerekli verileri onlara iletir.

Belgeler

Ve hangi verilerin yöntemlere iletileceğini nereden biliyorsunuz? Senden önce gelenler her şeyi düşündüler.

Her sınıfın tipik olarak ne için yaratıldığını söyleyen bir açıklaması vardır. Ayrıca, her genel yöntemin genellikle ne yaptığını ve kendisine hangi verilerin iletilmesi gerektiğini belirten bir açıklaması vardır.

Bir sınıfı kullanmak için, onun ne yaptığına dair genel bir fikre sahip olmanız gerekir. Ve her yöntemin tam olarak ne yaptığını bilmeniz gerekir. Ama bunu nasıl yaptığını hiç bilmene gerek yok. Sihirli bir değnek gibi.

Bir dosyayı kopyalamak için kullanılan koda bir göz atalım:

c:\\data.txt dosyasını c:\\result.txt dosyasına kopyalama
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();
   }
}

Bu kodu satır satır okursanız genel hatlarıyla ne işe yaradığını tahmin edebilirsiniz. Bu deneyim ve pratik gerektirse de. Bir süre sonra bu kod size tanıdık ve anlaşılır gelecektir.


2. Bir program tasarlamak

Program tasarımı tam bir sanattır. Aynı anda basit ve zordur. Basit, çünkü katı yasalar yok: yasak olmayan her şeye izin veriliyor. İşi zorlaştıran da bu: Bir şeyi yapmanın pek çok yolu var ve en iyisini bulmak kolay değil.

Bir program tasarlamak, bir kitap yazmak gibidir. Bir yandan, sadece harfler, kelimeler ve cümleler yazıyorsunuz. Öte yandan olay örgüsü, karakterler, iç çelişkiler, çatışmalar, hikaye anlatım tarzı, entrika vb.

Önemli olan, kodu kimin için yazdığınızı anlamaktır. Ve diğer programcılar için kod yazıyorsunuz .

Ürün geliştirme kaçınılmaz olarak değişiklik yapmak anlamına gelir: buraya bir şey eklenir, başka bir şey buradan çıkarılır, bir şey yeniden tasarlanır. Küçük yinelemelerden büyük, muazzam ve devasa projeler bu şekilde doğar.

Kod için en önemli olan şey, diğer programcılar tarafından anlaşılabilir olmasıdır. Anlaşılabilir hatalı kod düzeltilebilir. Doğru ama anlaşılmaz kod geliştirilemez.  Yapabileceğin tek şey onu atmak.

Peki nasıl iyi, temiz kod yazarsınız?

Bunu yapmak üç şey gerektirir:

  • Yöntemler içinde iyi ve anlaşılır kod yazmak — bu en kolay gereksinimdir
  • Programa hangi varlıkların dahil edileceğine karar verilmesi
  • Programı mantıksal parçalara doğru şekilde bölmek

Bu kavramların arkasında ne var?

Yöntemler içinde iyi kod yazmak

Temel İngilizce becerileriniz bile varsa, bazen kodu İngilizce cümleler olarak okumanın ne kadar kolay olabileceğini fark etmişsinizdir:

  • class Cat extends Pet— Bu, Cat sınıfının Pet sınıfını genişlettiği anlamına gelir
  • while(stream.ready())— akış hazır olduğu sürece...
  • if (a<b) return a; else return b— eğer аküçükse b, o zaman iade et а, aksi takdirde iade et b.

Bu kasıtlı. Java, kendi kendini belgeleyen kod, yani yorum yapılmadan anlaşılabilen kod yazmayı kolaylaştıran birkaç dilden biridir. İyi bir Java kodunda, birçok yöntem tıpkı İngilizce cümleler gibi okunur.

Kod yazarken göreviniz, kodu olabildiğince basit ve öz hale getirmektir. Kodunuzun okunmasının kolay olup olmadığını düşünün ve doğru yönde ilerlemeye başlayın.

Java'da, okunması kolay kod yazmak adettendir. Tercihen, bir yöntem için tüm kod tek bir ekrana (yani 20-30 satır) sığacaktır. Bu, tüm Java topluluğu için normdur. Kod iyileştirilebiliyorsa geliştirilmelidir.

İyi kod yazmayı öğrenmenin en iyi yolu pratik yapmaktan geçer. Çok fazla kod yazın, başkalarının kodunu çalışın ve daha deneyimli meslektaşlarınızdan kodunuzu incelemelerini isteyin.

Ve kendinize "kendi haline bırakın" dediğiniz anda büyümenizin durduğunu unutmayın.

Programa hangi varlıkların dahil edileceğine karar verilmesi

Diğer programcıların anlayabileceği bir kod yazmanız gerekir. 10 programcıdan 9'u bir programın tasarımında A, B ve C sınıflarını içeriyorsa, programınızda A, B ve C sınıflarını da yapmalısınız. Başkalarının anlayabileceği bir kod yazmalısınız.

Harika, çalışan, hızlı ama standart olmayan kod kötü koddur.

Başkalarının projelerini incelemeniz gerekir: Bu, BT endüstrisinde onlarca yıldır biriken tüm bilgeliği özümsemenin en iyi, en hızlı ve en kolay yoludur.

Bu arada, mükemmel, popüler ve iyi belgelenmiş bir projeye zaten erişiminiz var: Java SDK . Onunla başlayın.

Sınıfları ve nasıl düzenlendiklerini analiz edin. Neden bazı yöntemlerin statik olduğunu ve diğerlerinin olmadığını düşünün. Yöntemler neden sahip oldukları belirli parametrelere sahipken diğerlerine sahip değil? Neden bu yöntemler tam olarak ve neden sınıflar bu şekilde adlandırılıyor ve neden kendi özel paketlerinde yer alıyorlar.

Tüm bu soruların cevaplarını anlamaya başladığınızda, başkalarının anlayabileceği kodlar yazabileceksiniz.

Bununla birlikte, kodu Java SDK yöntemlerinde analiz etmemeniz konusunda sizi uyarmak istiyorum . Yöntemlerin çoğu, hızı en üst düzeye çıkarmak için yeniden yazılmıştır ve okunabilirlikleri sorgulanabilir.

Programı mantıksal parçalara doğru şekilde bölmek

Neredeyse her program bölümlere veya modüllere bölünmüştür. Her bölüm, programın kendi açısından sorumludur.

Bir bilgisayarın ana kartı, monitörü ve klavyesi vardır; bunların hepsi ayrı, gevşek bağlı parçalardır. Dahası, standartlaştırılmış yollarla etkileşime girerler: USB, HDMI, vb. Klavyenize kahve dökerseniz, lavaboda yıkayabilir, kurumaya bırakabilir ve ardından kullanmaya devam edebilirsiniz.

Ancak bir dizüstü bilgisayar, yekpare bir mimari örneğidir: Görünüşe göre ayrı mantıksal parçaları ayırt edebiliyoruz, ancak bunlar çok daha entegre. MacBookPro'da, klavyeyi temizlemek için dizüstü bilgisayarın yarısını sökmeniz gerekir. Kahvenizi bir dizüstü bilgisayarın üzerine dökmek, yeni bir dizüstü bilgisayar sipariş etmek için bir nedendir. Yeni bir fincan kahve değil.


3. Kendi sınıflarınızı oluşturma

Ancak programlamayı yeni öğrendiğiniz için, kendi sınıflarınızı oluşturmayı öğrenerek küçükten başlamalısınız.

Elbette zaten sınıflar oluşturdunuz, ancak bir programa hangi sınıfların dahil edilmesi gerektiğini, bunların nasıl adlandırılması gerektiğini ve hangi yöntemlere sahip olmaları gerektiğini öğrenmeniz gerekiyor. Ve birbirleriyle nasıl etkileşime girmeleri gerektiği.

varlıkların listesi

Nereden başlayacağınızı bilmiyorsanız, baştan başlayın.

Bir programı tasarlamaya ilk başladığınızda, bir parça kağıt alıp programda olması gereken varlıkların (nesnelerin) bir listesini yazabilirsiniz. Ve sonra her varlığın ayrı bir sınıf olduğu ilkesine göre kod yazın.

Örnek

Diyelim ki bir satranç oyunu yazmak istiyorsunuz. Şu varlıklara ihtiyacınız olacak: bir satranç tahtası ve 6 çeşit satranç taşı. Parçalar farklı şekillerde hareket eder ve farklı değerlere sahiptir. Ayrı sınıflar olmaları mantıklı. Aslında, ilk başladığınızda, ne kadar çok ders o kadar iyi.

İki yerine on sınıf yazan acemi bir programcıyla tanışmak çok nadirdir. Yeni başlayanlar on sınıf yazmak yerine iki veya belki de sadece bir sınıf yazmayı severler. Bu yüzden lütfen daha fazla sınıf yazın, programcı arkadaşlarım. Ve kodunuz belki siz hariç herkes için daha net hale gelecek 😛

Satranç

Diyelim ki satranç için sınıflar yazmaya karar verdik: bu sınıflar neye benzerdi?

Satranç tahtası sadece 8'e 8'lik bir dizi mi? Bir diziye referansı dahili olarak depolayan ayrı bir sınıf oluşturmak daha iyidir. Ardından, "satranç tahtası" sınıfına, örneğin belirli bir hücrenin boş veya dolu olup olmadığını kontrol etmek için pek çok yararlı yöntem ekleyebilirsiniz.

Genel olarak, başlarken her zaman şu ilkeye rehberlik edin: Bir programın çeşitli varlıkları vardır ve bir varlığın bir türü vardır. Bu tür sınıftır.


4. Statik değişkenler ve yöntemler

Ayrıca statik değişkenleri ve yöntemleri kullanmayı unutmayın. Satranç tahtasında bir başka taşla etkileşim halinde olan bir satranç taşınız varsa, o zaman kodunuzun satranç tahtasının yanı sıra birinci ve ikinci taşlara referanslar alan bir yönteme ihtiyacı vardır.

Programın herhangi bir yerinden erişilebilen statik değişkenler, tipik olarak, "her zaman var olan" nesnelere yapılan referansların sürekli olarak dolaşmasını önlemek için kullanılır.

Örneğin, bunun gibi:

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


Tek bir nesneye referans ChessBoard.
Statik bir değişken değil, 8x8 iki boyutlu bir dizi.








Parçaları tahtaya ekleyin.

Veya statik bir değişken yerine, tekil bir nesne döndüren bir yöntem oluşturabilirsiniz. Örneğin, bunun gibi:

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