Шаблон построителя и объект конфигурации

Присоединитесь к генератору месяцев по вашему запросу:

select to_char(to_date(mth_num, 'MM'), 'MONTH') month, nvl(cnt, 0) cnt
  from (
    select count(emp_id) as cnt, to_char(due_date, 'mm') mth_num
      from emp_request where due_date is not null
      group by to_char(due_date, 'mm')) e
  right join (
    select to_char(level, 'fm00') mth_num 
      from dual connect by level <= 12) m using (mth_num)
  order by mth_num

dbfiddle demo sup>

Генератор месяцев - это простой иерархический запрос, который дает нам 12 значений 01, 02 ... 12:

select to_char(level, 'fm00') mth_num from dual connect by level <= 12

Вы также можете использовать системные представления для получения этих чисел: [ 1114]

select to_char(rownum, 'fm00') mth_num from all_objects where rownum <= 12

или этот синтаксис:

select to_char(column_value, 'fm00') mth_num 
  from table(sys.odcivarchar2list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12))

Лучше работать с числами, которые можно правильно отсортировать и преобразовать в названия месяцев на последнем шаге. Таким образом, у вас есть естественный месячный порядок. Если вы хотите быть уверены, что названия месяцев всегда на английском языке, не зависят от локальных настроек, используйте to_date с третьим параметром, как здесь:

select to_char(sysdate, 'month', 'nls_date_language=english') from dual

29
задан 21.03.2018, 03:53

5 ответов

Шаблон компоновщика улучшает разделение - ваш Продукт может быть интерфейсом, и единственный класс, который знает о реализации (или реализациях, в некоторых случаях), это компоновщик. Если разработчик также реализует интерфейс, вы можете добавить его в свой код, чтобы еще больше увеличить развязку.

Эта развязка означает, что ваш код более удобен в обслуживании и его проще тестировать.

16
ответ дан 14.10.2019, 11:59
  • 1
    В примере как показано я думаю there' s все еще связывающийся. Вызывающая сторона должна знать для вызова всех тех цепочечных методов, если он пропускает тот тогда, продукт правильно не инициализируется. Изменения в продукте требуют, чтобы изменения в разработчике потребовали, чтобы изменения в клиенте - звучали двойными мне. – djna 03.08.2010, 11:44
  • 2
    @djna, который шаблон разработчика для дополнительных параметров, где иначе необходимо было использовать конструкторов телескопа. Так его без проблем, если Вы пропускаете один метод. Обязательные параметрические усилители входят в конструктора разработчиков или как в параметрические усилители к методу сборки, таким образом, можно осуществить их. – atamanroman 03.08.2010, 12:05
  • 3
    Это могло бы быть синглом большая часть допустимой причины использовать разработчика, но на практике все делают это главным образом не поэтому, только из-за " immutability" упущение, что разработчик изменяем и для " readability" что-то очень субъективное, что один doesn' t выравнивают по ширине сложность. – danidacar 04.04.2014, 21:24
  • 4
    А-ч. Зависит, как Вы читаете вопрос: существует " the" ответьте туда, где этот Ruby смотрит, но он изменится при выполнении различного Ruby или на различной платформе. например: МРТ 1.8.7 и REE использовали бы различные пути или использование МРТ Darwin и Linux тонко различные пути. Я wasn' t уверенный, который, поэтому чувствовал себя более комфортно с этим ответом. – Daniel Pittman 05.05.2020, 16:24

Вы теряете несколько преимуществ шаблона строителя, как уже указывалось ( новый уродлив и труднее поддерживать и протекать детали по сравнению с чистым строителем).

Однако мне больше всего не хватает того, что шаблон компоновщика можно использовать для обеспечения того, что называется «плавными интерфейсами» .

Вместо этого:

ProductConfig config = new ProductConfig("Vodka");
config.alcohol = 0.38;
config.size = 0.7;
config.price = 17.99;
Product p = new Product(config);

Вы можете сделать:

ProductFactory.create()
    .drink("Vodka")
    .whereAlcohoolLevelIs(0.38)
    .inABottleSized(0.7)
    .pricedAt(17.99)
    .build();

Не всем нравятся беглые интерфейсы, но они определенно очень хорошо используют шаблон строителя (все бегло интерфейсы должны использовать шаблон компоновщика, но не все шаблоны компоновщика являются свободными интерфейсами).

В некоторых замечательных коллекциях Java, таких как коллекции Google, очень либерально и очень хорошо используются «плавные интерфейсы» . Я бы выбрал их в любой день по сравнению с вашим подходом «легче вводить / меньше символов» :)

6
ответ дан 14.10.2019, 11:59
  • 1
    Вы могли бы хорошо быть правы относительно этого. Это казалось более сложным в первый раз, когда я считал его.:) – Daniel Pittman 05.05.2020, 16:24

Главным недостатком является то, что этого нет в книге Джошуа, поэтому дроны не могут обернуть вокруг себя голову.

Вы используете простой объект-значение для хранения нескольких аргументов, в которых нуждается функция (/ method / constructor), в этом нет ничего плохого, это было сделано целую вечность. Пока у нас нет названных необязательных параметров, нам придется придумывать обходные пути, подобные этому, - это позор, а не какие-то чертовски блестящие изобретения от богов на Солнце.

Реальная разница в том, что вы выставляете поля напрямую. У Джошуа никогда не было бы открытого изменчивого поля - но он пишет API-интерфейсы, которые будут использоваться миллионами людей, большинство из которых - дебилы, и API-интерфейсы должны быть безопасными для развития в течение десятилетий, и они могут выделить много человеко-месяцев просто для разработки простого класса

Кто мы такие, чтобы подражать этому?

0
ответ дан 14.10.2019, 11:59
  • 1
    Его превосходное для представления полей в объектах значения. Если Вы читаете, что-то (эффективный Java, этот поток) тогда считало все это или не делает. Было сказано несколько раз, что значение возражает, поскольку параметрические усилители прекрасны иногда. Был сказан, почему фабрики и buiders выше в других случаях также. Этот объект конфигурации имеет совершенно другое приложение, чем шаблон разработчика. – atamanroman 04.08.2010, 09:35
  • 2
    Лучший ответ когда-либо, беспилотники Java:) – danidacar 04.04.2014, 21:19
  • 3
    смутно названный, действительно... – drew moore 20.03.2017, 19:32

Я лично чувствую, что шаблон построителя с первого взгляда предлагает вам более чистый код, в котором эти объекты фактически используются. С другой стороны, отсутствие получателей / установщиков не очень пригодится многим фреймворкам, которые ожидают получение / установщик верблюжьих падежей. Это серьезный недостаток, который я чувствую.

Что мне также нравится в методах получения / установки, так это то, что вы четко видите, что делаете: получаете или устанавливаете. Я чувствую, что со строителем я теряю немного интуитивной ясности здесь.

Я знаю, что многие люди читали определенную книгу, и теперь внезапно модель строителя наслаждалась ажиотажем, как будто это был новый iPhone. Тем не менее, я не ранний усыновитель. Я использую «новый способ» только тогда, когда он действительно экономит время на любой территории, будь то производительность, обслуживание, кодирование ...

Мой практический опыт заключается в том, что я лучше справляюсь с геттерами / сеттерами и конструкторами. Это позволяет мне повторно использовать эти POJO для любых целей.

Несмотря на то, что я вижу назначение вашего объекта конфигурации, я также думаю, что это даже больше, чем сборщик, и для чего? Что не так с сеттерами?

Может быть, нам нужно изобрести предложение WITH: пример, допустим, у вас есть

public Class FooBar() {
    private String foo;

    public void setFoo(String bar) { 
      this.foo = bar; 
    }

    public String getFoo() { 
        return this.foo; 
    }
}

public static void main(String []args) {

 FooBar fuBar = new FooBar();
 String myBar;

 with fuBar {
    setFoo("bar");
    myBar = getFoo(); 
 }
}

А, я не знаю ... Я думаю, что это может привести к ускорению Написание кода без всяких внутренних хлопот. Есть ли у кого-нибудь связь с Oracle Java-гуру?

Это выглядит не так чисто, как использование объекта со сборщиком, но вы экономите время конструктора. И вы все еще можете использовать этот класс как обычный pojo / bean, который можно использовать в фреймворках ...

Вам, ребята, действительно понравился этот пункт, или вы думаете, что он скорее отстой? Приветствия

1
ответ дан 14.10.2019, 11:59
  • 1
    Так как Вы спросили, я не думаю, что Ваше предложение модификации языка Java является хорошим. В то время как я понимаю, что это - установленная конструкция на других языках, таких как Visual Basic, я думаю с помощью быстрого интерфейса / метод, объединяющий предложения в цепочку больше гибкости, между тем не требующей никаких изменений в самом языке. – iX3 16.01.2014, 16:59
  • 2
    Моя ошибка. У меня было упорядочивание в родительском классе, но я переопределял атрибут Meta без правильно разделение на подклассы его, как описано в документах , и в дочернем class' Meta у меня не было упорядочивания, таким образом, значение от родителя было потеряно. – Ariel 14.03.2019, 16:56

Вы не должны использовать открытое поле, но защищенное или личное. Для доступа к ним вы должны использовать геттеры и сеттеры, чтобы сохранить инкапсуляцию.

-1
ответ дан 14.10.2019, 11:59
  • 1
    I' ve только использовал общедоступные поля для хранения моего примера коротким, но спасибо так или иначе. – deamon 03.08.2010, 11:42
  • 2
    на самом деле, не всегда. Если ' ProductConfig' не часть общедоступного API тогда, это может быть столь же просто как показанный. Даже J. Блоховский в Эффективном Java 2-й Выпуск говорит, что его нормальное для имения таких объектов значения без любой логики, в которой методы get/методы set только добавят некоторый шаблонный код нагрузки (Объект 14). – Roman 03.08.2010, 12:40
  • 3
    Это - чистый класс значения. Так как проверка происходит в конструкторе реального класса, и объект конфигурации никогда не должен совместно использоваться с другими потоками, это хорошо ищет меня. Конечно, Вы теряете способность представить дополнительную проверку позже. В дополнение к моему римлянину тезки: шаблон Разработчика является pg 11 в Эффективном Java SE (Объект 2). – atamanroman 03.08.2010, 12:45
  • 4
    К вашему сведению: инструменты Firebase позволяют разработчикам получать доступ ко всем событиям Google Cloud. " firebase-functions" SDK и CLI Firebase сотрудничают, чтобы позволить разработчикам справляться, ряд функций с простым развертывают команду - легкое начало работы, в то время как у Вас все еще есть полный доступ к Платформе Google Cloud при необходимости в нем. – Ultrasaurus 22.10.2017, 19:50

Теги

Похожие вопросы