|
Банда четырёх и прочие боги "настоящего программирования" | ☑ | ||
---|---|---|---|---|
0
Mort
01.03.17
✎
03:35
|
У нас один бог (ну или два), а там целая кодла. И среди них есть некие кто называются "банда четырех". Если ты не знаешь кто это такие, можешь на собеседование на кресты не соваться.
В ходе изучения C# в рамках использования в Unity плотно пообщался с гуру использования C++ в QT. На каждый вопрос - используй тот или иной паттерн, особо часто описанный в книге вышеупомянутых четырёх. Ну и пресловутый MVC, конечно. После поверхностного изучения и применения на практике тех же "синглтонов" и "наблюдателей", как у тупого 1сника возникло смутное ощущение, что паттерны проектирования это просто средство в плохо проектированной среде не потерять концы. Может это конечно и обусловлено тем, что сложность всей программы в отличие от 1с взлетает шопц с каждой строчкой, но привкус ненатуральности остается. Вы как считаете? |
|||
55
Живой Ископаемый
01.03.17
✎
10:11
|
MVC в 1С используется. Практически в каждой форме объекта.
Наблюдатель - аналогично, либо в Подписках на события(на уровне платформы), либо через Обработчик ожидания для формы (есть во многих последних типовых). |
|||
56
Лефмихалыч
01.03.17
✎
10:16
|
(54) но это не применение шаблонов. Говорить, что это есть применение шаблонов, это все равно, что говорить, что шаблоны проектирования применяет пользователь, который тыкает кнопку, по которой вызывается цикл "для каждого". Это ж ересь.
Тем более, что наличие поведения у объекта не говорит о том, что при его разработке были применены шаблоны - может автор изобрел велосипед сам, ни чего не зная про шаблоны проектирования. |
|||
57
kyvv
01.03.17
✎
10:25
|
(56) Автор может "изобретать" велосипед, на шаблон это не влияет, шаблоны описаны до него. А вот сам велосипед может следовать неким шаблонам или нет. Если нет, то тогда можно говорить об изобретении.
|
|||
58
Живой Ископаемый
01.03.17
✎
10:28
|
А, делегирование в 1С постоянно используется. Во внешних печатных формах, в формах подбора.
|
|||
59
kyvv
01.03.17
✎
10:29
|
(57)+ Тыканье в кнопку - тоже шаблон, но к паттернам банды не имеющий никакого отношения.(ИМХО)
|
|||
60
kyvv
01.03.17
✎
10:38
|
Кстати, среди авторов упоминавшегося выше двухтомника нет ни одного профессионального программиста. Подход 1С в обучении хорош для гуманитариев, для технарей можно было бы поглубже копнуть. Профессиональные программисты могут, конечно, и сами разобраться, но их среди одинесников не так уж и много.
|
|||
61
Лефмихалыч
01.03.17
✎
10:49
|
а здесь, я вижу, много кто не понимает разницу меду
[применять шаблоны проектирования при разработке программ] и [использовать код, при разработке которого применялись шаблоны проектирования] |
|||
62
Naf2017
01.03.17
✎
10:50
|
(54) кстати об итераторе:
"Особенностью полноценно реализованного итератора является то, что код, использующий итератор, может ничего не знать о типе итерируемого агрегата." в 1С это не совсем так с выборками, сравним: //итерируем по таблице значений // или табличной части // или массиву структур //нам все равно Для каждого Стр из Нечто Цикл А = Стр.Чтото; КонецЦикла; //какой-то другой интерфейс итератора выборок //но почему? Пока Выборка.Следующий() Цикл А = Выборка.Количество(); //что? итератор обладает интерфейсом коллекции? |
|||
63
Mort
01.03.17
✎
11:02
|
Кстати в БСП используется, например, "наблюдатель". Подсистемы "сами" подписываются на события, которые происходят при старте системы.
|
|||
64
Жан Пердежон
01.03.17
✎
11:03
|
(62) потому что это фрагмент ADO переведенный на русский.
|
|||
65
Лефмихалыч
01.03.17
✎
11:05
|
(63) 1С - предметно-ориентированная платформа разработки. Большинство шаблонов проектирования, о которых речь в топике, для нее не имеют смысла, т.к. у них уровень абстракции существенно ниже, чем у платформы. Но у нее есть свои. Ни кто просто не дал себе труда их систематизировать.
|
|||
66
Mort
01.03.17
✎
11:17
|
(65) Языки низкого уровня это такие языки, где нужно уделять много внимания вещам, никак не связанным с программами на этом языке. (не помню кто сказал) вот я и думаю шо все эти шаблоны как подпорки на более высокий уровень.
(54) По поводу итераторов, недавеча ознакомился с адской конструкцией C# "iEnumerator - yield". Может для гуру всяких замыканий и т.д. выглядело просто, но для 1сника было сначала сложно въехать, таки с разрывами шоблонов. А потом уже привычно стало. Советую кто не в курсе для разминки мозга изучить. |
|||
67
Вафель
01.03.17
✎
11:19
|
(66) на js тоже есть
|
|||
68
Это_mike
01.03.17
✎
11:23
|
(66) "с разрывами паттернов"? :-)
|
|||
69
Живой Ископаемый
01.03.17
✎
11:48
|
iyeld это типа async/await?
или росто async? реализуется в 1С через запуск на сервере фонового задания и ожидания его завершения через обработчик ожидания. В рамках одного клиента вроде бы не реализовать никак (разве что запускать паралельно другой клиент) |
|||
70
Вафель
01.03.17
✎
11:49
|
yield - это выход из процедуры, а птом продолжение с того же места откуда выщел. например с середины цикла
|
|||
71
Живой Ископаемый
01.03.17
✎
11:52
|
аа..
|
|||
72
Господин ПЖ
01.03.17
✎
11:53
|
(0) хавно все это...
пусть софт покажут реальный где есть что-то за пределами синглетона и фабрики надутие щек |
|||
73
Живой Ископаемый
01.03.17
✎
11:54
|
2(70) но ведь это кал коней! Этож очень фигово читается и поддерживается... Как-то человечней нельзя разве реализовать?
|
|||
74
Вафель
01.03.17
✎
11:55
|
(73) наоборот.
Например у тебя есть цикл обхода перестановок. Попробуй-ка с срередины в него зайди |
|||
75
Garykom
гуру
01.03.17
✎
11:55
|
yield - это бесполезная хре которая ничего кроме немного уменьшения текста кода не делает полезного.
Можно прекрасно обходится или объединив цикл по итератору с его вычислением внутри или передавая-возвращая нужные параметры для продолжения вычисления "следующего значения" |
|||
76
Вафель
01.03.17
✎
11:56
|
читабельность кода повышается многократно. нет этих лишних вычислений по ноужным параметрам чтобы попасть в нужную точку входа
|
|||
77
Garykom
гуру
01.03.17
✎
11:56
|
(75)+ ибо какая разница передавать туда-сюда параметры или неявно сохранять их где то для продолжения цикла/процедуры
|
|||
78
Garykom
гуру
01.03.17
✎
11:57
|
(76) дада, ну давай покажи класс с 2-3 "елдами"
|
|||
79
Вафель
01.03.17
✎
11:57
|
(77)ты и замыкания считаешь бесполезной хренью?
|
|||
80
Mort
01.03.17
✎
11:59
|
yield очень распростанён в геймдеве, где нужно какой-нибудь длительный процесс (например, подгрузка объектов сцены) распределить по кадрам так шоб незаметно было и без присяда до 0.1 fps.
|
|||
81
Garykom
гуру
01.03.17
✎
12:00
|
(79) Замыкания как и делегаты это немного из другой оперы, на js все функции замыкания и это прикольно ))
|
|||
82
Garykom
гуру
01.03.17
✎
12:01
|
(80) Эээ а разве для этого не используют классику с несколькими потоками и семафорами?
Или это для тех кто многопоточное программирование не освоил да? |
|||
83
Живой Ископаемый
01.03.17
✎
12:05
|
2(82) Ну вот мне тоже кажется что просто асинхронного выполнения кода должно хватить. Но наверное есть какие-то задачи, где и такая штука тоже удобная. Но я манал ее в 1С использовать.
Тем более что многопоточность. Ну вот как ее реализовать в рамках одного сеанса на 1С? В мобильном приложении можно? |
|||
84
Лефмихалыч
01.03.17
✎
12:06
|
(70) это просто очень дорогой и сложный способ реализации goto
|
|||
85
Вафель
01.03.17
✎
12:07
|
(84) как оно внутри работает не важно
|
|||
86
Господин ПЖ
01.03.17
✎
12:07
|
>Тем более что многопоточность. Ну вот как ее реализовать в рамках одного сеанса на 1С?
фоновыми задачами |
|||
87
kyvv
01.03.17
✎
12:08
|
Как работает yield от программистов https://habrahabr.ru/post/132554/
|
|||
88
Живой Ископаемый
01.03.17
✎
12:08
|
2(86) фоновая задача она ж в рамках другого сеанса выполняется, на сервере. Или нет?
|
|||
89
Naf2017
01.03.17
✎
12:11
|
yield вообще-то для ленивого возврата коллекций
|
|||
90
Вафель
01.03.17
✎
12:15
|
(89) можешь пример написать?
|
|||
91
Naf2017
01.03.17
✎
12:21
|
(90)
using System; using System.Collections.Generic; public class Test { public static void Main() { foreach (var x in Range(5,10)) { Console.WriteLine(x); } } public static IEnumerable<int> Range(int a, int b) { for(int i=a; i<=b; ++i) { yield return i; } } } |
|||
92
Вафель
01.03.17
✎
12:22
|
(91) а где тут возврат коллекции?
|
|||
93
Вафель
01.03.17
✎
12:23
|
аа, range же это коллекция
|
|||
94
Garykom
гуру
01.03.17
✎
12:35
|
(93) генератор а не коллекция как бы
|
|||
95
Вафель
01.03.17
✎
12:38
|
(94) IEnumerable is the base interface for all non-generic collections
(c) MSDN |
|||
96
Garykom
гуру
01.03.17
✎
12:41
|
||||
97
Garykom
гуру
01.03.17
✎
12:42
|
"виртуальная коллекция" = генератор
|
|||
98
Вафель
01.03.17
✎
12:43
|
(97) Это и есть ленивый возврат коллекции
|
|||
99
Garykom
гуру
01.03.17
✎
12:46
|
(98) Да млин, никакая "коллекция" никуда не возвращается!
Фактически запомнили в памяти состояние стека выполнения процедуры и вернули промежуточное значение из генератора. Затем при следующем вызове (попытке прочитать следующее значение из "виртуальной коллекции" по итератору) вычисляется (по запомненному состоянию процедуры) еще одно значение и снова возвращается и т.д. |
|||
100
Garykom
гуру
01.03.17
✎
12:47
|
100
|
|||
101
Вафель
01.03.17
✎
12:47
|
(99) слово "ленивый" тебе ни о чем не говорит?
|
|||
102
Вафель
01.03.17
✎
12:47
|
те каждый элемент коллекции появляется тоько тогда когда потребуется
|
|||
103
Garykom
гуру
01.03.17
✎
12:51
|
(102) Термин "ленивый" обычно относится к загрузке данных а не к вычислению.
Но да может и так, но тут имхо не ленивое а кормление завтраками, когда: - у тя уже готово? - да доделываю уже! (на самом деле даже не начинал) |
|||
104
Вафель
01.03.17
✎
12:54
|
(103) чем чтение кардинально отличается от вычисления?
|
|||
105
Волшебник
модератор
01.03.17
✎
12:56
|
Что вы тут курите? Отсыпьте
|
|||
106
Провинциальный 1сник
01.03.17
✎
13:01
|
(62) Используй вместо выборки выгрузку - и паттерн не сломается
|
|||
107
Naf2017
01.03.17
✎
13:01
|
(103) "ленивое" это когда данные получают/создают не изначально готовыми, а по мере необходимости использования
IEnumerable<int> range1 = Range(5,10); //никакой коллекции никто и не думал создавать IEnumerable<int> range2 = range1.Where(s=>a%2==0); //и снова нет коллекции Array c = range2.ToArray(); //вот теперь есть! |
|||
108
Garykom
гуру
01.03.17
✎
13:01
|
(104) При "ленивом чтении" коллекция уже есть тока в другом месте, при "ленивом вычислении" где коллекция?
|
|||
109
Naf2017
01.03.17
✎
13:02
|
(106) выгрузка не "ленива" и жрет память
|
|||
110
organizm
01.03.17
✎
13:38
|
(105) не мешай мальчик
|
|||
111
Mort
01.03.17
✎
13:46
|
(103) Как раз в этом и прикол, что можно не возвращать всю коллекцию а только следующий элемент. Т.е. например, можно реализовать бесконечную выборку чисел фибоначчи, а когда остановиться клиент решает.
|
|||
112
Живой Ископаемый
01.03.17
✎
13:58
|
2(111) ok, а теперь давайте подумаем. Имея какое либо число фибоначчи, мы сможем получить следующее?
Если да, то зачем обязательно делать именно так? У нас есть функция, которая получает следующее число, относительно текущего. у нас есть коллекция, которая наполнена всеми числами до текущего. Мы инициируем получение следующего, добавляем в коллекцию, опрашиваем пользователя на предмет останова. Если не получаем сигнала, получаем следующее и т.п. Почему обязательно йилды? В чем абстракци, переиспользование или другие выгоды? |
|||
113
orefkov
01.03.17
✎
14:13
|
"Если б Остап узнал, что он играет такие мудреные партии и сталкивается с такой испытанной защитой, он крайне бы удивился. Дело в том, что великий комбинатор играл в шахматы второй раз в жизни." (с) 12 Стульев
На самом деле одинэсники вовсю используют самые лучшие паттерны, тщательно отобранные заботливыми методистами и разработчиками платформы 1С. Когда ты пишешь свой тупой код для простенькой управляемой формы, на самом деле ты юзаешь model-view-controller с double-way data binding в three-layered-data-app-engine, сдобренный high level object-relation-mapping на базе declarative metadata description, имеющей свой platform-independed query language, c declarative data-driven user interface, complete transparent serialization и domain-oriented programm language. В чём разработчики 1С отличаются от западных коллег, так это в пиаре. Те любят любой фигне дать громкое имя и носится с ней, как с писаной торбой. |
|||
114
Живой Ископаемый
01.03.17
✎
14:19
|
ну незападные тоже уже любят. Пример - Котлин и VIPER.
1С почему-то не любят, да... |
|||
115
Naf2017
01.03.17
✎
14:19
|
(112) вы коллекцию храните, а это затратно
к тому же при ленивом вычислении условия могут измениться и вы получите другую коллекцию |
|||
116
Asmody
01.03.17
✎
14:21
|
(113) Будьте добры, помедленнее, я записыуаю!
|
|||
117
Fish
01.03.17
✎
14:23
|
(113) Хорошо сказал. :))
|
|||
118
Живой Ископаемый
01.03.17
✎
14:23
|
2(115) Ладно, буй с ним, я пока все равно не постигаю зачем нужно уметь получать эффемрную коллекцию, которая как бы и не коллекция.
Динамический список, кстати - не такая коллекция? |
|||
119
Asmody
01.03.17
✎
14:24
|
сука, (113) в твит не влазит!
|
|||
120
Это_mike
01.03.17
✎
14:26
|
(113) !!!!!!
|
|||
121
mrDru
01.03.17
✎
14:39
|
(113) примерно так же думал, когда на Java слез. Там, на самом деле, под капотом до задницы всего понареализовано: i18n, ORM, cross-compiling, event bus, jobs (+cron) и тд и тп.
Прикол в том, что в любом достаточно крупном проекте (привет SAP) те же грабли - свой DSL и сотни слоев абстракций. Даже прикол такой есть: "когда у нас закончились названия для новых слоев абстракций, мы начали называть их по именам архитекторов". Имхо с GOF нарочно знакомиться не надо, иначе руки так и тянутся "натянуть сову на глобус" и будешь потом клепать "фабрики синглтонов". Паттерны при трудоустройстве спрашивают только те, у кого ума на большее не хватает, а туда идти и не надо. |
|||
122
mrDru
01.03.17
✎
14:41
|
+ (121) :
Там, на самом деле, под капотом ... - читай "Там (в 1С)..." |
|||
123
Лефмихалыч
01.03.17
✎
14:44
|
(119) скриншот сделай
|
|||
124
Naf2017
01.03.17
✎
14:50
|
(118) смотря что под коллекцией понимать
здесь мы вовсю говорили про IEnumerable и паттерн итератор, а в динамическом списке никаких итераторов нет ))) |
|||
125
jsmith82
01.03.17
✎
15:03
|
Живые примеры для предметного обсуждения были?
|
|||
126
Господин ПЖ
01.03.17
✎
15:09
|
(119) внесите в цитаты мисты
|
|||
127
Лефмихалыч
01.03.17
✎
15:29
|
(126) готово
|
|||
128
uno-group
01.03.17
✎
15:36
|
ХВАТИТ. А то будет как с сороконожкой.
Это все для менеджеров в программирование. Когда из чела далекого от программирования делают программиста. Остальные научатся плавать сами и им не надо спасательные круги чтобы не утонуть. |
|||
129
Garykom
гуру
01.03.17
✎
16:15
|
Короче типовые шаблоны/паттерны это для тех, кто не умеет применять алгоритмы и придумывать/изобретать собственные решения.
Разделение идет еще в школе, когда одним скучно решать задачки а другие вызубрили как решать подобную задачу и все. |
|||
130
lock19
01.03.17
✎
16:40
|
(75) Представь несколько yield во вложенных циклах/условиях. Там нехилый конечный автомат рисовать придётся.
(94) А от генератора до корутины - рукой подать. |
|||
131
Вафель
01.03.17
✎
16:49
|
(129) Ты себя конечно к умным относишь?
|
|||
132
Asmody
01.03.17
✎
17:08
|
(126) аж 2 раза!
|
|||
133
Garykom
гуру
01.03.17
✎
17:11
|
(131) К быстрообучаемым, ум это немного другое, у меня просто высокая скорость освоения новой информации, как и забывания ненужной.
|
|||
134
Вафель
01.03.17
✎
17:23
|
(133) я печатаю со скоростью 600 знаков в минуту. правда ерунда такая получается (с) анекдот
|
|||
135
Torquader
02.03.17
✎
02:09
|
Чем вам yeild не сдался ?
Просто, если подходить к вопросу - есть некоторые данные Data и есть функция, которая выбирает следующий блок этих данных: GetNext(Data,PrevValue) и всё. Просто, некоторые программисты сразу не могут понять как это реализовать - вот им и придумали всякие упрощения. |
|||
136
lock19
02.03.17
✎
06:56
|
а
value = yield foo() куда? |
|||
137
Naf2017
02.03.17
✎
08:52
|
(135) понятно, что и ООП реализуемо через процедурный стиль, но удобно же
(136)это что за набор букв? |
|||
138
lock19
02.03.17
✎
09:04
|
(137) Вполне себе валидный набор букв, если обсуждение не ограничивать ущербностями C#.
|
|||
139
Лефмихалыч
02.03.17
✎
09:36
|
(132) ну, цитата атомная, она того стоит.
|
|||
141
oleg_km
02.03.17
✎
09:47
|
(113) Только местами недоделанная. Например на форме обработчики изменения элемента срабатывают только если сделаны интерактивно, а если я поменял в коде, то сам должен их дернуть. тогда как например в фокспре when и valid дергались независимо каким способом изменяется элемент. И так во многих местах у 1С как-то недоделано. Зато географические схемы, встроенные скипе. А элементарно сделать захват объектов конкретной подсистемы - это не барское дело.
|
|||
142
spock
02.03.17
✎
09:50
|
(136) Мы не поняли этого лаконичного примера. Можно раскрыть мысль что-куда?
|
|||
143
Oftan_Idy
02.03.17
✎
09:55
|
(0) Пиши код, блеять!
|
|||
144
lock19
02.03.17
✎
09:58
|
(142) Я же у вас не спрашиваю о тонкостях работы с async/await в C#? Когда состоялся сходняк банды ни диезов ни питонов в проекте не было.
|
|||
145
spock
02.03.17
✎
10:05
|
(144) Нет, не спрашиваешь. Я и не собирался выступать наставником.
В (142) спрашивал я. |
|||
146
lock19
02.03.17
✎
10:12
|
||||
147
spock
02.03.17
✎
10:15
|
(146) Ага-ага, спрошу еще раз.
В (136) приведен код с вопросом "куда?". К чему этот код был приведен и что подразумевалось под "куда?"? |
|||
148
lock19
02.03.17
✎
10:20
|
(147) Генератор, который получает, а не только отдаёт, наверное больше чем просто генератор. То есть "куда/к чему отнести подобную конструкцию".
|
|||
149
spock
02.03.17
✎
10:25
|
(148) Понятно. Тонкий намек на корутины?
Но этот код не тянет на полноценный намёк - нет декларации foo() и соответствующего декоратора. |
|||
150
lock19
02.03.17
✎
10:33
|
(149) Для выраженной мысли достаточно примера с yield в rvalue.
|
|||
151
omgwtf
02.03.17
✎
10:36
|
подскажите нюфагу, где прочитать "цитаты мисты"? Очень уж (113) понравилось, вдруг так много интересного еще есть
|
|||
152
Вафель
02.03.17
✎
10:37
|
(151) https://yandex.ru/search/?text=цитаты cite%3Amista.ru
|
|||
153
Asmody
02.03.17
✎
10:45
|
||||
154
lock19
02.03.17
✎
12:16
|
(149) http://pastebin.com/HKfXerYb - Тут тебе декораторов хватает?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |