Rehber OOP ilkeleri

Herkese merhaba,
Bugünkü konumuz OOP(Object Oriented Programming) ilkeleri. Türkçesi Nesne Yönelimli Programlama(NYP). Ben C# ile anlatmaya çalıştım ama çoğu high-level dilde bulunur.

OOP, programlamanın temel ilkelerinden biridir. Programın sürdürülebilirliğini arttırmayı amaçlar. Mantık olarak programın nesneler ile bağlantı kurularak çalışması prensibine dayanır. Kodların parçalar haline getirilip, çıktı olarak verilebilmesine olanak sağlar.
Örneğin bu program da aynı işlevi sağlar:
C#:
//SOLID ve OOP'ye aykırı bir program örneği

using System;

public class HelloWorld
{
    public static void Main(string[] args)
    {
        string FirstPersonName = "ExampleName";
        string FirstPersonSurname = "ExampleSurname";
        string SecondPersonName = "ExampleName2";
        string SecondPersonSurname = "ExampleSurname2";
        Console.WriteLine ($"Name: {FirstPersonName}\n" +
                           $"Surname: {FirstPersonSurname}\n\n" +
                           $"Name: {SecondPersonName}\n" +
                           $"Surname: {SecondPersonSurname}");
    }
}
bu program da:
C#:
//Doğru kod örneği

using System;

public class Person
{
    public string Name, Surname;
 
    public Person(string _name, string _surname)
    {
        this.Name = _name;
        this.Surname = _surname;
    }
}

public class HelloWorld
{
    public static void Main(string[] args)
    {
        Person FirstPerson = new Person("Halil", "Haliloglu");
        Person SecondPerson = new Person("Kamil", "Kamiloglu");
    
        Console.WriteLine ($"Name: {FirstPerson.Name}\n" +
                           $"Surname: {FirstPerson.Surname}\n\n" +
                           $"Name: {SecondPerson.Name}\n" +
                           $"Surname: {SecondPerson.Surname}");
    }
}
Fark ettiğiniz üzere ikinci program daha okunaklı. Ayrıca bu programa gerektiğinde ekleme yapmak(sürdürülebilirlik) çok kolaydır.

OOP'nin genel mantığını anladığınıza göre şimdi OOP ilkelerine geçebiliriz.
  • Inheritance(Miras ve kalıtım):
Tanım olarak bir sınıftan miras alarak başka sınıflar türetebilmemizi sağlayan ilkedir. Örneğin şekiller olsun: Kare ve dikdörtgen. Bunları kapsayacak bir dörtgen sınıfı olsun ve bunun adı Quadrilateral olsun ve dörtgenlerin ortak özelliği olan bazı özellikleri içersin(Ben alanı bulma ve yüksekliği tanımladım. Onun dışında istediğiniz tanımı yapabilirsiniz.):
C#:
abstract class Quadrilateral
{
    public float height;
    public abstract float GetSize();
}
Ve bunları Quadrilateral ile türeteceğimiz sınıflar(yani dikdörtgen ve kareyi temsil edecek sınıf) olsun. Bunlara Quadrilateral kalıtımını vererek bu sınıftaki temel özellikleri sınıflarımız için türetebiliyoruz.
C#:
class Square: Quadrilateral
{
    public Square(float _height)
    {
        this.height = _height;
    }
 
    public override float GetSize()
    {
        return height * height;
    }
}

class Rectangle: Quadrilateral
{
    public float width;
 
    public Rectangle(float _height, float _width)
    {
        this.height = _height;
        this.width = _width;
    }
 
    public override float GetSize()
    {
        return height * width;
    }
}
Son olarak Main metodumuzu da yazalım:
C#:
class MainClass
{
    public static void Main(string[] args)
    {
        Square square = new Square(3f);
        Rectangle rectangle = new Rectangle(5f, 7.5f);
    
        Console.WriteLine($"Square Size: {square.GetSize()}\n" +
                          $"Rectangle Size: {rectangle.GetSize()}");
    }
}
ve çalıştıralım:
1660764811985.png

Görmüş olduğunuz gibi kalıtım ile özellikleri classlara tanımladık ve bu özelliği kullandık. Bu ilke sürdürülebilirlik açısından önemli bir ilke.
  • Polymorphism(Çok biçimlilik):
Bir işlemin farklı yollar ile yapılabilmesini ifade eder. Kısaca overloadinge izin veren bir ilkedir. Yukarıdaki örnekte GetSize() aynı işlevi yapsa bile her nesnede farklı şekilde yapmıştır. Örneğin aşağıdaki classta her constructorda tanım yapılmıştır ama tanım şekli farklıdır:
C#:
class Car
{
    public float Speed;
    public int NumberOfSeat;
    public string Horn;
 
    public Car(float _speed)
    {
        this.Speed = _speed;
        this.Horn = "Düt Düt";
        this.NumberOfSeat = 5;
    }
 
    public Car(float _speed, string _horn)
    {
        this.Speed = _speed;
        this.Horn = _horn;
        this.NumberOfSeat = 5;
    }
 
    public Car(float _speed, string _horn, int _seatcount)
    {
        this.Speed = _speed;
        this.Horn = _horn;
        this.NumberOfSeat = _seatcount;
    }
 
    public void PlayHorn()
    {
        Console.WriteLine(Horn);
    }
}
  • Abstraction(Soyutlama):
Karmaşıklığı azaltmak için kullanılır. Bir nesne türünün temel özelliklerini belirtir(soyutlar). Örneğin iki kalemden biri tükenmez biri uçlu kalem olsun. Bunların ortak özellikleri yazı yazabilmeleri. Sadece tükenmez kaleme ait özellik içindeki mürekkep, uçlu kalemin özellikleri ise içindeki uç ve ucu değiştirebilmemizdir:
C#:
abstract class PenType
{
    public abstract void Write();
}

class Pen: PenType
{
    float PercentOfInk = 100f;
 
    public override void Write()
    {
        //Write
        PercentOfInk-=1f;
    }
}

class Pencil: PenType
{
    float TipLenght = 10f;
 
    public void ChaneTip()
    {
        TipLenght = 10f;
    }
 
    public override void Write()
    {
        //Write
        TipLenght-=0.5f;
    }
}
  • Encapsulation(Kapsülleme):
Erişim seviyeleri en erişilebilirden en erişilemeze doğru şu şekildedir: public,, protected, default tanım ve private. Diyelim ki private olarak tanımlamamız gereken bir değişkenimiz olsun classımızda. Ancak bu değişkene ulaşmamız ve değerini değiştirmemiz lazım. Bunun için getter ve setter metodlar var. Aşağıdaki örneği inceleyelim:
C#:
class User
{
    private string name = "kullanici.cs";
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }
}
Bu sınıfımızda name değerini private yaptık ama bu değişkene erişebilmek için farklı bir Name tanımladık. Bu Name değeri sayesinde name değişkeni üzerinde değişiklik yapabiliyoruz ve değişkeni kullanabiliyoruz. get ile döndürülecek değeri, set ile atama değeri value olarak name değişkenine atama yaptık.
C#:
class MainClass
{
    public static void Main(string[] args)
    {
        User FirstUser = new User();
        FirstUser.Name = "ExampleName";
        Console.WriteLine(FirstUser.Name);
    }
}
Bunu çalıştırırsak:
1660805833870.png

çıktı bu şekilde olur.

Örnek proje için: GitHub - userdotcs/Car-Sales-Project-For-the-OOP-Principles-Article

Umarım yardımcı olabilmişimdir. Sorularınızı sorabilirsiniz.
 
Son düzenleyen: Moderatör:
Yok dostum. Güzel anlatmışsın temeli. Sonda güzel genel bir örnek proje olsa ve bunu da github gibi yere yükleyip paylaşsan senin içinde, okuyanlar içinde daha da iyi olur.
O halde küçük bir araba kataloğu projesi yazıp ekliyorum sonuna.

@RaSGooL Şuan örnek projeyi ekledim.
 
Son düzenleme:

Yeni konular

Geri
Yukarı