“StringBuilder”, Builder Design Pattern'in bir uygulaması mı?


31

“Oluşturucu” paterni “teleskop yapıcı” anti paternini ele almakla sınırlandırılmış mıdır, yoksa karmaşık değişken nesnelerin yaratılmasının daha genel bir soruna hitap ettiği söylenebilir mi?

StringBuilderSınıf adında kelime "oluşturucu" var, ama Kurucular iç içe ile ilgisi yoktur, sadece bize değişmez bir nesnenin yapıcısı geçmek için gereken tüm verileri toplamak yardımcı olur.

Bana göre cevap çok net bir "evet" gibi görünüyor, ancak konuyla ilgili bazı anlaşmazlıklar var gibi görünüyor, bu yüzden birinin açıklığa kavuşturması gerektiğini umuyordum.

Bu soruyu cevaplıyordum: Programcılar SE: Bir kurucuda meşru “gerçek iş”? OP'nin karmaşık bir ağaç içeren (muhtemelen değişmeyen) bir nesne yaratmak istediği ve "oluşturucu" modelinin fikri ortaya çıktığında ve onu araştırırken nesne yaratma stilinin "StringBuilder" tarzında olduğunu belirten bir soru-cevap buldum. değil : Benim için net değildir nedenlerle "Oluşturucu" desen bir uygulama, StringBuilder ve Oluşturucu Desen - Stackoverflow . (Bu soruyu cevaplayanlar söyleyebileceğim kadar ikna edici bir noktaya değinmedi.)


2
Paul Sasik'in Stack Overflow sorusundaki cevabını tamamen ikna edici buluyorum: StringBuilder değişmez karakterleri birleştirmenin performans sorunu için bir "geçici çözüm" dür. En iyi ihtimalle, StringBuilder "ne yazık ki" olarak adlandırılmıştır. StringBuilder'ın web sayfalarını "derleyebileceğini" iddia edebilirsin, sanırım, ama bu genel bir mekanizmanın özel bir uygulaması .
Robert Harvey,

3
Paul Sasik'in cevabı Java için yanlış - Temel kaynak koduna baktım. StringBuilderDizeyi temsil etmek için temel bir karakter dizisi kullanıyor gibi görünür ve herhangi bir noktada ekleme ve kaldırma gibi şeyleri yapmanızı sağlar. Sonuçta, StringBuilder'ın değişmez String nesneleri için geçici bir çözüm olduğunu düşünüyorum, ancak aksi takdirde Builder deseninin amacına uygun gibi görünüyor.
Thomas Owens

4
Bunun hakkında daha çok düşünmem gerekiyor - bu beni rahatsız ediyor. Neredeyse StringBuilder gibi bir şeyin Builder deseninin bir sürümü olduğunu ve diğer herkesin hatalı olduğunu yazmaya başladım. Ama birkaç zayıf nokta buldum, kendimi yanıldığımı ikna ettim, ama sonra ilk düşünceme dönmeyi başardım. Builder deseninin amacına bakarsanız, "StringBuilder bir Builder" olduğunu görmek kolaydır. Oluşturucu deseninin yapısına bakarsanız daha zordur.
Thomas Owens

1
Ne olursa olsun, Stack Overflow'un bu cevabı, StringBuilder'ın üretici bir uygulama olduğunu ve yorumların ilginç olduğunu düşündüğüm ilk fikre katılıyor . Böylece tartışmanın iki tarafını da bulabilirsiniz. Bu soruyu lehine çeviriyorum - İyi bir cevap oluşturabilecek miyim, bilmiyorum ama bu kesinlikle ilginç bir soru. Bunun hakkında düşüneceğim.
Thomas Owens

2
GoF kalıplarının tümü zaman testine dayanmıyor. Ben değilim diyordum , ben sadece söylüyorum.
Ben

Yanıtlar:


36

A StringBuilder, Oluşturucu Desenine benzer, ancak bu tasarım deseninin GoF açıklamasıyla fazla bir şey paylaşmaz. Tasarım modelinin orijinal noktası

Karmaşık bir nesnenin yapısını temsilinden ayırın, böylece aynı yapım süreci farklı temsiller oluşturabilir.

- Tasarım Desenlerinden Gamma, Helm, Johnson, Vlissides.

(not: “karmaşık”, öncelikle “karmaşık” veya “zor” değil, “çoklu parçalardan oluşur” anlamına gelir)

“Farklı temsiller” burada anahtardır. Örneğin, bu inşaat sürecini varsayarak:

interface ArticleBuilder {
  void addTitle(String title);
  void addParagraph(String paragraph);
}

void createArticle(ArticeBuilder articleBuilder) {
  articleBuilder.addTitle("Is String Builder an application of ...");
  articleBuilder.addParagraph("Is the Builder Pattern restricted...");
  articleBuilder.addParagraph("The StringBuilder class ...");
}

hangi somut uygulamanın sağlandığına bağlı olarak bir HtmlDocumentveya bir TexDocumentveya daha MarkdownDocumentfazlasıyla sonuçlanabiliriz :

class HtmlDocumentBuilder implements ArticleBuilder {
  ...
  HtmlDocument getResult();
}

HtmlDocumentBuilder b = new HtmlDocumentBuilder();
createArticle(b);
HtmlDocument dom = b.getResult();

Bu nedenle, Oluşturucu modelinin merkezi bir noktası polimorfizmdir . Tasarım Desenleri kitabı bu kalıbı Soyut Fabrikayla karşılaştırır:

Soyut Fabrika, Oluşturucu'ya benzer, çünkü karmaşık nesneler de oluşturabilir. Birincil fark, Oluşturucu deseninin adım adım karmaşık bir nesne oluşturmaya odaklanmasıdır. […] Oluşturucu ürünü son adım olarak verir, ancak Soyut Fabrika söz konusu olduğunda, ürün derhal iade edilir.

- Tasarım Desenlerinden Gamma, Helm, Johnson, Vlissides.

Bu adım adım görünüş, Oluşturucu modelinin daha popüler bir özelliği haline gelmiştir, böylece ortak bakış açısında, Oluşturucu modeli şu şekilde anlaşılır:

Bir nesnenin yapısını çoklu adımlara ayırın. Bu, bu özellikleri desteklemeyen dillerde bile adlandırılmış değişkenleri veya isteğe bağlı parametreleri kullanmamızı sağlar.

Wikipedia bu şekli şöyle tanımlar:

Oluşturucu deseni, bir nesne oluşturma yazılımı tasarım desenidir. Soyut fabrika modelinin ve niyeti polimorfizmi sağlamak olan fabrika yöntemi modelinin aksine, üretici modelinin amacı teleskop yapıcı anti-paternine [ihtiyaç duyulan] bir çözüm bulmaktır . [...]

Oluşturucu paterninin başka bir faydası var. Düz veri içeren nesneler (html kodu, SQL sorgusu, X.509 sertifikası ...), yani kolayca düzenlenemeyen veriler için kullanılabilir. Bu tür veriler adım adım düzenlenemez ve bir kerede düzenlenmelidir. Böyle bir nesneyi inşa etmenin en iyi yolu bir oluşturucu sınıfı kullanmaktır. [kaynak belirtilmeli]

- Wikipedia'daki Builder Pattern'ten , çeşitli katılımcılar tarafından.

Gördüğümüz gibi, bu ismin hangi örgüye atıfta bulunduğunu gerçekten ortak bir anlayış yoktur ve bazı noktalarda farklı tanımlar birbirleriyle çelişir (örneğin, Yapımcılar için polimorfizmin önemi ile ilgili).

Desenin StringBuilderçeşitli yorumlarının tek ortak özelliği , ürünün tek seferde değil, adım adım oluşturulmasıdır. Tasarım modelinin GoF tanımının kesin bir okumasını karşılamıyor, ancak tasarım modellerinin iletişimi kolaylaştırmak için dövülebilir kavramlar olduğunu lütfen unutmayın. StringBuilderAtipik olsa da Oluşturucu Örüntüsünün bir örneğini aramaya devam edecektim - Java'daki bu yapının temel nedeni değişmez dizgelerin varlığında performansın bir araya gelmesidir, fakat bazı ilginç nesne yönelimli tasarımlar değil.


7
Bana göre, değişmez nesneler yaratmanın, İnşaatçılar'ın en yaygın kullanımlarından biri gibi görünüyor - Sanırım bunun birincil kullanımı GoF tarafından tanımlandığı gibi değiştirdiğini düşünüyorum, bu yüzden bunun kesinlikle en iyi modelin bir örneği olarak tanımlandığını kabul edin.
Jules

Değişmez grafikler oluştururken kullanımı kabul edersiniz, Builder DSL'ler için başka bir usecase, Unit + Entegrasyon Testi sırasında büyük Sahte veri / ObjectMothers grafikleri oluşturmak için gerçekten yararlıdır.
StuartLC
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.