Dernek, Toplama ve Kompozisyonun kullanımı nedir?


20

Kapsülleme nedir ve onu uygulamak için birleşme, Toplama ve Kompozisyon olan üç teknik hakkında birçok teori yaşadım.

Ne buldum :

kapsülleme

Kapsülleme, bir sınıftaki alanları özel yapma ve herkese açık yöntemlerle alanlara erişim sağlama tekniğidir. Bir alan özel olarak bildirilirse, sınıf dışındaki hiç kimse bu alana erişemez ve böylece sınıf içindeki alanları gizler. Bu nedenle kapsülleme, veri gizleme olarak da adlandırılır.

Kapsülleme, koda ve verilere sınıf dışında tanımlanan diğer kodlardan rasgele erişilmesini önleyen koruyucu bir bariyer olarak tanımlanabilir. Verilere ve koda erişim bir arayüz tarafından sıkı bir şekilde kontrol edilir.

Kapsüllemenin ana yararı, kodumuzu kullanan başkalarının kodunu kırmadan uygulanan kodumuzu değiştirme yeteneğidir. Bu özellik ile Kapsülleme, kodumuza sürdürülebilirlik, esneklik ve genişletilebilirlik sağlar.

bağlantı

İlişkilendirme, tüm nesnelerin kendi yaşam döngülerine sahip oldukları ve sahiplerinin olmadığı bir ilişkidir. Öğretmen ve Öğrenci örneğini ele alalım. Birden fazla öğrenci tek bir öğretmenle ilişkilendirilebilir ve tek bir öğrenci birden çok öğretmenle ilişkilendirilebilir, ancak nesneler arasında herhangi bir mülkiyet yoktur ve her ikisinin de kendi yaşam döngüsü vardır. Her ikisi de bağımsız olarak oluşturabilir ve silebilir.

toplanma

Toplama, tüm nesnelerin kendi yaşam döngülerine sahip olduğu özel bir Ortaklık şeklidir, ancak sahiplik vardır ve bir alt nesne başka bir üst nesneye ait olamaz. Bir bölüm ve öğretmen örneği alalım. Tek bir öğretmen birden fazla bölüme ait olamaz, ancak bölümü silersek öğretmen nesnesi yok edilmez. Bunu bir “has-a” ilişkisi olarak düşünebiliriz.

bileştirme, kompozisyon

Kompozisyon yine özel bir Toplama biçimidir ve bunu “ölüm” ilişkisi olarak adlandırabiliriz. Güçlü bir Toplama türüdür. Alt nesnenin yaşam döngüsü yoktur ve üst nesne silinirse tüm alt nesne de silinir. Ev ve odalar arasındaki ilişkiye bir örnek daha verelim. Ev birden fazla oda içerebilir, ancak odanın bağımsız bir yaşamı yoktur ve herhangi bir oda iki farklı eve ait olamaz. Evi silersek, oda otomatik olarak silinir.

Soru:

Şimdi bunların hepsi gerçek dünya örnekleri. Bu sınıfların gerçek sınıf kodunda nasıl kullanılacağı hakkında bazı açıklamalar arıyorum. Yani kapsülleme için üç farklı teknikler kullanarak noktanın ne , bu teknikler uygulanabilecek nasıl ve ne zaman geçerli olan teknik seçmek.


1
Toplama, Kompozisyon ve Birliğin kapsülleme uygulama teknikleri olmadığını lütfen unutmayın. Bir kapsülleme, yalnızca bir sınıf / nesne olsa bile olabilir. Kapsülleme, Nesne Yönelimi'nde nesnenizin verilerini gizlemek için önemli bir özelliktir.
Maxood

1
"Tek bir öğretmen birden fazla bölüme ait DEĞİLDİR " gerçekten? Kaynağınızın içeriği değiştirdiğini fark etmediniz mi?
KNU

Etki Alanına Dayalı Tasarım yaparken DDD Agrega Kökleri ve Varlıklarını tanımlamak için Kompozisyon kullanmayı başardım. Eski bir toplantı için yeni bir kullanım.
Jonn

Yanıtlar:


12

İlişkilendirme, toplama ve kompozisyon arasında tanımladığınız ayrım, manuel bellek yönetiminin eski zamanlarına geri dönen bir miras. Örneğin C ++ 'da nesneler tarafından kullanılan belleğin manuel olarak serbest bırakılması gerekir ve bu nedenle, oluşturulan nesnelerin yaşam döngüsünü dikkatlice tasarlamak çok önemlidir. Toplama ve kompozisyon arasındaki ayrım hala birçok ders kitabı tarafından öğretilirken, otomatik bellek yönetimine sahip ortamlarda programlama yaparken bu konu temelde önemsizdir. Çöp toplama varsa hepsi sadece kompozisyon, dönem.

Öte yandan kapsülleme, tanımladığınızdan çok daha genel bir prensiptir. Öncelikle verileri bir araya getirme fikri ve bu veriler üzerinde çalışan işlevler tek bir modülde. Bunu uygulamanın bir yolu, modülün durumunu özel tutmak ve bu hizmetleri kamu hizmetleri aracılığıyla açıklamaktır. Bu nedenle istemci, duruma kendi başına erişemez, ancak modüle mesaj göndererek niyetlerini söylemek zorundadır. Dolayısıyla kapsülleme yalnızca nesnelerle sınırlı olmayıp hizmetler için de geçerlidir. Aslında, nesnelere bakmanın bir yolu onlara hizmet olarak bakmaktır.

İşte bir kapsülleme örneği

public class Counter {
    private int n = 0;
    public int inc() { return n++; }
}

veya aynı lambda fonksiyonlarını kullanarak

var counter = (function() {
    var n = 0;
    var inc = function() { return n++; }
    return inc;
})();

Her iki durumda da, yani değişken olan veriler, üzerinde çalışan nişlevle birlikte paketlenir inc. Ve başka bir işlevin erişemeyeceği bir yol yoktur n, bu nedenle hizmet olarak saymayı sağlayan kapsüllenmiş bir modülümüz vardır.

Not: bir nesnenin tüm iç durumunu erişimciler aracılığıyla ortaya koymak aslında kapsüllemenin ihlalidir. Ne yazık ki, birçoğunun onu iyi nesne yönelimli tasarımla karıştırması yaygın bir ihlaldir.


2
Otomatik Bellek Yönetimi'nin nesne ilişkileriyle ilgisi yoktur. Bir nesne diyagramı, programcıya sınıfları, arayüzlerini ve yöntemlerini, söz konusu sistemin gereksinimlerine göre nasıl kodlayacağını anlatır.
Maxood

2
Hafıza dışında da bir düşünce var. Veri tasarımında veya belki de serileştirmede. Kompozisyonda, bir RDBMS'de farklı yabancı anahtar kısıtlamalarına sahip olmanız veya bir nesnenin, toplu çocuklara veya ilişkili nesnelere karşı kompozit çocukları varsa, nesneyi serileştirme şeklinizi değiştirmeniz gerekebilir.
Chris

8

Kapsülleme, bir sınıftaki alanları özel yapma ve herkese açık yöntemlerle alanlara erişim sağlama tekniğidir. Bir alan özel olarak bildirilirse, sınıf dışındaki hiç kimse bu alana erişemez ve böylece sınıf içindeki alanları gizler. Bu nedenle kapsülleme, veri gizleme olarak da adlandırılır.

    public class Test{

    private String name;

       private int age;

       public int getAge(){
          return age;
       }

       public String getName(){
          return name;
       }
    }

Bu soruya da bakın .

İlişkilendirme , nesneler arasındaki ilişkiyi gösterir. ör: Bilgisayar giriş aygıtı olarak klavyeyi kullanır.

Bir nesne, bir nesne başka bir nesnenin kendisine hizmet vermesini istediğinde kullanılır.

Toplama , özel bir ilişki örneğidir. Nesneler arasındaki yönlü ilişki. Bir nesne başka bir nesneye 'sahipse', aralarında bir kümelenme olur.

örneğin: Odanın bir masası vardır, fakat odanın odanız olmadan var olabileceği düşünülmektedir.

    class Room {

      private Table table;

      void setTable(Table table) {
        this.table = table;
      }

    }

Kompozisyon özel bir toplama örneğidir. Kompozisyon daha kısıtlayıcıdır. İki nesne arasında bir kompozisyon olduğunda, oluşturulan nesne diğer nesne olmadan var olamaz. Toplamada bu kısıtlama yoktur. Örn: evin yaşamından sonra var olamayan odalar.

    class House {

      private  Room room;

      House(Room roomSpecs) {
        room = new Room(roomSpecs);
      }

    }

Kompozisyon, Kalıtım veya nesne yeniden kullanımı için Kompozisyon ile sınıflarda has-a ilişkisini uygulamak için bir tasarım tekniğidir.

Java programlamasındaki en iyi uygulamalardan biri, miras üzerinde kompozisyon kullanmaktır


bu sorulan soruya nasıl cevap veriyor?
gnat

1

Bu tekniklerin kullanılması genellikle SOLID veya çeşitli tasarım desenleri gibi tasarım uygulamalarıyla sonuçlanır .

Kalıpları, uygulamaları ve benzerlerini kullanmanın amacı, aynı zamanda sürdürülebilir ve genişletilebilir belirli bir soruna bir çözüm tanımlamaktır. Sadece hangi desen veya tekniğin nerede kullanılacağını söylemek için yeterli deneyime sahip olmanız gerekir.


1

Açıkçası akademik alanda öğretilen bu kavramların nesne yönelimi ve sınıf tasarımı bağlamında önemleri olduğunu hissediyorum. Bir sistemin sıfırdan modellenmesi söz konusu olduğunda bu kavramlar bize çok yardımcı oluyor. İlişkilendirme, Toplama ve Kompozisyon yalnızca UML'nin sınıf şemasına aittir ve bellek sorunları gibi teknoloji kısıtlamalarından tamamen bağımsızdır.

Ayrıca, modellemekte olduğunuz sistemin üst düzey veya iş hedeflerini de göz önünde bulundurmalısınız. Sistemimizde Ev ve Oda gibi nesneler göz önünde bulunduruluyor, ancak (kompozisyon aracılığıyla) güçlü bir şekilde ilişkili olamaz. Örneğin, bir gayrimenkul sistemi modelliyorsam hangi odanın hangi eve ait olduğunu bilmek zorunda kalabilirim. Ancak, belirli bir bölgedeki evin her odasında kaç kişinin yaşadığını bilmek istediğim bir anket veya nüfus sayımı sistemini modellememe izin verin, o zaman sadece bir odayı kompozisyonla bir evle ilişkilendirmem gerekmiyor.

Başka bir örnek bir meyve bahçesi ve bazı meyveler olabilir. Diyelim ki bir meyve bahçesini ancak içine elma ağaçları diktiğimde düşünebilirim. Sonuç olarak, genel sistemin gereklilikleri çok önemlidir.

Kapsülleme , Nesne Odaklı Tasarımın temel taşlarından biridir. Verilerinizi ve verileriniz üzerinde gerçekleştireceğiniz işlemleri bir araya getirmeniz gerekir. ayrıca, o nesnenin geçerli bir durumda hayatta kalmasını sağlamak için nesnenizin belirli özelliklerini dış dünyadan gizlemeniz gerekir. 2 nesne etkileşime girdiğinde, birbirleriyle bir arabirim aracılığıyla etkileşim kurmaları gerekir. OO sistemimizi tasarlarken kapsülleme bunu sağlıyor.

Bu kavramların koda nasıl uygulandığı aşağıda açıklanmıştır:

DERNEK: İlişki nesneler arasındaki ilişkiyi gösterir. Programcının, sınıflarında birbirleriyle etkileşime girmelerini sağlamak için hangi yöntemleri yazacaklarını bilmelerini sağlar. İlişkilendirmeyi anlamak için birkaç kod ve sınıf diyagramı örneği bulabilirsiniz. Teach ve Öğrencinin sizin örnekte, bir ilişkisi yoktur öğretim ve öğrettiği . Böylece hangi öğrencinin hangi öğretmenlere ve hangi öğretmenin hangi öğrencilere sahip olduğunu öğrenebileceğiniz bir dizi yöntem (teknik olarak arayüz olarak adlandırılır) yazacaksınız. İlişkilendirme ayrıca sistem modellerinin veritabanı tasarımcısına veritabanında tutulması gereken özellikler ve alanlar konusunda yardımcı olmasını sağlar.

BİLEŞİM: Bir nesne başka bir nesnenin ayrılmaz bir parçasıysa, bu ilişkiyi diğer nesnenin yapıcısında belirtmek zorunda kalabilirim. Örneğin, Evler ve Odalar senaryosunda, hangi odanın hangi ev tipine ait olduğunu bilmek istiyorsak aşağıdaki kodu yazabiliriz.

class House{
          string _HouseType;   
     public:    
    void setHouseType(string house_type)
     {
        this. _HouseType = house_type;
     } 

     string getHouseType()
    {
       return _HouseType;
    }
};



 House HouseObject = new House();


class Room{

 public: 
 Room(string HouseType) {
       this._HouseType = HouseObject.getHouseType();  //as in my system a room cannot exist without a house

 } 

};

Başlatırken programcı da sağlayacaktır yıkıcı nesnenin diğer nesnenin destuctor da çağrılan, yani. Bu çok önemli.

TOPLAMA: Nesneler arasındaki ilişkinin zayıf olması programcı için bizden daha zayıfsa, ilişkiyi belirtmek için bunun yerine bir örnek değişken kullanmak anlamına gelir. Ve sonra başka bir nesneden o nesneye değer sağlamak için bir mutatör işlevi (ayarlayıcı) yazın.

class Department{

 string dept_name;

public:
   void setDeptName(string name)
   {
        this.dept_name=name;
   }

   string getDeptName()
   {
        return dept_name; 
   }

};



 Department DepartmentObject = new Department();

class Teacher{

 string dept_name;

public:

  setDeptName(string name)
  {
     this.dept_name = DepartmentObject.getDeptName();  //You only need to invoje this method when needed (aggregation)
  }
}

};

1

Tamam, bunu sadece ne anlama geldiğini anladıktan sonra mantıklı olan soyut kavramlar yerine bazı temel özelliklerle eşleştirelim. Bazı yorumcular gibi kabul edilen cevaba katılmıyorum, bunların bellek yönetiminden bağımsız kavramlar olduğunu söylüyorum.

kapsülleme

İstemciden karmaşıklığı gizlemek, yalnızca müşterinin bakış açısından önemli olan şeyleri yayınlamak, istemciyi daha kolay hale getirmek istiyorsunuz. Bonus olarak, hiçbir şeyin kapsüllenmiş kodla uğraşmayacağından emin olursunuz. Arayüze ve işlevselliğe saygı duyduğunuz sürece, bir şeyleri yeniden çalışabilir ve hiçbir şey kırmayacağınızdan emin olabilirsiniz. Bağımlılık yalnızca yayınlanan arayüzde.

Kapsülleme, nesne yöneliminin ana sütunlarından biridir. Bu bir örüntü değil, bir prensiptir ve hem mantık hem de veriler için geçerli olabilir. İlk olarak sınıfları kullanmanın temel bir yararıdır, bir diyagramda veya tasarım belgesinde açıkça belirttiğiniz bir şey değildir.

bağlantı

Bu, temelde nesneler arasındaki bağımlılığı tanımlayan çok gevşek bir kavramdır. Bir nesne başka bir nesnenin varlığını bilir ve işlevselliğini bir noktada kullanabilir. Diyagramda dernek, bir bağımlılık olduğunu ve bir nesneyi değiştirmenin diğerini etkileyebileceği konusunda sizi uyaracaktır. Çözülmesi gereken bir probleminiz olduğunda uygulamak için bir teknik değildir, daha çok orada olduğunda farkında olmanız gereken bir hayat gerçeği gibidir. Bu bir ilişkidir. Orders özelliğine sahip bir fatura gibi. Hem Düzen hem de Fatura'nın kendi yaşam döngüsü vardır. Biri mallar, diğeri ödeme ile ilgilidir, bu da onları bağımsız kılar, ancak hangi malların ödendiğini bilmek önemlidir.

kapsama

Bunu ekliyorum çünkü seriye ait ve toplama daha anlamlı hale gelecek. Terimin artık bir SE bağlamında kullanıldığını duymuyorum ama yine de yararlı olduğunu düşünüyorum. Sınırlama kapsülleme anlamına gelir, ancak kesinlikle kapsayıcı sınıfa özel nesne örnekleri ile ilgilidir. İçerilen nesnelerin işlevselliği, kamusal arabirimler aracılığıyla seçici olarak ortaya çıkar. İçeren sınıf, kontrol edilen nesnelerin yaşam döngüsünü kontrol eder. Kapsayıcı sınıfı işlevsel hale getirmek için mevcut bir sınıfın bazı özelliklerine ihtiyacınız olduğunda bunu kullanırsınız. Bu bir XML ayrıştırıcısı olabilir ve içeren sınıfın istemcisi XML ile ilgili hiçbir zaman göremez veya bilemez. Bir metafor olarak, içerdiği nesneyi bir arka ofis çalışanı olarak düşünün. Müşteriler bu insanlarla asla karşılaşmazlar, ancak hizmeti vermeleri gerekir.

toplanma

Bu, yaşam döngüsü kontrolü ve toplanan nesnelerin görünürlüğü dışında çok benzer bir sınırlamadır. Toplanan nesneler zaten farklı bir bağlamda kullanılabilir ve farklı bir varlık tarafından yönetilir. Toplayıcı sadece bir cepheye, toplanan nesnelere bir portal sunmaktadır. İstemci toplamı ele aldığında, etrafındaki bir sarmalayıcıyı değil, toplu nesnenin arayüzünü alır. Toplamın amacı, şeylerin mantıklı bir gruplandırmasını sunmaktır. Hizmetlere veya başka bir sarıcı nesneye erişim noktası düşünün.

bileştirme, kompozisyon

Bana öyle geliyor ki, muhtemelen daha yakın tarihli bir popüler kitapta yazıldığı için, çevreleme için daha çağdaş bir terim. Muhafaza, nesne ilişkilerinin teknik yönlerine odaklandığında, kompozisyon tipik olarak tasarım kararları bağlamında, daha spesifik olarak kalıtım için daha esnek bir alternatif olarak kullanılır.

Nesne ilişkilerinin veya sahipliğinin doğası hakkında fazla bir şey söylemez, sadece mevcut sınıfların işlevselliğini birleştirerek işlevin uygulandığını gösterir. Bu nedenle, bu diziye ait olmadığını iddia ediyorum çünkü diğerlerinin yaptığı bir uygulamanın teknik yönleri hakkında hiçbir şey söylemiyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.