![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Участник клуба
Регистрация: 04.04.2010
Сообщений: 1,554
|
![]()
Часто стали попадаться такие вещи.
Код:
Код:
https://nesteruk.wordpress.com/2010/...der-in-csharp/ А в чём фишка то? Чем первый способ записи лучше чем: Код:
Код:
|
![]() |
![]() |
![]() |
#2 | |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,091
|
![]() Цитата:
![]() Тут уже в случае с fluent builder код возможен более гибкий и меньше дублирований будет. Для Assert нужно писать методы AreNotEqual, AreEqual, AreLess, AreNotLess, ... Тут уже использование подобного подхода вполне может быть оправдано. Просто важно эту штуку правильно использовать, а не пихать всюду моды для. |
|
![]() |
![]() |
![]() |
#3 | |
Форумчанин
Регистрация: 25.09.2009
Сообщений: 525
|
![]() Цитата:
![]() там всего 1 раз написано слово trigger, а тут аж целых 5 |
|
![]() |
![]() |
![]() |
#4 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
![]()
Pattern Builder - повышаем читаемость, скрываем доступ к полям класса, благодаря собственно билдеру.
DSL - повышаем читаемость и качество кода в общем, не злоупотреблять. p.s. pu4koff - модно? Ну что же вы, помоему тут мода вообще не причем. |
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,091
|
![]()
Что мешает создавать понятные классы и не выпячивать что не следует наружу как и положено модификаторами доступа (private, protected)?
Я не против такого подхода и это может быть удобно, но люди же эту штуку используют не потому что нужно, а потому что хочется. Я не против "стандартного" StringBuilder'a и это очень полезная штука. Только вот он не работает по принципу: в методе Create создадим объект типа string, а в методе Append создадим взамен новую строку или тупо вызовем нужные методы класса string. Человеки просто как бараны услышали про паттерны и теперь у всех синглтоны, фабрики, ... Раньше как-то жили и не парились, а теперь всё по науке, по шаблонам и мышление стало: так, вот тут я замучу вот этот паттернт, а тут... сейчас книжку полистаю, подберу подходящий... во. Вот этот паттерн тут забабахаю и крутотень будет. Если посмотреть на TriggerBuilder из первого поста. Я так полагаю, что последовательность выполнения WithIdentity, StartAt и WithSimpleSchedule не важна, главное - что они после Create и до Build. Только благодаря этой крутой штуке мы вместо прямого вызова конструктора для нужного типа вызываем какой-то метод ненужного нам класса. Потом вызываем методы в непонятной последовательности (будут они одинаково хорошо работать, если строки местами поменять?), а потом еще вызываем некий Build для выполнения всей этой радости. Вопрос тестирования и отладки для меня выглядит сомнительным и усложнения неоправданы. До кучи мы получаем дополнительный класс и логика работы этого класса размазана уже по двум классам (Builder же должен знать что зачем и почему в этом классе происходит и в случае изменений у нас появляется дополнительная головная боль). Моё мнение, что все эти Builder'ы должны хранить состояние в некоем своём виде и максимально отдаляться от типа создаваемого объекта. Объект нужного типа должен создаваться определенным методом, а у билдера должен быть свой конструктор, т.к. не всегда может быть некое "нулевое" состояние, т.е. должно быть как-то так: Код:
Класс нужен для выполнения каких-то функций и если он получился убогим и неудобным, значит нужно не таких вот билдеров-помощников лепить, а делать нормальный класс. Не должно это быть просто обёрткой, а иначе получится 5 уровней обёрток, а внутри фигня. |
![]() |
![]() |
![]() |
#6 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
![]()
Ну вы прямо бурно реагируете как то. Простой пример, сам с таким встречаюсь очень часто: нужно создать объект класса, много полей, все поля должны быть установлены, т.е. получаем дефолтные значения.
Ну как вы пишете, билдер зло, но открывать сеттеры нельзя, значит все идет в конструктор. Получаем: Код:
Или же другой вариант, класс помошник - билдер идет внутри класса Object и дает нам следующий вариант: Код:
UPD: Код:
Последний раз редактировалось BOBAH13; 14.11.2012 в 23:00. |
![]() |
![]() |
![]() |
#7 | |||
Старожил
Регистрация: 22.05.2007
Сообщений: 9,091
|
![]()
Нормально я реагирую. Просто очередная крутая штука, которую пихают куда надо и куда не надо
![]() Цитата:
Цитата:
Код:
Цитата:
По этой логике нужно делать все объекты константными и для всех классов писать билдеры. Как по мне, так билдер должен идти как дополнительная фича (без всяких специальных затачиваний нужного класса под это дело). Это чисто оптимизационная штука, которая позволяет быстрее создавать кучи однотипных объектов или же совершать ряд преобразований для тяжелых объектов или что там еще в голову придёт. Когда получается класс, который слишком сложен и для его использования нужно добавить еще один класс - это нездоровая вещь и с этим нужно бороться. |
|||
![]() |
![]() |
![]() |
#8 | ||
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
![]() Цитата:
p.s. не люблю когда люди приводят кучу текста и комментариев абсолютно игнорируя мои аргументы несколько раз. Ознакомтесь со Scala к примеру, в ней много подобных конструкций, т.к. подобный код является самодокументрированным. Посмотрите на названия функий в Objective C, посмотрите на тендеции развития Android SDK от Google, тот же Animation. Конечно же это все, что я привожу Цитата:
Последний раз редактировалось BOBAH13; 15.11.2012 в 01:23. |
||
![]() |
![]() |
![]() |
#9 | ||||
Старожил
Регистрация: 22.05.2007
Сообщений: 9,091
|
![]() Цитата:
Поясняю: В делфях конструкторы можно назвать как угодно и плюсовики (и прочие, где конструкторы совпадают с именем класса) на этот счет часто говорили, что это неудобно, неправильно, т.к. непонятно как там конструктор называется... Тут получается уже за фичу, что создание объекта производится методом с понятным автору названием (даже хуже получается, т.к. нет никакого специального ключевого слова и этот метод визуально ничем не отличается от других статических). Цитата:
Цитата:
Чем в итоге предложенная мною обычная вспомогательная структура хуже и чем не подходит? Не считаю, что выстраивание методов в какой-то поток понятнее и лучше, чем старый добрый оператор присваивания. Метод - это глагол, какое-то действие. Передача параметров в конструктор - это не действие. Цитата:
Я писал, что в целом я не против этих всех билдеров, но я за их правильное использование. В целом тенденция идёт дурацкая. Каждой фигне придумывают названия и любители новых и не очень фич стремятся эти все штуки обязательно использовать. ООП еще не знает человек, классы нормально сделать не может, но уже у него там "фабрика" из книжки умной перепечатана, куча слоёв выделена и всё типа труъ, а потом происходит затык, который в книжке той естественно не описан и начинается макаронное веселье. |
||||
![]() |
![]() |
![]() |
#10 | ||
Участник клуба
Регистрация: 04.04.2010
Сообщений: 1,554
|
![]()
BOBAH13
Цитата:
pu4koff Цитата:
![]() Скажем RequiredBilder и UnrequiredBilder. С такой позиции вполне оправданная штукенция. |
||
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
CodeGear C++ Builder 2007 Lite не может откомпилировать исходники C++ Builder 6 | Ecosasha | C++ Builder | 2 | 22.11.2013 15:02 |
c++ builder | CepBep | Помощь студентам | 0 | 07.07.2012 17:19 |
переезд из C++ Builder 6 в C++ Builder 2009 | NadS | Помощь студентам | 2 | 18.03.2012 06:44 |
Синтаксис Delphi Builder --> C++ Builder | KingBelt | C++ Builder | 2 | 28.11.2010 16:25 |
Перенести код из C++ Builder 5 в C++ Builder 2009 | Kreadlling | C++ Builder | 2 | 13.09.2009 14:00 |