- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
package org.trishinfotech.builder;
public class Car {
private String chassis;
private String body;
private String paint;
private String interior;
public Car() {
super();
}
public Car(String chassis, String body, String paint, String interior) {
this();
this.chassis = chassis;
this.body = body;
this.paint = paint;
this.interior = interior;
}
public String getChassis() {
return chassis;
}
public void setChassis(String chassis) {
this.chassis = chassis;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getPaint() {
return paint;
}
public void setPaint(String paint) {
this.paint = paint;
}
public String getInterior() {
return interior;
}
public void setInterior(String interior) {
this.interior = interior;
}
public boolean doQualityCheck() {
return (chassis != null && !chassis.trim().isEmpty()) && (body != null && !body.trim().isEmpty())
&& (paint != null && !paint.trim().isEmpty()) && (interior != null && !interior.trim().isEmpty());
}
@Override
public String toString() {
// StringBuilder class also uses Builder Design Pattern with implementation of java.lang.Appendable interface
StringBuilder builder = new StringBuilder();
builder.append("Car [chassis=").append(chassis).append(", body=").append(body).append(", paint=").append(paint)
return builder.toString();
}
}
PolinaAksenova 15.04.2021 06:32 # +2
JloJle4Ka 15.04.2021 07:10 # +1
j123123 15.04.2021 09:10 # +1
bormand 15.04.2021 10:03 # +2
Soul_re@ver 15.04.2021 14:44 # 0
JloJle4Ka 15.04.2021 07:09 # +1
Вот такой это builder.
Вообще, мне кажется, что как в некоторых числовых последовательностях закладывается избыточность для выявления очепяток, так и в йаже введён специфический избыточный синтаксис с гротескными и гипертрофированными паттернами, чтобы даже САМЫЙ тупой джавист мог писать код с минимальным количеством ошибок.
bormand 15.04.2021 10:03 # +3
CHayT 15.04.2021 10:40 # +3
Паттерн билдер вроде же должен иметь метод `build()', возвращающий инстанс другого класса.
bormand 15.04.2021 10:53 # +2
JloJle4Ka 15.04.2021 10:55 # +2
Вот твой билбер.
А класс выше – это так, бойлерплейт для этого билбера.
PolinaAksenova 15.04.2021 12:12 # +2
Весь простенький пример паттерня Строитель в той статье состоит из 283 строк. Ня влез ≡(▔﹏▔)≡.
JloJle4Ka 15.04.2021 12:18 # 0
bormand 15.04.2021 12:19 # +1
Никто не хочет приводить реальный пример системы, в которой применение паттерна помогло сделать код понятнее. Ссылку на какую-нибудь репу, где это реально юзается, к примеру.
JloJle4Ka 15.04.2021 12:22 # 0
Поправил. Потому что в вузе нам преподавали ТРИЗ, тот самый, в котором лучшая система та, которой нет. Именно поэтому я не пользуюсь паттернами, а просто дописываю питушню в funkcii.php и теку, значит паттерны не нужны!
bootcamp_dropout 15.04.2021 12:35 # +2
Пусть кинут ссылку на какую-нибудь нибудь реальную репу где баг воспроизводится
Soul_re@ver 15.04.2021 13:18 # +3
10% — Issue закрыт с причиной "хз, вроде всё нормально, баг где-то у вас" или "я ебал настраивать билд систему для вашего проекта и собирать его, чтобы проверить существование бага."
bootcamp_dropout 15.04.2021 13:42 # 0
Soul_re@ver 15.04.2021 12:38 # +2
Проблема в том, что код нужно комментировать, место в книге денег стоит, а кидать ссылку на репу — свинство по отношению к тем, кто решил почитать книгу, пересекая Тихий океан.
gologub 15.04.2021 13:52 # +1
но дело не в этом, если вербозность не влезает в книгу, то такая книга нахуй не нужна
всякие приложения к книге не должны становиться неотъемлемой частью
booratihno 15.04.2021 12:46 # +2
bormand 15.04.2021 12:52 # +1
Ок, принято. А как понять, когда я реально его должен юзать?
З.Ы. Я не утверждаю, что простые примеры надо выбросить. Я утверждаю, что надо дополнять их реальными примерами, где можно вникнуть в чужой код и увидеть паттерн на практике.
booratihno 15.04.2021 12:55 # +1
Нужно конечно и то, и то: и пример кода (который умещается на один экран) и реальный пример.
bormand 15.04.2021 12:58 # +1
Да не напишешь ты это словами... Так потом и рождаются джависты, которые срут паттернами и лепят из них архитектуру, не понимая зачем они это делают.
booratihno 15.04.2021 13:01 # +1
Например, разрабатывать большой проект, и в каждом паттерне писать сначала простой пример, а потом как он вписывается в проект.
Если я хочу быстро узнать патттерн, то мне нет смысла вникать в проект: я обычно уже и так понимаю зачем мне паттерн нужен. А если я изучаю его с ноля, то да, нужно показывать реальный пример.
bormand 15.04.2021 14:18 # 0
bormand 15.04.2021 12:59 # +1
Я ещё ни в одной статье не видела внятного ответа на вопрос "а нахуя?"
booratihno 15.04.2021 13:04 # +1
bormand 15.04.2021 13:17 # +1
guest6 15.04.2021 13:18 # +1
Desktop 15.04.2021 14:07 # 0
bormand 15.04.2021 14:09 # 0
Нинужный костыль для убогих оопшных язычков, которые умеют диспатчить только по первому аргументу.
DypHuu_niBEHb 15.04.2021 15:30 # 0
Хорошая альтернатива визитору это pattern matching с exhausted when + sealed classed в коко
PolinaAksenova 16.04.2021 12:04 # 0
bormand 16.04.2021 12:23 # 0
PolinaAksenova 16.04.2021 13:46 # 0
JloJle4Ka 15.04.2021 10:52 # 0
Давайте угадывать кто и как оскорбился на слово «Wheel».
bormand 15.04.2021 10:59 # +2
Soul_re@ver 15.04.2021 12:36 # +2
booratihno 15.04.2021 12:49 # +2
Напоминает дешевые SEO тексты:
"Как покрасить стену?
Безусловно, каждому из нас рано или поздно приходится сталкиваться с вопросом: как покрасить стену?
Чтобы ответит на такой важный вопрос, как покрасить стену, предлагается прочитать вот эту статью, которая кстати так и накзывается: как покрасить стену"
booratihno 15.04.2021 12:57 # +1
petuh.setIq(-1).setName("dzhavist")
bormand 15.04.2021 13:03 # +1
booratihno 15.04.2021 13:05 # +1
guest6 15.04.2021 13:31 # +1
bormand 15.04.2021 13:35 # 0
JloJle4Ka 15.04.2021 13:35 # 0
booratihno 15.04.2021 13:36 # +1
между строками
employee->age = 99;
и
employee->salary = 100;
может быть куча кода!
JloJle4Ka 15.04.2021 13:38 # 0
Типа
employee->salary = 25;
return;
?
guest6 15.04.2021 13:40 # +1
любая логика
bormand 15.04.2021 13:59 # 0
JloJle4Ka 15.04.2021 14:00 # 0
bormand 15.04.2021 14:01 # +1
JloJle4Ka 15.04.2021 14:09 # +1
Например:
r = request.addDetail("koko")
if (len == 1):
. . . . r.addDetail("ololo").fire()
else:
. . . . r.removeDetail("defolt").addCode(200).fi re()
bormand 15.04.2021 14:13 # +1
JloJle4Ka 15.04.2021 14:15 # +1
bormand 15.04.2021 14:26 # +1
Да не, вот например какой-нибудь построитель запросов -- хороший, годный пример билдера.
Я пишу что-то в духе query.where(employee.name, "bormand").all() и мне пофиг, как билдер это будет переводить на конкретный диалект "SQL" (или даже "NoSQL").
Вот оно, то самое разделение между "что построить" и "как построить".
Soul_re@ver 15.04.2021 14:54 # +3
JloJle4Ka 15.04.2021 16:34 # 0
DypHuu_niBEHb 15.04.2021 16:36 # 0
JloJle4Ka 15.04.2021 16:38 # 0
bormand 15.04.2021 16:38 # +1
На собеседованиях уже никто не спрашивает?
DypHuu_niBEHb 15.04.2021 16:43 # +1
Но перед собеседами я обычно тренировал алгоритмы, их сложнее вспомнить, чем паттрены. Правда все равно ничего слоднее qsort и binary search на обычных работах не спрашивают
JloJle4Ka 15.04.2021 16:44 # 0
DypHuu_niBEHb 15.04.2021 16:53 # 0
Мое представление о дизайне примерно на уровне вот
gologub 15.04.2021 17:10 # 0
gologub 15.04.2021 20:18 # 0
bormand 15.04.2021 16:47 # +1
Напишешь с первого раза, нигде не залетев на единичку и не соснув UB'ца?
DypHuu_niBEHb 15.04.2021 16:51 # +1
Но не всегда просят писать: иногда просто нужно рассказать какие есть виды поиска, какие у них требования к данным, и какие большие О
JloJle4Ka 15.04.2021 17:26 # 0
DypHuu_niBEHb 15.04.2021 17:28 # 0
оно, кстати, зависит от сортированности говна изначально
JloJle4Ka 15.04.2021 17:31 # 0
DypHuu_niBEHb 15.04.2021 17:35 # +1
это худшее же. Его можно шафлнуть, чтобы такого говна не получить вроде (если не путаю)
JloJle4Ka 15.04.2021 17:36 # 0
DypHuu_niBEHb 15.04.2021 17:38 # 0
А про сортировку слиянием помнишь?
JloJle4Ka 15.04.2021 17:41 # 0
DypHuu_niBEHb 15.04.2021 17:49 # +1
В частности в джаве для примитивов ку, а для объектов был merge, но теперь там есть еще TimSort.
JloJle4Ka 15.04.2021 19:14 # 0
Fike 15.04.2021 23:37 # +4
Soul_re@ver 15.04.2021 16:38 # 0
JloJle4Ka 15.04.2021 16:42 # 0
PolinaAksenova 15.04.2021 20:14 # 0
DypHuu_niBEHb 15.04.2021 20:32 # 0
как эта хрень работает?
там как-то оператор == перегружен и чото такое возвращает?
PolinaAksenova 15.04.2021 20:36 # 0
Да.
DypHuu_niBEHb 15.04.2021 20:38 # 0
В джанге это более попидарски, типа
PolinaAksenova 15.04.2021 20:42 # 0
DypHuu_niBEHb 15.04.2021 20:44 # 0
Кстати, ты умеешь пользоваться гибридными атрибутами в SQLAlchemy?
Это, имхо, самая киллер фича по сравнению с джангой
PolinaAksenova 15.04.2021 20:45 # 0
DypHuu_niBEHb 15.04.2021 15:03 # 0
если у тебя таких полей 22, то ты будешь 22 поля копипастить?
bormand 15.04.2021 15:24 # +1
DypHuu_niBEHb 15.04.2021 15:28 # +1
В примере с джавой -- паста. Правда это паста в ОДНОМ месте, а не во всех местах использования.
Алсо, см пример емейлпротектда с передачей билдера
bormand 15.04.2021 16:04 # 0
DypHuu_niBEHb 15.04.2021 16:31 # 0
Вот если бы там в структуре были какие-то методы, то да: без отдельного билдера бы не получилось, пушо пока билд не закончен объект не консистентен, и методы вызвать нельзя
DypHuu_niBEHb 15.04.2021 21:04 # 0
https://twitter.com/Jetskigrizzly/status/1382712270677942276
bootcamp_dropout 15.04.2021 23:26 # 0
guest6 15.04.2021 23:33 # 0
bootcamp_dropout 15.04.2021 23:39 # 0
guest6 16.04.2021 00:59 # 0
bootcamp_dropout 16.04.2021 01:41 # 0
на практике получение произвольного кол-ва данных из прошлого обсера звучит сомнительно
MAKAKA 16.04.2021 01:59 # 0
Правда конечно нужно гарантировать, что он подключится, иначе там буфер раздуется
Хотя.. он же навсегда закеширует ВСЕ данные?
bootcamp_dropout 16.04.2021 02:26 # 0
Но чтобы нужно было хранить стейт обсервера между подключениями не припомню, разве что для расширения хрома где хуй знает когда что на страницу подгрузится
DypHuu_niBEHb 15.04.2021 22:30 # 0
Steve_Brown 16.04.2021 14:45 # +3
guest6 16.04.2021 03:23 # 0
https://caizcoin.com/
JloJle4Ka 16.04.2021 03:53 # 0
CkpunmoBbIu_nemyx 16.04.2021 14:04 # 0
PolinaAksenova 17.04.2021 20:50 # +2
Можня было ня писать лишний конструктор, а проставить default-аргументы (Котлин бы сам сгенерировал отдельный Car(), кстати), но оригинал ня мог принимать ня все параметры, так что и мы ня будем.
В оригиняле, кстати, автор так вдохновился крутым "Builder Design Pattern" в toString(), что забыл поставить закрывающую квадратную скобку: видимо, от количества бойлерплейта, которого ему пришлось написать, мозг нямножко разжижился.
MAKAKA 17.04.2021 22:33 # 0
Не хотел бы иметь возможность вызывать его методы
PolinaAksenova 17.04.2021 22:34 # +1
Но да, без nullable этот класс в Котлине будет ещё няшнее.
MAKAKA 17.04.2021 22:46 # 0
А на TS сделать (как и на крестах)
JloJle4Ka 18.04.2021 04:49 # 0