CodeGym /Java Blogu /Rastgele /OOP İlkeleri
John Squirrels
Seviye
San Francisco

OOP İlkeleri

grupta yayınlandı
MERHABA! Bugünün dersinde, nesne yönelimli programlamanın İlkeleri hakkında konuşacağız. Java'nın neden tam olarak olduğu gibi tasarlandığını hiç merak ettiniz mi? Demek istediğim, sınıfları bildirir ve sınıflara dayalı nesneler yaratırsınız, sınıfların yöntemleri vardır, vb. Peki dil neden programlar başka bir şeyden değil de sınıflardan ve nesnelerden oluşacak şekilde yapılandırılmıştır? Neden "nesne" kavramı icat edildi ve ön plana çıkarıldı? Tüm diller bu şekilde mi tasarlandı? Değilse, Java'ya ne gibi avantajlar sağlar? Gördüğünüz gibi çok fazla soru var :) Bugünün dersinde her birini cevaplamaya çalışalım.

Nesne yönelimli programlama (OOP) nedir?

Tabii ki, Java sadece eğlence için nesnelerden ve sınıflardan oluşmaz. Java'nın yaratıcılarının bir hevesi değiller, hatta onların icadı bile değiller. Nesnelere dayalı başka birçok dil vardır. Bu tür ilk dile "Simula" adı verildi. 1960'larda Norveç'te icat edildi. Dahası, Simula'da "sınıf" ve "yöntem" kavramları ortaya çıktı. Yazılım geliştirme standartlarına göre, "Simula" eski bir dil gibi görünüyor, ancak Java ile "aile benzerliğini" herkes görebilir. Nesne yönelimli programlamanın ilkeleri - 1Muhtemelen bu dilde yazılmış kodu kolayca okuyabilir ve ne işe yaradığını geniş vuruşlarla açıklayabilirsiniz :)

Begin
	Class Rectangle (Width, Height); Real Width, Height;
			           
	 Begin
	    Real Area, Perimeter;  
	 
	    Procedure Update;      
	    Begin
	      Area := Width * Height;
              OutText("Rectangle is updating, Area = "); OutFix(Area,2,8); OutImage;
	      Perimeter := 2*(Width + Height);
              OutText("Rectangle is updating, Perimeter = "); OutFix(Perimeter,2,8); OutImage;
	    End of Update;
	 
	    Update;               
	    OutText("Rectangle created: "); OutFix(Width,2,6);
	    OutFix(Height,2,6); OutImage;
	 End of Rectangle;

       Rectangle Class ColouredRectangle (Color); Text Color;
			           
	Begin   	  
	    OutText("ColouredRectangle created, color = "); OutText(Color);
	    OutImage;
        End of ColouredRectangle;

 
      	 Ref(Rectangle) Cr;            
	 Cr :- New ColouredRectangle(10, 20, "Green"); 
End;
Bu kod örnek kodu, Weekly-geekly tarafından "Simula - 50 yıllık OOP"dan alınmıştır. Gördüğünüz gibi Java, büyükbabasından çok farklı değil :) Bunun nedeni, Simula'nın ortaya çıkışının yeni bir kavramın doğuşuna işaret etmesidir: nesne yönelimli programlama. Wikipedia, OOP'yi şu şekilde tanımlar: "Nesne Yönelimli Programlama (OOP), alanlar (genellikle nitelikler olarak bilinir) biçiminde veri ve formda kod içerebilen" nesneler "kavramına dayalı bir programlama paradigmasıdır. prosedürler (genellikle yöntemler olarak bilinir). Bana göre bu gerçekten çok iyi bir tanım. Java öğrenmeye başlayalı çok uzun zaman olmadı ama bu tanım muhtemelen bilmediğiniz kelimeleri içermiyor :) Bugün OOP en yaygın programlama metodolojisidir. Java'ya ek olarak, OOP ilkeleri, duymuş olabileceğiniz birçok popüler dilde kullanılmaktadır. Örneğin, C++ (oyun geliştirmede aktif olarak kullanılır), Objective-C ve Swift (Apple cihazları için program yazmak için kullanılır), Python (makine öğreniminde en popüler), PHP (en popüler web geliştirme dillerinden biri), JavaScript ( ne için kullanılmadığını söylemek daha kolay) ve diğerleri. Peki, zaten OOP'nin ilkeleri nelerdir? Size ayrıntılı olarak anlatacağız. zaten OOP'nin ilkeleri nelerdir? Size ayrıntılı olarak anlatacağız. zaten OOP'nin ilkeleri nelerdir? Size ayrıntılı olarak anlatacağız.

OOP İlkeleri

Bunlar vakfın temelidir. Birlikte nesne yönelimli programlama paradigmasını oluşturan 4 ana özellik. Başarılı bir programcı olmak için onları anlamak çok önemlidir.

İlke 1. Miras

İyi haber: OOP'nin bazı ilkelerini zaten biliyorsunuz! :) Zaten birkaç kez derslerde kalıtımla karşılaştık ve onu kullanmayı başardık. Kalıtım, mevcut (ebeveyn) bir sınıfa dayalı olarak yeni bir sınıfı tanımlamanıza izin veren bir mekanizmadır. Bunu yaparken, yeni sınıf, üst sınıfın özelliklerini ve işlevlerini ödünç alır. Miras ne işe yarar ve ne gibi avantajlar sağlar? Her şeyden önce, kodun yeniden kullanımı. Üst sınıflarda bildirilen alanlar ve yöntemler, alt sınıflarda kullanılabilir. Tüm araba türlerinin 10 ortak alanı ve 5 özdeş yöntemi varsa, bunları Otomatik'e taşımanız yeterlidir.ebeveyn sınıfı. Bunları soyundan gelen sınıflarda sorunsuz bir şekilde kullanabilirsiniz. Sağlam avantajlar: hem nicel (daha az kod) hem de sonuç olarak nitel (sınıflar çok daha basit hale gelir). Ayrıca, kalıtım çok esnektir - alt öğelerin eksik olduğu ayrı yazma işlevi ekleyebilirsiniz (belirli bir sınıfa özgü bazı alanlar veya davranışlar). Genel olarak, gerçek hayatta olduğu gibi, hepimiz bir şekilde ebeveynlerimize benziyoruz ama aynı zamanda onlardan bir şekilde farklıyız :)

İlke 2. Soyutlama

Bu çok basit bir prensiptir. Soyutlama, bir şeyin ana, en önemli özelliklerini tanımlarken aynı anda küçük ve önemsiz olan her şeyi atmak anlamına gelir. Tekerleği yeniden icat etmeye gerek yok. Derslerle ilgili eski bir dersten bir örnek hatırlayalım. Diyelim ki şirket çalışanları için bir dosyalama sistemi oluşturuyoruz. "Çalışan" nesneleri oluşturmak için bir Çalışan sınıfı yazdık . Şirket dosyalama sisteminde onları tanımlamak için hangi özellikler önemlidir? İsim, doğum tarihi, SSN ve çalışan kimliği. Ancak bu tür bir kayıt için çalışanın boyuna, göz rengine veya saç rengine ihtiyacımız olacak gibi görünmüyor. Şirketin bir çalışan hakkında böyle bir bilgiye ihtiyacı yoktur. Dolayısıyla, Çalışan sınıfında aşağıdaki değişkenleri bildiririz:, int yaş , int sosyal GüvenlikNumarası ve int çalışan Kimliği . Ve göz rengi gibi gereksiz bilgileri soyutlarız. Ancak, bir mankenlik ajansı için bir dosyalama sistemi oluşturuyorsak, durum dramatik bir şekilde değişir. Bir modelin boyu, göz rengi ve saç rengi önemli özelliklerdir, ancak SSN'si bizim için kesinlikle önemsizdir. Böylece, Model sınıfında şu değişkenleri yaratıyoruz: String height , String hair , String eyes .

İlke 3. Kapsülleme

Bununla zaten karşılaştık. Java'da kapsülleme, verileri okuma ve değiştirme yeteneğini kısıtlamak anlamına gelir. Gördüğünüz gibi terim "kapsül" kelimesinden gelmektedir. Başkalarının değiştirmesini istemediğimiz bazı önemli verileri gizlemek için bir "kapsül" kullanacağız. İşte gerçek hayattan basit bir örnek. Bir adınız ve soyadınız var. Bütün arkadaşların onları tanıyor. Ancak adınızı veya soyadınızı değiştirme yetkileri yoktur. Bunu yapma sürecinin mahkeme sistemi tarafından "kapsanmış" olduğunu söyleyebiliriz: soyadınızı yalnızca mahkeme katibi aracılığıyla değiştirebilirsiniz ve bunu yalnızca siz yapabilirsiniz. Diğer "kullanıcılar", adınız ve soyadınıza "salt okunur" erişime sahiptir :) Başka bir açıklayıcı örnek, evde tutulan nakit paradır. Odanızın ortasında herkesin görebileceği bir yerde bırakmak iyi bir fikir değil. Herhangi bir "kullanıcı" (evinize gelen kişi) paranızın miktarını değiştirebilecek, yani paranızı alabilecektir. Onu bir kasaya sarmak daha iyi olurdu. O zaman erişim sadece sizin için ve sadece özel bir kod kullanılarak mümkün olacaktır. Halihazırda çalıştığınız bariz kapsülleme örnekleri, erişim değiştiricileri (özel, genel vb.) ile ayarlayıcılar ve alıcılardır. kapsüllemezsenizCat sınıfının yaş alanı, ardından herkes şunu yazabilir:

Cat.age = -1000;
Kapsülleme mekanizması, yaş alanını, yaşın negatif bir sayıya ayarlanamayacağından emin olabileceğimiz ayarlayıcı bir yöntemle korumamıza olanak tanır .

İlke 4. Polimorfizm

Polimorfizm, birkaç türle sanki aynı türmüş gibi çalışabilme yeteneğidir. Ayrıca, nesnelerin davranışları türlerine bağlı olarak farklı olacaktır. Kulağa karmaşık mı geliyor? Hemen anlamlandıralım. En basit örneği ele alalım: hayvanlar. Tek bir talk() yöntemi ve iki alt sınıf — Cat ve Dog ile bir Animal sınıfı oluşturun .

public class Animal {

   public void speak() {
      
       System.out.println("Hello!");
   }
}

public class Dog extends Animal {
  
   @Override
   public void speak() {
       System.out.println ("Woof-woof!");
   }
}

public class Cat extends Animal {

   @Override
   public void speak() {
       System.out.println("Meow!");
   }
}
Şimdi bir Animal referans değişkeni bildirmeye ve ona bir Dog nesnesi atamaya çalışacağız .

public class Main {

   public static void main(String[] args) {

       Animal dog = new Dog();
       dog.speak();
   }
}
Sizce hangi yöntem çağrılacak? Animal.speak() veya Dog.speak() ? Dog sınıfındaki yöntemin adı: Woof-woof! Bir Animal referansı oluşturduk , ancak nesne Dog gibi davranıyor . Gerekirse kedi, at veya başka bir hayvan gibi davranabilir. Önemli olan, genel Animal referans değişkenine belirli bir alt sınıf atamaktır. Bu mantıklı, çünkü tüm köpekler hayvandır. "Nesnelerin davranışları türlerine göre farklı olacaktır" derken aklımızda olan buydu. Bir Cat nesnesi oluşturursak ...

public static void main(String[] args) {

   Animal cat = new Cat();
   cat.speak();
}
talk () yöntemi "Miyav!" Peki, "birkaç türle sanki aynı türmüş gibi çalışabilme yeteneği" ile ne demek istiyoruz? Bu da oldukça basittir. Hayvanlar için bir berber dükkanı yarattığımızı düşünelim. Berberimiz herhangi bir hayvanı düzeltebilmelidir, bu nedenle Animal parametresiyle (saçını kestiren hayvan) bir trim() yöntemi oluşturuyoruz.

public class AnimalBarbershop {

   public void trim(Animal animal) {

       System.out.println("The haircut is done!"); 
   }
}
Ve artık Cat ve Dog nesnelerini trim() yöntemine geçirebiliriz !

public static void main(String[] args) {

   Cat cat = new Cat();
   Dog dog = new Dog();

   AnimalBarbershop barbershop = new AnimalBarbershop();

   barbershop.trim(cat);
   barbershop.trim(dog);
}
Ve işte net bir örnek: AnimalBarbershop sınıfı, Kedi ve Köpek türleri ile sanki aynı türlermiş gibi çalışır . Aynı zamanda, Kedi ve Köpek'in farklı davranışları vardır: her biri farklı konuşur.

Neden OOP'ye ihtiyacımız var?

OOP neden yeni bir programlama konsepti olarak ortaya çıktı? Programcıların prosedürel diller gibi işleyen araçları vardı. Onları temelde yeni bir şey icat etmeye iten neydi? Her şeyden önce, karşılaştıkları görevlerin karmaşıklığı. 60 yıl önce programcının görevi "bazı matematiksel ifadeleri değerlendirmek" gibi bir şeydiyse, şimdi "STALKER oyunu için oyuncunun A, B, C, DE noktalarında verdiği kararların kombinasyonlarına bağlı olarak 7 farklı son uygulamak" gibi bir şey olabilir. , ve oyunda F." Gördüğünüz gibi, görevler son on yılda açıkça daha karmaşık hale geldi. Ve sonuç olarak, veri türleri daha karmaşık hale geldi. Bu, OOP'nin ortaya çıkmasının başka bir nedenidir. Matematiksel bir ifade, sıradan ilkeller kullanılarak kolayca değerlendirilebilir. Burada hiçbir nesneye gerek yoktur. Ancak oyun sonlarıyla ilgili görevi, özel sınıflar kullanmadan tarif etmek bile zor olacaktır. Bununla birlikte, onu sınıflar ve nesneler kullanarak tanımlamak oldukça kolaydır. Açıkçası, birkaç sınıfa ihtiyacımız olacak: Game, Stalker, Ending, PlayerDecision, GameEvent, vb. Başka bir deyişle, sorunu çözmeye başlamadan bile, kafamızda kolayca bir çözüm "taslak çizebiliriz". Görevlerin artan karmaşıklığı, programcıları bunları parçalara ayırmaya zorladı. Ancak prosedürel programlamada bunu yapmak o kadar kolay değildi. Ve çoğu zaman bir program, tüm olası yürütme yollarını temsil eden birçok dalı olan bir ağaç gibiydi. Belirli koşullara bağlı olarak, programın bir dalı veya diğeri yürütüldü. Küçük programlar için bu uygundu, ancak büyük bir sorunu parçalara ayırmak çok zordu. Bu, OOP'nin ortaya çıkmasının bir başka nedeniydi. Bu paradigma, programcılara bir programı, her biri işin kendi bölümünü yapan bir grup "modül"e (sınıflara) bölme yeteneği verdi. Tüm nesneler birbirleriyle etkileşime girerek programımızın işini gerçekleştirir. Ek olarak, kodumuzu programın başka bir yerinde yeniden kullanabiliriz, bu da çok zaman kazandırır.
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION