제이온

[Nesne] 1. Nesne, Tasarım

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

Oluşturulma: 2024-04-28

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

Giriş

Robert L. Glass, pratiğin teoriden önce geldiğini savundu. Özellikle yazılım geliştirmede, uygulama teoriden daha önde olan tipik bir alandır ve geliştiriciler, somut kodlarla uğraşırken en çok şeyi öğrenirler. Bu nedenle, teori ve kavramları bir süreliğine bir kenara bırakıp, basit bir programı incelemek istiyoruz.


Bilet Satış Uygulaması Geliştirme

  • Küçük bir tiyatronun tanıtımı için küçük bir etkinlik düzenlemek istiyoruz.
    • Etkinlik İçeriği: Kura çekimi ile seçilen izleyicilere ücretsiz olarak gösteri izleme davetiyesi gönderme
  • Etkinliğe katılan ve katılamayan izleyicileri ayırmamız gerekiyor.
    • Etkinlikte Kazanan İzleyiciler: Davetiyeyi bilete dönüştürme
    • Etkinlikte Kaybeden İzleyiciler: Bileti para ile satın alma



Sorun Nedir?

Robert Martin, bir yazılım modülünün (boyutundan bağımsız olarak, bir programı oluşturan sınıf, paket, kütüphane gibi herhangi bir öğe) sahip olması gereken üç işlev hakkında açıklamalar yapıyor.


  • Çalışma zamanında düzgün çalışır.
  • Değişiklik için vardır.
    • Basit bir işlemle bile değiştirilebilmelidir.
  • Kodu okuyan kişiyle iletişim kurar.
    • Geliştiricilerin kolayca okuması ve anlamasını sağlamalıdır.


Önceki bilet satış uygulaması, ilk kısıt olan düzgün çalışmayı sağlıyor ancak değişime açıklık ve iletişim amaçlarını karşılamıyor.


Beklentilerin Dışında Kod

İletişim amacını karşılamamasının nedenlerini inceleyelim.


  • Theater sınıfının enter() yönteminin yaptığı şey
    • Tiyatro, izleyicinin çantasını açıp içinde davetiye olup olmadığına bakar.
    • Çantada davetiye varsa, gişede bulunan bileti izleyicinin çantasına taşımasını satış görevlisine söyler.
    • Çantada davetiye yoksa, izleyicinin çantasından bilet bedelini çıkartır, bileti satın alır ve bileti çantasına koyar.
  • İzleyici açısından, üçüncü taraf olan tiyatronun çantasını rastgele karıştırdığını, parasını aldığını ve bileti koyduğunu görmelidir.
  • Satış görevlisi açısından, üçüncü taraf olan tiyatronun gişedeki bileti ve parayı izinsiz olarak değiştirdiğini görmelidir.
  • Anlaşılır kod, çalışmanın beklentilerimizi büyük ölçüde aşmadığı kodu ifade eder ve buradaki tiyatro beklentilerimizin dışında kalır.
    • İzleyici, parasını kendi çantasından çıkarıp satış görevlisine vererek bileti almalıdır.
    • Satış görevlisi, kendi gişesindeki bileti çıkarıp izleyiciye vermeli ve izleyiciden parayı alıp gişede saklamalıdır.
  • Ayrıca, enter() yöntemini anlamak için birçok ayrıntıyı hatırlamak gerekir.
    • Audience'ın Bag'e sahip olduğunu.
    • Bag'in içinde nakit ve bilet olduğunu.
    • TiketSellet'in TicketOffice'ten bilet sattığını ve TicketOffice'in içinde para ve bilet bulunduğunu.


Değişikliklere Karşı Dayanıksız Kod

enter() yöntemi iki koşul varsayar.

  • İzleyiciler her zaman nakit ve davetiyeyi saklamak için çanta taşırlar.
  • Satış görevlisi sadece gişeden bilet satar.


Peki ya aşağıdaki durumlar?

  • İzleyicinin çantası olmayabilir.
  • İzleyici nakit yerine kredi kartı kullanabilir.
  • Satış görevlisi gişe dışında bilet satabilir.


Örneğin, ilk gereksinimi karşılamak için Audience'ın Bag nesnesini kaldırmamız ve bununla ilişkili Theater sınıfının enter() yöntemini değiştirmemiz gerekir. Bunun nedeni, Theater sınıfının izleyicilerin çanta taşıdığı ve satış görevlisinin sadece gişeden bilet sattığı gibi aşırı ayrıntılı gerçeklere bağımlı olmasıdır. Bu ayrıntılı gerçeklerden herhangi biri değişirse, ilgili sınıf ve ona bağlı sınıflar (örneğin, Theater) değiştirilmelidir.


Bu, nesneler arasındaki bağımlılıkla ilgili bir sorundur ve bağımlılık, değişikliğin etkisini ima eder. Ancak nesne yönelimli tasarım, birlikte çalışan nesnelerin bir topluluğunu oluşturmayı amaçladığından, bağımlılığı körü körüne ortadan kaldırmak yerine, uygulamanın işlevini gerçekleştirmek için gereken minimum bağımlılığı korumakve gereksiz bağımlılıkları ortadan kaldırmak gerekir.


Nesneler arasındaki bağımlılığın aşırı olduğu duruma birleştirmedenir ve iki nesne arasındaki birleştirme ne kadar yüksek olursa, birlikte değişme olasılıkları da o kadar yüksek olur. Bu nedenle, tasarımın amacı, nesneler arasındaki birleştirmeyi azaltarak değişime açık bir tasarım oluşturmaktır.


Tasarımı Geliştirme

İzleyicinin çanta taşıdığı gerçeğini ve satış görevlisinin gişeden bilet sattığı gerçeğini Theater'ın bilmesi gerekmez. Theater sadece izleyicinin tiyatroya girmesini ister. Bu nedenle, izleyicinin kendi çantasındaki parayı ve davetiyeyi işlemesini ve satış görevlisinin gişedeki bileti ve satış fiyatını kendi başına yönetmesini sağlayan özerk varlıklar oluşturulmalıdır.


Özerkliği Artıralım

Yakından ilgili işleri yapan ve ilgili olmayan işleri başka nesnelere devreden nesnelere yüksek birleşiklik denir. Kendi verilerini kendi başına işleyen özerk nesneler oluşturmak, birleştirmeyi azaltıp birleşikliği artırır.


Prosedürel ve Nesne Yönelimli

  • Prosedürel
    • Theater'ın enter() yöntemi bir işlemdir ve Audience, TicketSeller, Bag, TicketOffice verilerdir.
    • İşlem ve verileri ayrı modüllerde konumlandırma biçimine prosedürel programlama denir.
    • Birçok sezgisel olmayan kod vardır. (Örn: İzleyiciler kendi paralarını ve davetiyelerini yönetir.)
    • Veri değişikliğinin etkilerini daraltmak zordur.
    • Sorumluluk merkezi olarak yönetilir. (Theater her şeyi yönetir)
  • Nesne Yönelimli
    • Veri ve işlemin aynı modül içinde yer aldığı programlama biçimine nesne yönelimli programlama denir.
    • Sezgisel kod yazabiliriz.
    • Veri değişikliğinin etkilerini kapsülleme yoluyla etkili bir şekilde daraltabiliriz.
    • Her nesne kendini sorumludur.


Daha da Geliştirilebilir

  • Audience sınıfının Bag sınıfı hala Audience sınıfı tarafından kontrol edilen pasif bir varlık olduğundan, Bag sınıfını özerk bir nesne haline getirmemiz gerekir.
  • TicketSeller sınıfının TicketOffice'i de TicketSeller tarafından keyfi olarak yönetiliyor. TicketOffice'i özerk bir nesne haline getirmemiz gerekir.
    • Ancak değişiklikten sonra TicketOffice, Audience ile ek bir birleştirme oluşturdu.
    • Bu nedenle, tasarımda uzlaşmaları dikkate almak gerekir. Bu durumda, Audience ile birleştirmeyi azaltmak için TicketOffice'i belirli bir ölçüde pasif bir nesne olarak kabul edebiliriz.



Hayır, Yalan Söylüyor!

  • Gerçekte, pasif bir varlık olsa bile, nesne yönelimli dünyaya girdiğinde her şey aktif ve özerk bir varlığa dönüşür.
  • Kişileştirmeyi kullanarak, pasif nesneleri sanki gülüyor, konuşuyor ve kızgın gibi düşünebiliriz.


Nesne Yönelimli Tasarım

Tasarım Neden Gereklidir?

  • Tasarım, kodu düzenlemektir.
  • İyi bir tasarım, bugünün ihtiyaç duyduğu işlevleri tam olarak yerine getirirken, yarının değişikliklerini sorunsuz bir şekilde kabul edebilmelidir.


Nesne Yönelimli Tasarım

  • Değiştirilebilir kod, anlaşılması kolay koddur.
  • Nesne yönelimli paradigma, dünyayı gördüğümüz şekilde kod yazmamıza yardımcı olur.
  • Nesneler, kendi verilerini kendi başlarına yöneten özerk varlıklardır.
  • Mükemmel bir nesne yönelimli tasarım, işbirliği yapan nesneler arasındaki bağımlılığı uygun şekilde yöneten bir tasarımdır.


Kaynaklar

  • Nesneler

Yorumlar0