Alıcılar olmadan iyi kod yazamazsınız.
Neden alıcılar kapsülleme kırmak değil, çünkü. Bunun nedeni, alıcıların insanları, üzerinde çalıştıkları verilerle yöntem koymalarını sağlayacak OOP'yi takip etmekten çekinmemeleri değildir. Onlar yapar. Hayır, sınırlar nedeniyle alıcılara ihtiyacınız var.
Kapsülleme ve yöntemlerin üzerinde çalıştıkları verilerle birlikte tutulması fikirleri, sizi bir yöntemi hareket ettirmekten alıkoyan ve böylece verileri taşımaya zorlayan bir sınıra girdiğinizde işe yaramaz.
Gerçekten bu kadar basit. Sınır olmadığında getters kullanıyorsanız gerçek nesneniz olmaz. Her şey usule uygun olmaya başlar. Hangi şimdiye kadar olduğu gibi çalışır.
Gerçek OOP her yere yayabileceğiniz bir şey değildir. Sadece bu sınırlar dahilinde çalışır.
Bu sınırlar çok ince değil. İçlerinde kod var. Bu kod OOP olamaz. İşlevsel de olamaz. Hayır, bu kod bizim ideallerimizi ondan çıkarmaz, böylece sert gerçeklikle başa çıkabilir.
Michael Fetters , portakalın bölümlerini bir arada tutan beyaz bağ dokusundan sonra bu kodu fasya olarak adlandırdı .
Bunu düşünmenin harika bir yolu. Her iki kod türünün de aynı kod tabanına sahip olmasının neden uygun olduğunu açıklar. Bu perspektif olmadan, birçok yeni programcı ideallerine sıkı sıkıya yapışıyor, sonra kalplerini kırıyor ve ilk sınırlarına ulaştıklarında bu ideallerden vazgeçiyorlar.
İdealler sadece uygun yerlerinde çalışırlar. Onlardan vazgeçme, çünkü her yerde çalışmazlar. Onları çalıştıkları yerde kullanın. Bu yer, ön panonun koruduğu sulu kısımdır.
Sınırın basit bir örneği bir koleksiyondur. Bu bir şey tutar ve ne olduğu hakkında hiçbir fikri yoktur. Bir koleksiyon tasarımcısı, ne tutacağına dair hiçbir fikirleri olmadığında, tutulan nesnenin davranış işlevselliğini koleksiyona nasıl taşıyabilir? Yapamazsın. Bir sınıra karşısın. Bu yüzden koleksiyonların alıcıları var.
Şimdi bilseydiniz, bu davranışı taşıyabilir ve durumu taşımaktan kaçınabilirsiniz. Bildiğin zaman yapmalısın. Sen her zaman bilmiyorsun.
Bazı insanlar bunu pragmatik olarak adlandırıyor. Ve budur. Ama neden pragmatik olmamız gerektiğini bilmek güzel.
Anlamsal argümanlar duymak istemediğinizi ve "mantıklı alıcıları" her yere koymayı savunduğunuzu ifade ettiniz. Bu fikrin sorgulanmasını istiyorsun. Bence fikrin onu çerçevelemenizle ilgili sorunları olduğunu gösterebilirim. Ama aynı zamanda nereden geldiğini de biliyorum çünkü oradaydım.
Her yerde alıcı istiyorsanız Python bakın. Özel bir anahtar kelime yok. Yine de Python OOP'u iyi yapıyor. Nasıl? Anlamsal bir numara kullanırlar. Özel olması gereken her şeyi bir alt çizgiyle adlandırırlar. Bunu yapmak için sorumluluk almanız şartıyla onu okuyabilirsiniz. "Hepimiz burada yetişkiniz" diyorlar.
Peki bu ve Java veya C # her şeyi getters arasındaki fark nedir? Üzgünüm ama anlambilim. Pythons altı çizili kongre size çalışanların sadece kapısının arkasına baktığınızı açıkça gösteriyor. Her şeyi tokatlar ve bu sinyali kaybedersiniz. Yansıması ile yine de özel olanı çıkarabilir ve hala semantik sinyali kaybetmemiş olabilirsiniz. Burada yapılması gereken yapısal bir argüman yoktur.
Burada kalan, "sadece çalışanlar" işaretini nereye asacağımıza karar vermektir. Özel olarak nelere dikkat edilmeli? Buna "mantıklı alıcılar" diyorsunuz. Söylediğim gibi, bir alıcı için en iyi gerekçe bizi ideallerimizden uzaklaştıran bir sınırdır. Bu, her şey için alıcılarla sonuçlanmamalıdır. Bir alıcıyla sonuçlandığında, davranışı koruyabileceğiniz sulu bitin içine taşımayı düşünmelisiniz.
Bu ayrım birkaç terime yol açtı. Veri Aktarım Nesnesi veya DTO, hiçbir davranışa sahip değildir. Tek yöntemler getters ve bazen setters, bazen bir kurucu. Bu isim talihsiz çünkü hiç de gerçek bir nesne değil. Alıcılar ve ayarlayıcılar gerçekten sadece bir kesme noktası ayarlamak için bir yer veren kod hata ayıklama. Bu ihtiyaç olmasaydı, sadece kamuya açık alanlar olurdu. C ++ 'da onlara yapı derdik. Bir C ++ sınıfından aldıkları tek fark, varsayılan olarak halka açık olmalarıydı.
DTO'lar iyidir, çünkü onları bir sınır duvarının üzerine atabilir ve diğer yöntemlerinizi güvenli bir şekilde güzel bir sulu davranış nesnesinde tutabilirsiniz. Gerçek bir nesne. İhlal edecek hiçbir alıcı olmadan kapsülleme. Davranış nesnelerim Parametre Nesneleri olarak kullanarak DTO'ları yiyebilir . Bazen paylaşılabilir değişebilir durumu önlemek için defansif bir kopyasını almak zorundayım . Değişken DTO'ları sınırın içindeki sulu kısmın içine yaymıyorum. Onları kapsülledim. Onları saklıyorum. Ve nihayet yeni bir sınıra girdiğimde yeni bir DTO döndürüyorum ve duvardan fırlatıp başka birinin sorunu haline getiriyorum.
Ama siz kimliğinizi ifade eden alıcılar sağlamak istiyorsunuz. Tebrikler, bir sınır buldun. Varlıkların referanslarının ötesine geçen bir kimliği vardır. Yani, bellek adreslerinin ötesinde. Bu yüzden bir yerde saklanmalıdır. Ve bir şey bu şeye kimliğiyle başvurabilmelidir. Kimliği ifade eden bir alıcı son derece makuldür. Varlığın kendisi tarafından verilebileceği kararları almak için o alıcıyı kullanan bir kod yığını değildir.
Sonunda yanlış olan alıcıların varlığı değildir. Kamusal alanlardan çok daha iyi. Kötü olan, Nesne Odaklı olmadığınızı iddia etmek için kullanıldığında. Mektuplar iyidir. Nesneye Yönelik olmak iyidir. Harfler Nesneye Yönelik değildir. Nesneye Dayalı olmak için güvenli bir yer açmak için alıcıları kullanın.