![translation](https://cdn.durumis.com/common/trans.png)
Bu, AI tarafından çevrilen bir gönderidir.
Dil Seç
Text summarized by durumis AI
- Film rezervasyon sistemini uygulamak için nesne yönelimli programlama yöntemini açıklar ve işbirliği, nesne, sınıf kavramlarını tanıtır, alan yapısına uygun program yapısını vurgular.
- Özellikle nesnelerin özerkliğini ve kapsüllemeyi kullanarak dış müdahaleleri azaltan ve arayüzü uygulamadan ayırarak programcı özgürlüğünü sağlayan yöntemleri sunar.
- Ayrıca indirimli fiyat hesaplaması için işbirliğini, kalıtımı ve çok biçimliliği kullanarak esnek ve genişletilebilir kod yazma yöntemlerini açıklar ve soyutlamanın önemini ve kodun yeniden kullanılabilirliği için kompozisyonun avantajlarını vurgular.
Film Rezervasyon Sistemi
Gereksinimleri İnceleme
- Çevrimiçi film rezervasyon sistemi geliştirmek istiyoruz.
- Filmler, bir filmi temsil eden temel bilgileri içerir.
- Başlık, gösterim zamanı, fiyat bilgileri vb.
- Gösterimler, izleyicilerin gerçekten bir filmi izlediği olayları temsil eder.
- Gösterim tarihi, saati, sırası vb.
- İnsanlar filmleri rezerve ediyor, ancak aslında belirli birgösterimrezerve etmeliyiz.
- İndirim Koşulları
- Fiyat indirimi olup olmadığı
- Sıra Koşulu: Gösterim sırasını kullanarak indirim olup olmadığını belirleyin.
- Dönem Koşulu: Filmin gösterim başlangıç zamanını kullanarak indirim olup olmadığını belirleyin.
- İndirim Politikası
- İndirim ücretini belirle
- Tutar İndirim Politikası: Rezervasyon ücretinden belirli bir miktar indirim
- Oran İndirim Politikası: Liste fiyatından belirli bir oranda indirim
- Her film için bir indirim politikası atanabilir veya hiç atanamaz ve indirim koşulları, birden fazla indirim koşulunu birleştirebilir.
- İndirim 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, Nesneler, Sınıflar
- Nesne yönelimli, nesnelere yöneliktir.
- Bir sınıfı belirledikten sonra, bu sınıfa hangi özniteliklerin ve yöntemlerin gerekli olduğunu düşünmemelisiniz.
- Hangi nesnelerin hangi durumları ve eylemleri olacağına karar vermelisiniz.
- Nesneleri bağımsız varlıklar olarak değil, işbirliği yapan bir topluluğun parçası olarak görmelisiniz.
Etki Alanının Yapısını Takip Eden Program Yapısı
- Etki alanı, kullanıcının bir problemi çözmek için programı kullandığı alandır.
- Genel olarak, bir sınıfın adı, karşılık gelen etki alanı kavramıyla aynı veya en azından benzer olmalıdır.
- Sınıflar arasındaki ilişkiyi de, mümkün olduğunca, etki alanı kavramları arasındaki ilişkilere benzeterek, programın yapısını anlamak ve tahmin etmek kolaylaştırılmalıdır.
Sınıfları Uygulama
- Bir sınıf, iç ve dış olarak ayrılır ve mükemmel bir sınıf tasarlamak için, hangi bölümün dışarıya açıklanacağını ve hangi bölümün gizli tutulacağına karar vermelisiniz.
- Bir nesnenin öznitelikleri özel olarak engellenir ve iç durumu değiştirmek için gerekli yöntemler herkese açık olarak bırakılır.
- Bir sınıfın iç ve dışını ayırt etmeniz, programcılara uygulama özgürlüğü sağlayarak, nesnenin özerkliğini korur.
Özerk Nesneler
- Bir nesne, durumu ve eylemleri olan özerk bir nesne olmalıdır.
- Verileri ve işlevleri bir nesnenin içine birleştirmeye kapsülleme denir.
- Erişim denetimi, dış müdahaleyi azaltarak nesnenin kendi eylemlerine karar vermesini sağlar.
- Arayüz ve uygulama ayrımı ilkesi, nesne yönelimli programlamanın temel ilkelerinden biridir.
- Genel Arayüz: Dışarıdan erişilebilen kısım
- Uygulama: İçeriden erişilebilen kısım
Programcının Özgürlüğü
- Programcı 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ı, yalnızca gerekli bölümleri istemci programcılarına sağlayarak iç uygulamayı gizleyebilir.
- İstemci programcısı yalnızca arayüzü bilmesi gerektiğinden, bilgi miktarı azaltılabilir.
İşbirliği Yapan Nesnelerin Topluluğu
- Parayı temsil etmek için, basitçe Long türünde bir değişken bildirmek yerine, Money gibi bir nesneyle sarmanız daha iyidir. Nesne kullanımı, anlam aktarımı için daha iyi ve aynı işlemin bir yerde gerçekleştirilmesine olanak tanır.
- Bir sistemdeki belirli bir işlevi uygulamak için nesneler arasında gerçekleşen karşılıklı etkileşime işbirliği denir.
İşbirliğine Dair Kısa Bir Hikaye
- Bir nesnenin başka bir nesneyle etkileşime girebileceği tek yol mesaj göndermek veya almak.
- Alınan mesajı işlemek için kendi yoluna yöntem denir.
- Mesajı ve yöntemi ayırt etmek önemlidir; buradan çok biçimlilik kavramı başlar.
İndirim Ücreti Almak
İndirim Ücreti Hesaplamak İçin İşbirliğine Başlama
- Movie sınıfı, indirim politikasına ilişkin ayrıntılı mantığı içermez ve bu görevi DiscountPolicy arayüzüne devretmiştir. Miras ve çok biçimlilik, soyutlama kullanımı gerçekten önemlidir.
İndirim Politikası ve İndirim Koşulları
Miras ve Çok Biçimlilik
Derleme Zamanı Bağımlılığı ve Çalışma Zamanı Bağımlılığı
- Kod bağımlılığı ve çalışma zamanı bağımlılığı farklı olabilir.
- İkisinin arasındaki bağımlılık ne kadar farklıysa, kodu anlamak o kadar zorlaşır, ancak daha esnek ve genişletilebilir bir kod olur.
Farklılığa Göre Programlama
- Miras, mevcut bir sınıfa göre yeni bir sınıfı hızlı ve kolay bir şekilde eklemenizi sağlar ve üst sınıf uygulamasını yeniden kullanabilirsiniz.
- Yeni bir sınıfı üst sınıftan farklı kısımları ekleyerek oluşturma yöntemine farklılığa göre programlama denir.
Miras ve Arayüzler
- Miras, üst sınıf tarafından sağlanan tüm arayüzlerin alt sınıfa miras kalmasını sağlar.
- Arayüz, bir nesnenin anlayabileceği mesaj listesini tanımlar.
public class Movie {
public Money calculateMovieFee(Screening screening) {
return fee.minus(discountPolicy.calculateDiscountAmount(screening));
}
- Movie, DiscountPolicy'ye calculateDiscountAmount mesajını gönderiyor. Movie açısından, hangi sınıfın örneğinin yanıt vereceği önemli değil, yalnızca başarılı bir şekilde yanıt vermesi yeterlidir.
- Bu nedenle, hem AmountDiscountPolicy hem de PercentDiscountPolicy, Movie ile işbirliği yapmak için DiscountPolicy'nin yerine geçebilir.
- Bu şekilde, alt sınıfın üst sınıfın yerine geçtiği duruma yukarı dönüştürme denir. Alt sınıfın üst sınıfa otomatik olarak tür dönüştürülmesi gibi göründüğü için.
Çok Biçimlilik
- Çok biçimlilik, aynı mesajı aldığında nesnenin türüne bağlı olarak farklı şekilde yanıt verme yeteneğini ifade eder.
- Movie aynı mesajı gönderir, ancak hangi yöntemi çalıştıracağı, mesajı alan nesnenin sınıfının ne olduğuna bağlıdır.
- Çok biçimlilik, programın derleme zamanı bağımlılığının ve çalışma zamanı bağımlılığının farklı olabileceği gerçeğine dayanır.
- Çok biçimlilik, çalıştırılacak yöntemi çalışma zamanında belirlediği için gecikmeli bağlama veya dinamik bağlama olarak da adlandırılır.
Arayüzler ve Çok Biçimlilik
- Uygulamayı paylaşmanız gerekmiyorsa ve yalnızca arayüzü paylaşmak istiyorsanız, soyut sınıf yerine arayüz kullanabilirsiniz.
Soyutlama ve Esneklik
Soyutlamanın Gücü
- Soyutlamanın avantajları
- Sadece soyutlama katmanını ayrı olarak inceleyerek, gereksinimlerin politikalarını yüksek bir seviyede ifade edebilirsiniz.
- Tasarım daha esnek hale gelir.
Esnek Tasarım
- Soyutlama, tasarımın belirli durumlara bağlı olmasını önler, bu nedenle daha esnek bir tasarım yaratabilirsiniz.
Soyut Sınıflar ve Arayüzler Arasındaki Ticareti
public abstract class DiscountPolicy {
private List conditions;
public DiscountPolicy(DiscountCondition... conditions) {
this.conditions = Arrays.asList(conditions);
}
public Money calculateDiscountAmount(Screening screening) {
for (DiscountCondition condition : conditions) {
if (condition.isSatisfiedBy(screening)) {
return getDiscountAmount(screening);
}
}
return Money.ZERO;
}
abstract protected Money getDiscountAmount(Screening screening);
}
public class NoneDiscountPolicy extends DiscountPolicy {
@Override
protected Money getDiscountAmount(Screening screening) {
return Money.ZERO;
}
- Şu anda NoneDiscountPolicy aslında DiscountPolicy'nin calculateDiscountAmount() yönteminde indirim koşulu yoksa 0 döndürdüğü için, hiçbir sorun yok. Ancak, kullanıcı açısından Movie'nin argümanı olarak indirim politikası olmayan None politikasını eklemesi gerekiyor, bu nedenle eklendi.
- Bu nedenle, kavramsal olarak NoneDiscountPolicy sınıfı kafa karıştırıcıdır, bu nedenle aşağıdaki gibi düzenlerseniz anlamak daha kolaydır.
public interface DiscountPolicy {
Money calculdateDiscountAmount(Screening screening);
}
public abstract class DefaultDiscountPolicy implements DiscountPolicy {
private List conditions;
public DefaultDiscountPolicy(DiscountCondition... conditions) {
this.conditions = Arrays.asList(conditions);
}
public Money calculateDiscountAmount(Screening screening) {
for (DiscountCondition condition : conditions) {
if (condition.isSatisfiedBy(screening)) {
return getDiscountAmount(screening);
}
}
return Money.ZERO;
}
abstract protected Money getDiscountAmount(Screening screening);
}
public class NoneDiscountPolicy implements DiscountPolicy {
@Override
public Money calculateDiscountAmount(Screening screening) {
return Money.ZERO;
}
}
public class PercentDiscountPolicy extends DefaultDiscountPolicy {
private double percent;
public PercentDiscountPolicy(double percent, DiscountCondition... conditions) {
super(conditions);
this.percent = percent;
}
@Override
protected Money getDiscountAmount(Screening screening) {
return screening.getMovieFee().times(percent);
}
}
public class AmountDiscountPolicy extends DefaultDiscountPolicy {
private Money discountAmount;
public AmountDiscountPolicy(Money discountAmount, DiscountCondition... conditions) {
super(conditions);
this.discountAmount = discountAmount;
}
@Override
protected Money getDiscountAmount(Screening screening) {
return discountAmount;
}
- DiscountPolicy'yi bir arayüz olarak soyutlamak ve bunu NoneDiscountPolicy ve genel indirim politikasını ifade eden DefaultDiscountPolicy olarak uygulamalara ayırmaktır.
- Yalnızca NoneDiscountPolicy için bir arayüz eklemenin, artan karmaşıklığa kıyasla verimsiz olduğunu düşünebilirsiniz.
- Tüm yazılımın bir ticareti içerdiğini ve tasarım yaparken bunu bilmeniz gerekir. Yani yazdığınız her kodun mantıklı bir açıklaması olmalıdır.
Kod Yeniden Kullanımı
- Miras, kodu yeniden kullanmak için kullanılabilir.
- Ancak, kodu yeniden kullanmak için miras yerine kompozisyon kullanmak daha iyidir.
- Mevcut kodda, Movie'nin DiscountPolicy kodunu yeniden kullanma şekli kompozisyondur.
- Eğer Movie'yi üst sınıf olarak kabul edersek ve AmountDiscountMovie ve PercentDiscountMovie olarak ayırırsak, bu mirası kullanmak olacaktır.
Miras
- Mirasın dezavantajları
- Kapsüllemeyi ihlal eder.
- Üst sınıfın iç yapısını bilmeniz 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 hale getirmez.
- Üst sınıf ve alt sınıf arasındaki ilişki derleme zamanında belirlenir.
- Çalışma zamanında nesnenin türünü değiştirmek mümkün değildir.
- Ancak kompozisyon, kullanıcının chageDiscountPolicy() gibi bir yöntem aracılığıyla çalışma zamanında örneği değiştirmesine olanak tanır.
- Kapsüllemeyi ihlal eder.
Kompozisyon
- Arayüzde tanımlanan mesajları kullanarak kodu yeniden kullanma yöntemine kompozisyon denir.
- Kapsüllemeyi uygulayabilir ve gevşek bağlama sağlayabilirsiniz.
- Çok biçimlilik için arayüzü yeniden kullanıyorsanız, miras ve kompozisyonu birlikte kullanmanız gerekir.
- Örneğin, DiscountPolicy arayüzü, alt uygulamaları uygulamak için miras kullanmak zorundadır.
Kaynaklar
- Nesneler