제이온

[Nesne] 2. Nesne Yönelimli Programlama

  • Yazım Dili: Korece
  • Baz Ülke: Tüm Ülkelercountry-flag
  • BT

Oluşturulma: 2024-04-28

Oluşturulma: 2024-04-28 13:46

Film Rezervasyon Sistemi


Gereksinimleri İnceleme

  • Çevrimiçi bir film rezervasyon sistemi geliştirmek istiyoruz.
  • Film, bir filmin temel bilgilerini temsil eder.
    • Başlık, gösterim süresi, fiyat bilgileri vb.
  • Gösterim, izleyicilerin gerçekten bir filmi izlediği olayı temsil eder.
    • Gösterim tarihi, saati, sırası vb.
  • İnsanlar film rezervasyonu yaptıklarını söylerler, ancak aslında belirli birgösterimdegösterilen filmi rezerve ettiklerini söylemelidirler.
  • İndirim Koşulları
    • Fiyat indirimi olup olmadığı
    • Sıra Koşulu: İndirim olup olmadığını belirlemek için gösterim sırasını kullanma
    • Dönem Koşulu: İndirim olup olmadığını belirlemek için filmin gösterim başlangıç saatini kullanma
  • İndirim Politikası
    • İndirimli ücreti belirleme
    • Tutar İndirim Politikası: Rezervasyon ücretinden belirli bir tutarı indirim
    • Yüzde İndirim Politikası: Normal fiyattan belirli bir oranda ücret indirimi
  • Filmlere tek bir indirim politikası atanabilir veya hiç atanmayabilir ve indirim koşulları birden fazla indirim koşulunu birleştirebilir.
  • Bir indirim politikası uygulanmış olsa bile indirim koşullarını karşılamıyorsa veya indirim politikası uygulanmamışsa, ücret indirilmez.


Nesne Yönelimli Programlamaya Doğru

İşbirliği, Nesne, Sınıf

  • Nesne yönelimli, nesneleri hedef almaktır.
    • Sınıfı belirledikten sonra, sınıfa hangi özelliklerin ve yöntemlerin gerekli olduğu konusunda endişelenmemeliyiz.
    • Hangi nesnelerin hangi duruma ve davranışa sahip olacağını belirlemeliyiz.
    • Nesneleri bağımsız varlıklar değil, işbirliği yapan bir topluluğun üyeleri olarak görmeliyiz.


Alanın Yapısını Takip Eden Program Yapısı

  • Alan, kullanıcının programı kullanmak için sorunları çözmek üzere kullandığı alanı ifade eder.

<span class="image-inline ck-widget" contenteditable="false"><img src="https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fe7d22a03-4a24-40e9-8068-bd03b9fd816b%2FUntitled.png?table=block&id=3f1931fc-8ef9-470a-8189-3727146638f6&spaceId=b453bd85-cb15-44b5-bf2e-580aeda8074e&width=2000&userId=80352c12-65a4-4562-9a36-2179ed0dfffb&cache=v2" alt="Untitled" style="aspect-ratio:2000/438;" width="2000" height="438"></span>

  • Genellikle, sınıfların adı, karşılık gelen alan kavramının adıyla aynı veya en azından benzer olmalıdır.
  • Sınıflar arasındaki ilişki de, programın yapısını anlamak ve tahmin etmek kolaylaştırmak için, mümkün olduğunca alan kavramları arasında kurulmuş ilişkiye benzer şekilde oluşturulmalıdır.


Sınıf Uygulama

  • Sınıf, iç ve dış olmak üzere ikiye ayrılır ve mükemmel bir sınıf tasarlamak için hangi kısmın dışarıya açılacağına ve hangi kısmın gizleneceğine karar verilmelidir.
    • Nesnenin özellikleri private olarak kapatılır ve iç durumu değiştirmek için gereken yöntemler public olarak açılır.
  • Sınıfın iç ve dışını ayırmak, nesnenin özerkliğini sağlayarak programcıya uygulama özgürlüğü sağlar.


Özerk Nesneler

  • Nesneler, durum ve davranışa sahip özerk nesneler olmalıdır.
  • Verileri ve işlevleri nesnenin içine birlikte paketlemeye kapsülleme denir.
  • Erişim denetimi aracılığıyla dış müdahaleler azaltılarak nesnelerin kendi davranışlarına kendileri karar vermeleri sağlanır.
  • Arayüz ve uygulamanın ayrılması ilkesi, nesne yönelimli programlama için uyulması gereken temel bir ilkedir.
    • Genel Arayüz: Dışarıdan erişilebilen kısım
    • Uygulama: Sadece içeriden erişilebilen kısım


Programcının Özgürlüğü

  • Programcının rolü, sınıf yazarı ve istemci programcısı olarak ayrılır.
    • Sınıf yazarı yeni bir veri türü ekler
    • İstemci programcısı, sınıf yazarının eklediği veri türünü kullanır
  • Uygulama Gizleme
    • Sınıf yazarı, iç uygulamayı gizlemek için yalnızca gerekli olan kısmı istemci programcıya sağlayabilir.
    • İstemci programcısı yalnızca arayüzü bilmesi gerektiğinden, bilgi miktarı azaltılabilir.


İşbirliği Yapan Nesnelerin Topluluğu

  • Parayı ifade etmek için, yalnızca Long türünde bir değişken bildirmek yerine, Money gibi bir nesneye paketlemek daha iyidir. Nesneleri kullanmak, anlamın daha iyi iletilmesini ve yinelemeli işlem işlemlerinin tek bir yerde gerçekleştirilmesini sağlar.
  • Sistemin herhangi bir işlevini uygulamak için nesneler arasında gerçekleşen karşılıklı etkileşime işbirliği denir.


İşbirliğiyle İlgili Kısa Bir Hikaye

  • Nesnelerin diğer nesnelerle etkileşim kurabileceği tek yol, mesaj göndermek veya almak.
  • Alınan mesajı işlemek için kendi yöntemine yöntem denir.
  • Mesajı ve yöntemi ayırmak önemlidir ve polimorfizm kavramı buradan başlar.


İndirimli Ücret Hesaplama

İndirimli Ücret Hesaplaması İçin İşbirliğine Başlama

  • Movie sınıfında indirim politikasıyla ilgili ayrıntılı mantık bulunmaz ve DiscountPolicy arayüzüne devredilmiştir. Kalıtım, polimorfizm ve soyutlama kullanmak gerçekten önemlidir.


İndirim Politikası ve İndirim Koşulları

<span class="image-inline ck-widget" contenteditable="false"><img src="https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F7b9b27a5-0dac-4ba7-9552-05b7f8fbdecd%2FUntitled.png?table=block&id=3264f189-6e12-4a55-94d2-75b851320c7a&spaceId=b453bd85-cb15-44b5-bf2e-580aeda8074e&width=2000&userId=80352c12-65a4-4562-9a36-2179ed0dfffb&cache=v2" alt="Untitled" style="aspect-ratio:2000/535;" width="2000" height="535"></span>


Kalıtım ve Polimorfizm

Derleme Zamanı Bağımlılığı ve Çalışma Zamanı Bağımlılığı

  • Kodun bağımlılığı ve yürütme zamanındaki bağımlılık farklı olabilir.
  • İkisinin bağımlılığı ne kadar farklı olursa, kodu anlamak o kadar zorlaşır, ancak daha esnek ve genişletilebilir bir kod olur.


Farklılığa Dayalı Programlama

  • Kalıtım, mevcut bir sınıfa dayanarak yeni bir sınıfı hızlı ve kolay bir şekilde eklemeyi ve üst sınıfın uygulamasını yeniden kullanmayı sağlar.
  • Üst sınıftan farklı olan yalnızca bölümleri ekleyerek yeni bir sınıf oluşturma yöntemine farklılığa dayalı programlama denir.


Kalıtım ve Arayüz

  • Kalıtım, üst sınıfın sağladığı tüm arayüzlerin alt sınıf tarafından devralınmasını sağlar.
  • Arayüz, nesnenin anlayabileceği mesajların listesini tanımlar.
  • Movie, DiscountPolicy'ye calculateDiscountAmount mesajını gönderiyor. Movie açısından, hangi sınıfın örneğinin yanıt verdiğinin bir önemi yok, yalnızca yanıtın başarıyla verilmesi yeterlidir.
  • Bu nedenle, hem AmountDiscountPolicy hem de PercentDiscountPolicy, DiscountPolicy yerine Movie ile işbirliği yapabilir.
  • Alt sınıfın üst sınıfın yerini almasına upcasting denir. Alt sınıfın üst sınıfa otomatik olarak tür dönüştürülmüş gibi görünmesinden kaynaklanır.


Polimorfizm

  • Polimorfizm, aynı mesajı aldığında nesnenin türüne göre farklı şekilde yanıt verebilme yeteneğidir.
    • Movie aynı mesajı gönderir, ancak hangi yöntemin yürütüleceği, mesajı alan nesnenin sınıfının ne olduğuna bağlıdır.
  • Polimorfizm, programın derleme zamanı bağımlılığı ve çalışma zamanı bağımlılığı farklı olabileceği gerçeğine dayanır.
  • Polimorfizm, yürütülecek yöntemi çalışma zamanında belirlediğinden, geç bağlama veya dinamik bağlama denir.


Arayüz ve Polimorfizm

  • Uygulamayı paylaşmaya gerek yoksa ve yalnızca arayüzü paylaşmak istiyorsak, soyut sınıf yerine arayüz kullanabiliriz.


Soyutlama ve Esneklik

Soyutlamanın Gücü

  • Soyutlamanın Avantajları
    • Soyutlama katmanına ayrı olarak bakarsak, gereksinimlerin politikasını yüksek seviyede açıklayabiliriz.
    • Tasarım daha esnek hale gelir.


Esnek Tasarım

  • Soyutlama, tasarımın belirli durumlara bağlanmasını önlediği için esnek bir tasarım oluşturmayı sağlar.


Soyut Sınıf ve Arayüz Takası


  • Şu anda NoneDiscountPolicy, aslında DiscountPolicy'nin calculateDiscountAmount() yönteminde indirim koşulu yoksa 0 döndürdüğü için sorun değil. Ancak, kullanıcının Movie'nin bağımsız değişkeni olarak indirim politikası olmayan None politikasını eklemesi gerektiğinden ekledik.
  • Bu nedenle, kavramsal olarak NoneDiscountPolicy sınıfı kafa karıştırıcı olduğundan, aşağıdaki gibi düzeltirsek anlamak daha kolay olur.



  • Yukarıda olduğu gibi, DiscountPolicy'yi arayüz olarak soyutlamak ve uygulamasının NoneDiscountPolicy ve genel indirim politikasını ifade eden DefaultDiscountPolicy olmak üzere ikiye ayırmaktır.

<span class="image-inline ck-widget" contenteditable="false"><img src="https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F712983a9-3937-4265-82fe-66a144c44a0f%2FUntitled.png?table=block&id=f5ca651c-d03c-4a6c-97e9-7443ee5649a0&spaceId=b453bd85-cb15-44b5-bf2e-580aeda8074e&width=2000&userId=80352c12-65a4-4562-9a36-2179ed0dfffb&cache=v2" alt="Untitled" style="aspect-ratio:2000/886;" width="2000" height="886"></span>

  • Yalnızca NoneDiscountPolicy için arayüz eklemenin, artan karmaşıklığa kıyasla verimsiz olduğunu düşünebilirsiniz.
  • Uygulama ile ilgili tüm şeylerin takas konusu olabileceğini ve tasarımı buna göre yapmamız gerektiğini bilmeliyiz. Yani yazdığımız her kodun geçerli bir nedeni olmalıdır.


Kod Yeniden Kullanımı

  • Kalıtım, kodu yeniden kullanmak için kullanılabilir.
  • Ancak, kod yeniden kullanımı için kalıtım yerine bileşim kullanmak daha iyidir.
  • Mevcut kodda, Movie'nin DiscountPolicy kodunu yeniden kullanma yöntemi bileşimdir.
  • Movie'yi üst sınıf olarak ve AmountDiscountMovie ve PercentDiscountMovie olarak ayırırsak, bu kalıtımı kullanmak olur.


Kalıtım

  • Kalıtımın Dezavantajları
    • Kapsüllemeyi ihlal eder.
      • Üst sınıfın iç yapısını bilmek gerekir.
      • Üst sınıf değiştiğinde alt sınıfın da değişme olasılığı yüksektir.
    • Tasarımı esnek yapmaz.
      • Üst sınıf ve alt sınıf arasındaki ilişki derleme zamanında belirlenir.
      • Çalışma zamanında nesne türünü değiştirmek mümkün değildir.
      • Ancak bileşimde, changeDiscountPolicy() gibi bir yöntem kullanarak çalışma zamanında örneği değiştirebiliriz.


Bileşim

  • Arayüzde tanımlanan mesajlar aracılığıyla kodu yeniden kullanma yöntemine bileşim denir.
  • Kapsüllemeyi uygulayabilir ve gevşek bir bağ koruyabilir.
  • Polimorfizm için arayüzü yeniden kullanırken, kalıtım ve bileşimi birlikte kullanmalıyız.
    • Örneğin, DiscountPolicy arayüzü, alt uygulamaları uygulamak için kalıtımı kullanmak zorundadır.


Kaynak

  • Nesne

Yorumlar0