Adlandırılmış bağımsız değişkenler oluşturucu deseninin yerini alıyor mu?


20

Adlandırılmış ve isteğe bağlı bağımsız değişkenleri destekleyen bir dil kullanırken, oluşturucu kalıbının artık pratik bir kullanımı yok mu?

Oluşturucu:

new Builder(requiredA, requiredB).setOptionalA("optional").Build();

İsteğe bağlı / adlandırılmış bağımsız değişkenler:

new Object(requiredA, requiredB, optionalA: "optional");

3
20 isteğe bağlı argümanı nasıl ele alırsınız? Builder'ın büyüyene kadar çözmesi gereken bir sorun yok. Burada tarif ettiğiniz noktada iki kurucunuz var (ve ben bu kadar küçük bir problem için bir Builder inşa etmem).

1
İsteğe bağlı bağımsız değişkenlerle bile - yapıcı 2'den fazla bağımsız değişkene sahipse, yapılandırmayı kapsüllemek için bir değer nesnesi kullanmayı tercih ederim. Aynı şey sıvı arayüzleri ve yapıcı için de geçerlidir: 3'ten büyük olan her şey bir değer nesnesi ile değiştirilir.
Thomas Junk

Yanıtlar:


21

Oluşturucular, nesnenizin yararlı olması için çok sayıda bağımsız değişkene / bağımlılığa ihtiyaç duyduğunda veya nesneyi oluşturmanın birçok farklı yoluna izin vermek istediğinizde en kullanışlıdır.

Başımın üstünden, birinin 3D oyundaki nesneleri şöyle inşa etmek isteyebileceğini hayal edebiliyorum:

// Just ignore the fact that this hypothetical god class is coupled to everything ever
new ObjectBuilder(x, y, z).importBlenderMesh("./meshes/foo")
                          .syncWithOtherPlayers(serverIP)
                          .compileShaders("./shaders/foo.vert", "./shaders/foo.frag")
                          .makeDestructibleRigidBody(health, weight)
                          ...

Bu örneğin, şu anda oluşturduğum oluşturucu yöntemleri ile isteğe bağlı parametrelerle olduğundan daha okunabilir olduğunu iddia ediyorum:

new Object(x, y, z, meshType: MESH.BLENDER,
                    meshPath: "./meshes/foo",
                    serverToSyncWith: serverIP,
                    vertexShader: "./shaders/foo.vert",
                    physicsType: PHYSICS_ENGINE.RIGID_DESTRUCTIBLE,
                    health: health,
                    weight: weight)
                    ...

Özellikle, oluşturucu yöntem adları tarafından ima edilen bilgilerin yerine daha fazla parametre konulmalıdır ve yakından ilişkili parametreler grubundaki bir parametreyi unutmak çok daha kolaydır. Aslında, parça gölgelendirici eksik, ancak aramayı bilmediğiniz sürece bunu fark etmeyeceksiniz.


Tabii ki, nesneniz oluşturmak için yalnızca bir ila beş argüman alırsa, adlandırılmış / isteğe bağlı parametreleriniz olsun ya da olmasın, oluşturucu kalıbını dahil etmeye gerek yoktur.


Argümanlarınızı almıyorum. Oluşturucu yöntem adları çok güzelse, parametre adları için de kullanabilirsiniz. Parametreler yakından ilişkiliyse, bunları küçük bir nesne yapıcısına koyun.
user949300

@ user949300 Sanırım önemli bir noktayı kaçırdınız, ki burada oluşturucu yöntemler bir grup isteğe bağlı parametre varsa kaybolan parametreler arasındaki ilişkileri açıklar. Ixrec'in oluşturucu örneğinde, "sağlık" ve "ağırlık" açıkça mantıksal olarak yıkılabilir gövde ayarlarının bir parçasıdır, ancak bu ilişki isteğe bağlı bağımsız değişken sürümünde kaybolur.
Jules

1
isteğe bağlı parametrelerden biri değilse (gövde: yeni DestructibleRigidBody (sağlık, ağırlık), ...)
Weyland Yutani

@Jules. Weyland ne dedi - ağırlık ve boy için biraz iyi adlandırılmış bir yapıcı yapın.
user949300

8

Ixrec'in söylediklerine ek olarak, parametreler adlı yapıcılar veya yöntem, nesnenizi oluşturulmadan önce değiştirilebileceği yapılandırılacak bir duruma sahip olmanıza izin vermez. Bu, yapısının parçalarını farklı yöntemlere veya sınıflara tamamen devredebileceğiniz Builder'ın güzelliğidir:

var myThingBuilder = new ThingBuilder("table");
myThingBuilder.setAttribute(Attributes.Legs, 4);

inventoryManager.setPrices(myThingBuilder);

// inventory manager
var availableCheapestMaterial = getMaterial();
myThingBuilder.setMaterial(availableCheapestMaterial);

Temel olarak, son nesneyi oluşturmaya hazır olana kadar kurucunuzu sisteminizin etrafına atabilir ve böylece inşaatçı-tüketicinizin sahip olması gereken bilgi miktarını azaltmanıza izin verebilirsiniz.


Son paragrafınızı anlamıyorum. "Hazırlanana kadar sisteminizin etrafına fırlatırsanız", sistem hakkında çok fazla bilgiye sahiptir. ThingBuilder, Nitelikleri bilir, InventoryManager tarafından gizemli bir şekilde değiştirilir ve Materyalleri bilir. Bunun bilgiyi nasıl azalttığını görmüyorum.
user949300

@ user949300 Oluşturucu sistem genelinde seyahat etmeden nasıl olacağını düşünün . Büyük bir hayran bırakma faktörüne sahip bir sınıfa sahip olmak zorunda kalacaksınız ve bu sadece Şey'i inşa etmek için gerekli. (Tabii ki, sınıfınızın tüm bilgileri konsantre etmediğini varsayarsak, ilk etapta kaçınmak istediğimiz şey budur.) Şimdi, bu sınıfın başka bir sorumluluğu varsa, büyük bir sınıf yaratıyorsunuz, SOLID'de S'yi kırıyorsunuz . Tek sorumluluk buysa, kendinizi bir ThingBuilder yapıyorsunuz.
Alfa

1

Bu, inşaatçı ile ne yaptığınıza bağlıdır.

Yalnızca nesne özelliklerini ayarlamak ve (ertelemek) nesne oluşturmayı ayarlamak (ve değiştirmek) için builder kullanıyorsanız, adlandırılmış params ile değiştirilebilir.

Oluşturucuyu değiştirmek @Ixrec mentonlu okunabilirlik / kullanım dengesine sahip olabilir (ya da olmayabilir, oluşturucu ile ne yaptığınıza bağlıdır).

Bununla birlikte, kurucunuz sadece özellikleri tutmaktan daha fazlasını yaparsa ve her bir inşaat adımı mantık içeriyorsa, değiştirilemez.

MockBuilder , adlandırılmış params ile değiştirilemediği bir örnektir. Sayfadan:

Oluşturma adımlarındaki mantık adlandırılmış parametrelerle değiştirilemez


-5

Değişmez nesnelerle çalışırken yapıcı modeli esastır. Değişmez nesnelerle çalışmanın birçok avantajı vardır, özellikle de programınızın eşzamanlı bir ortamda (yani, iş parçacıkları) yürütülmesi daha sağlam hale getirilmesinde


3
Evet, İnşaatçılar karmaşık değiştirilemez nesnelerle (veya hatta değiştirilebilir nesnelerle) çalışmak için harikadır - nesnenin kullanılabilmesi için tutarlı bir durumda olduğundan emin olmanız gerekir). Yani new Integer(42), new BigDecimal("42.000")ve new String("foobar")tüm değişmezler için yapıcılar ... iyi, bir kurucu bu örnekler için gereksiz yere karmaşık olacaktır. Bu nedenle, bir inşaatçı, inşaatçılar da çalışabildiği zaman değişmez ile çalışmak için gerekli değildir .

Evet, bir yapıcı değişmeyen nesnelerle kullanılabilir, yani inkar edilmez. Ancak asıl soru, Oluşturucu deseninin isteğe bağlı argümanlar dışında herhangi bir pratik kullanımı olup olmadığıydı ve cevabım bunu açıklığa kavuşturmaktı.
codedabbler

2
Orijinal soru değişmez nesneler hakkında hiçbir şey söylemez . Adlandırılmış parametreler ve bunlarla Builders arasındaki ilişkiyi soruyor. Cevabınız inşaatçı ve onun değişmez nesnelerle olan ilişkisi ile ilgilidir. Cevabınızın soruyu nasıl yanıtladığını görmekte zorlanıyorum.
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.