Apakah "StringBuilder" aplikasi Pola Desain Builder?

31

Apakah pola "Builder" terbatas untuk mengatasi anti-pola "telescoping constructor", atau dapatkah itu juga dikatakan mengatasi masalah yang lebih umum dari penciptaan rumit benda tak bergerak?

The StringBuilderkelas memiliki kata "pembangun" dalam namanya, tetapi tidak ada hubungannya dengan telescoping konstruktor, itu hanya membantu kita mengumpulkan semua data yang kita butuhkan untuk lolos ke konstruktor dari objek abadi.

Bagi saya kelihatannya jawabannya adalah "ya" yang sangat jelas, tetapi tampaknya ada beberapa ketidaksepakatan mengenai topik tersebut, jadi saya berharap seseorang mungkin dapat mengklarifikasi hal itu.

Saya menjawab pertanyaan ini: Programmer SE: "pekerjaan nyata" yang sah dalam sebuah konstruktor? di mana OP ingin membuat objek (mungkin tidak berubah) yang berisi pohon kompleks, dan gagasan pola "pembangun" muncul, dan ketika meneliti itu saya menemukan T&J ini yang tampaknya mengatakan bahwa gaya penciptaan objek "StringBuilder" adalah bukan aplikasi dari pola "Builder", untuk alasan yang tidak jelas bagi saya: Stackoverflow - StringBuilder dan Builder Pattern . (Mereka yang menjawab pertanyaan itu gagal membuat poin meyakinkan sejauh yang saya tahu.)

Mike Nakis
sumber
2
Saya menemukan jawaban Paul Sasik pada pertanyaan Stack Overflow sepenuhnya meyakinkan: StringBuilder adalah "solusi" untuk masalah kinerja menggabungkan string abadi, tidak lebih. Paling-paling, StringBuilder "sayangnya bernama." Anda bisa membuat argumen bahwa StringBuilder dapat "membangun" halaman web, saya kira, tapi itu aplikasi spesifik dari mekanisme umum.
Robert Harvey
3
Jawaban Paul Sasik salah untuk Jawa - saya melihat kode sumber yang mendasarinya. StringBuildertampaknya menggunakan larik karakter yang mendasari untuk mewakili String dan memungkinkan Anda untuk melakukan hal-hal seperti penyisipan dan penghapusan di titik mana pun. Pada akhirnya, saya berpikir bahwa StringBuilder adalah solusi untuk objek String yang tidak berubah, tetapi sebaliknya bagi saya sepertinya memenuhi maksud dari pola Builder.
Thomas Owens
4
Saya perlu memikirkan hal ini lebih banyak - itu menggangguku. Saya hampir mulai menulis mengapa sesuatu seperti StringBuilder adalah versi dari pola Builder dan semua orang salah. Tetapi saya menemukan beberapa kelemahan, meyakinkan diri saya bahwa saya salah, tetapi kemudian berhasil kembali ke pikiran pertama saya. Jika Anda melihat maksud dari pola Builder, mudah untuk melihat bahwa "StringBuilder adalah Builder". Jika Anda melihat struktur pola Builder, itu lebih sulit.
Thomas Owens
1
Untuk apa nilainya, jawaban pada Stack Overflow ini setuju dengan pemikiran awal saya bahwa StringBuilder adalah implementasi pembangun dan komentarnya menarik. Jadi, Anda dapat menemukan kedua sisi argumen. Saya menyukai pertanyaan ini - saya tidak tahu apakah saya bisa membangun jawaban yang baik, tapi itu pertanyaan yang menarik. Saya akan memikirkan hal ini.
Thomas Owens
2
Tidak semua pola GoF bertahan dalam ujian waktu. Aku tidak bilang , aku hanya bilang.
Ben

Jawaban:

36

A StringBuildermirip dengan Pola Builder, tetapi tidak berbagi banyak dengan deskripsi GoF dari pola desain ini. Titik asli dari pola desain adalah

Pisahkan konstruksi objek yang kompleks dari representasinya sehingga proses konstruksi yang sama dapat membuat representasi yang berbeda.

- dari Pola Desain , oleh Gamma, Helm, Johnson, Vlissides.

(catatan: "kompleks" terutama berarti "terdiri dari banyak bagian", tidak harus "rumit" atau "sulit")

“Representasi yang berbeda” adalah kuncinya di sini. Misalnya dengan asumsi proses konstruksi ini:

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 ...");
}

kita mungkin berakhir dengan a HtmlDocumentatau a TexDocumentatau a MarkdownDocumenttergantung pada implementasi konkret yang disediakan:

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

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

Jadi salah satu titik utama dari pola Builder adalah polimorfisme . Buku Pola Desain membandingkan pola ini dengan Pabrik Abstrak:

Abstrak Factory mirip dengan Builder dalam hal itu juga dapat membangun objek yang kompleks. Perbedaan utama adalah bahwa pola Builder berfokus pada membangun objek yang kompleks selangkah demi selangkah. […] Builder mengembalikan produk sebagai langkah terakhir, tetapi sejauh menyangkut Pabrik Abstrak, produk akan segera dikembalikan.

- dari Pola Desain , oleh Gamma, Helm, Johnson, Vlissides.

Aspek langkah demi langkah ini kemudian menjadi aspek yang lebih populer dari pola Builder, sehingga secara umum pola Builder dipahami seperti ini:

Membagi konstruksi suatu objek menjadi beberapa langkah. Ini memungkinkan kami untuk menggunakan argumen yang dinamai atau parameter opsional bahkan dalam bahasa yang tidak mendukung fitur ini.

Wikipedia mendefinisikan pola seperti ini:

Pola pembangun adalah pola desain perangkat lunak pembuatan objek. Berbeda dengan pola pabrik abstrak dan pola metode pabrik yang niat adalah untuk memungkinkan polimorfisme, maksud dari pola pembangun adalah untuk menemukan solusi untuk anti-pola telescoping konstruktor [rujukan?] . [...]

Pola pembangun memiliki manfaat lain. Dapat digunakan untuk objek yang berisi data datar (kode html, kueri SQL, sertifikat X.509 ...), artinya, data yang tidak dapat diedit dengan mudah. Jenis data ini tidak dapat diedit langkah demi langkah dan harus diedit sekaligus. Cara terbaik untuk membangun objek seperti itu adalah dengan menggunakan kelas pembangun. [rujukan?]

- dari Builder Pattern di Wikipedia , oleh berbagai kontributor.

Jadi seperti yang dapat kita lihat, tidak ada pemahaman yang benar-benar umum tentang pola mana yang mengacu pada nama ini, dan dalam beberapa hal definisi yang berbeda bahkan saling bertentangan (misalnya mengenai relevansi polimorfisme untuk Pembangun).

Satu-satunya properti umum StringBuilderdengan berbagai interpretasi pola adalah bahwa produk dibuat langkah demi langkah alih-alih dalam sekali jalan. Ini tidak memenuhi pembacaan ketat definisi GoF dari pola desain, tetapi harap dicatat bahwa pola desain adalah konsep yang mudah ditempa yang dimaksudkan untuk memfasilitasi komunikasi. Saya akan terus memanggil StringBuildercontoh Pola Builder, meskipun yang atipikal - alasan utama untuk struktur di Jawa adalah penggabungan pemain di hadapan string abadi, tetapi tidak beberapa desain berorientasi objek yang menarik.

amon
sumber
7
Tampaknya bagi saya bahwa membuat objek yang tidak dapat diubah tampaknya menjadi salah satu kegunaan yang lebih umum dari Builder - Saya pikir ini telah menggantikan penggunaan utama seperti yang dijelaskan oleh GoF, jadi setujui bahwa ini jelas paling baik digambarkan sebagai contoh dari pola.
Jules
Setuju dengan penggunaan dalam membuat grafik yang tidak dapat diubah, usecase lain untuk Builder DSL sangat berguna untuk membuat grafik besar data palsu / ObjectMothers selama Unit + Pengujian Integrasi.
StuartLC