Чи "StringBuilder" є програмою дизайну дизайнера Builder?


31

Чи обмежений шаблон "Будівельника" адресацією "конструктора телескопічного" антитіл, чи можна сказати, що він також вирішує більш загальну проблему складного створення незмінних об'єктів?

StringBuilderКлас має слово «будівельник» в його назві, але це не має нічого спільного з телескопічними конструкторами, він просто допомагає нам зібрати всі дані , які ми повинні передати в конструктор незмінного об'єкта.

Мені здається, що відповідь дуже чітке "так", але, мабуть, є якась незгода на цю тему, тому я сподівався, що хтось, можливо, може її уточнити.

Я відповідав на це запитання: Програмісти SE: Законна «реальна робота» в конструкторі? де ОП хоче створити (імовірно незмінний) об'єкт, що містить складне дерево, і ідея про модель "будівельника" спливає, і, досліджуючи його, я знайшов це запитання і запитання, які, схоже, говорять про те, що стиль "StringBuilder" створює об'єкт - це не застосування шаблону "Builder" з незрозумілих мені причин : Stackoverflow - StringBuilder та Builder Pattern . (Ті, хто відповідає на це запитання, не змогли зробити переконливий момент, наскільки я можу сказати.)


2
Я вважаю, що відповідь Пола Сасіка на це питання Stack Overflow є цілком переконливим: StringBuilder - це "вирішення" для проблеми ефективності об'єднання незмінних рядків, і не більше того. У кращому випадку StringBuilder "на жаль названий". Ви можете зробити аргумент, що StringBuilder може "будувати" веб-сторінки, я думаю, але це специфічне застосування загального механізму.
Роберт Харві

3
Відповідь Пола Сасика для Java неправильна - я переглянув основний вихідний код. StringBuilder, як видається, використовується основний масив символів для представлення рядка і дозволяє робити такі дії, як вставки та видалення в будь-якій точці. Зрештою, я думаю, що StringBuilder - це спосіб вирішення незмінних об'єктів String, але в іншому випадку мені здається, що він відповідає наміру схеми Builder.
Томас Оуенс

4
Мені потрібно думати про це набагато більше - це мене турбує. Я майже почав писати, чому щось на зразок StringBuilder - це версія шаблону Builder, і всі інші помилялися. Але я виявив кілька слабких сторін, переконав себе, що помилявся, але потім зумів повернутися до своєї першої думки. Якщо ви дивитесь лише на наміри шаблону Builder, легко помітити, що "StringBuilder - це Builder". Якщо подивитися на структуру шаблону Builder, це складніше.
Томас Оуенс

1
Для чого це варто, ця відповідь на Stack Overflow погоджується з моєю первісною думкою, що StringBuilder - це програма для побудови, і коментарі цікаві. Таким чином, ви можете знайти обидві сторони аргументу. Мені подобається це питання - я не знаю, чи зможу скласти гарну відповідь, але це цікаве питання точно. Я буду про це думати.
Томас Оуенс

2
Не всі структури Міністерства фінансів витримують перевірку часом. Я не кажу , я просто говорю.
Бен

Відповіді:


36

A StringBuilderсхожий з шаблоном Builder, але не дуже поділяє опис GoF для цього шаблону дизайну. Оригінальною точкою дизайнерського зразка був

Відокремте побудову складного об'єкта від його подання, щоб той самий процес будівництва міг створювати різні уявлення.

- від Design Patterns , від Gamma, Helm, Johnson, Vlissides.

(зауважте: "складний" насамперед означає "складається з декількох частин", не обов'язково "складних" або "важких")

Тут є ключовим "різні уявлення". Наприклад, якщо цей будівельний процес:

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

ми можемо отримати HtmlDocumentабо, TexDocumentабо MarkdownDocumentзалежно від конкретної реалізації:

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

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

Отже, однією з центральних точок картини Будівельника є поліморфізм . Книга «Шаблони дизайну» порівнює цю схему з «Фабрикою абстрактних:

Abstract Factory схожий на Builder тим, що він також може будувати складні об'єкти. Основна відмінність полягає в тому, що модель Builder фокусується на побудові складного об'єкта поетапно. […] Builder повертає продукт як завершальний крок, але що стосується абстрактної фабрики, то продукт повертається негайно.

- від Design Patterns , від Gamma, Helm, Johnson, Vlissides.

Цей покроковий аспект потім став більш популярним аспектом шаблону Builder, так що в загальному розумінні шаблон Builder розуміється так:

Розбиття об’єкта на кілька етапів. Це дозволяє нам використовувати названі аргументи або необов’язкові параметри навіть у мовах, які не підтримують ці функції.

Вікіпедія визначає такий зразок:

Шаблон конструктора - це модель дизайну програмного забезпечення для створення об'єктів. На відміну від абстрактного фабричного малюнка та фабричного методу, метою якого є включення поліморфізму, задум конструктора полягає у пошуку рішення антитілесного конструктора телескопічного конструктора [потрібна цитата] . […]

Модель будівельника має ще одну перевагу. Його можна використовувати для об'єктів, які містять плоскі дані (html-код, SQL-запит, сертифікат X.509 ...), тобто дані, які неможливо легко редагувати. Цей тип даних не можна редагувати поетапно і їх слід редагувати відразу. Найкращий спосіб побудови такого об’єкта - використовувати клас будівельника. [потрібна цитата]

- із " Шаблон будівельника" у Вікіпедії , від різних дописувачів.

Отже, як ми бачимо, немає по-справжньому загального розуміння того, до якого шаблону відноситься ця назва, а в деяких точках різні визначення навіть суперечать одне одному (наприклад, щодо актуальності поліморфізму для будівельників).

Єдиною загальною властивістю StringBuilderрізних інтерпретацій шаблону є те, що продукт створюється поетапно, а не за один раз. Це не відповідає чіткому читанню визначення GoF щодо схеми дизайну, але зауважте, що дизайнерські зразки - це податливі поняття, призначені для полегшення спілкування. Я б продовжував називати StringBuilderприклад шаблону Builder, хоч і нетиповий - головна причина такої структури в Java - це конкатенація, що є незмінною за наявності незмінних рядків, але не якийсь цікавий об'єктно-орієнтований дизайн.


7
Мені здається, що створення незмінних об'єктів здається одним із найбільш поширених застосувань Builders - я думаю, що це замінило основне використання, як описано в GoF, тому погоджуйтеся, що це, безумовно, найкраще описано як екземпляр шаблону.
Жуль

Погодьтеся з використанням у створенні непорушних графіків. Інший шафа для DSL-файлів Builder дуже корисний для створення великих графіків підроблених даних / ObjectMothers під час тестування Unit + Integration.
StuartLC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.