Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Подарки от программис'тов

6208  1 2 3 4 5 6 7 8 9 10 все
AlexNek патриот22.03.22 22:57
AlexNek
22.03.22 22:57 

Многие спрашивают, а что нужно знать для программирования? И отвечают: язык программирования / алгоритмы. Но оказывается этого очень мало.

Поэтому давайте собирать примеры что может вытворить самый обычный программист.


#1 
AlexNek патриот22.03.22 22:58
AlexNek
NEW 22.03.22 22:58 
в ответ AlexNek 22.03.22 22:57, Последний раз изменено 30.03.22 19:57 (AlexNek)
AlexNek патриот22.03.22 23:02
AlexNek
NEW 22.03.22 23:02 
в ответ AlexNek 22.03.22 22:57

Ну вроде-бы хорошо иметь на сайте только картинки в формате png, могут думать некоторые.

И грузят 600Кб картинку на главную страницу сайта, при том что аналогичная картинка jpg размером меньше 100 кб.

Причем картинку стыбрили с платного сайта, один фиг для разработки.

#3 
AlexNek патриот22.03.22 23:07
AlexNek
NEW 22.03.22 23:07 
в ответ AlexNek 22.03.22 22:57

Поручили челу заняться управлением пользователей. Отлично, нашли опес-соурсе проект, его докер контейнер, загрузили, настроили, работает.

Месяц, работает/два, проблем нет - маладец. Есть только небольшой ньюанс - база располагается в памяти контейнера, не на диске. Но об этом никто не знает до тех пор пока не потребовалось перегрузить сервер. смущ

#4 
Murr патриот22.03.22 23:44
Murr
NEW 22.03.22 23:44 
в ответ AlexNek 22.03.22 23:02

аналогичная картинка jpg

-----

А причем тут программист?

#5 
Murr патриот22.03.22 23:45
Murr
NEW 22.03.22 23:45 
в ответ AlexNek 22.03.22 23:07

пока не потребовалось перегрузить

------

И опять таки -причем тут программист?

#6 
alex445 коренной житель23.03.22 05:04
NEW 23.03.22 05:04 
в ответ Murr 22.03.22 23:45
И опять таки -причем тут программист?

Притом, что все хотят человеков-оркестров, а платить в лучшем случае за одну должность. А ФААНГов с должностями "я отвечаю только за левый верхний пиксель этой кнопки - за остальное отвечают другие" на всех не напасёшься.

#7 
alex445 коренной житель23.03.22 05:09
NEW 23.03.22 05:09 
в ответ AlexNek 22.03.22 22:57, Последний раз изменено 23.03.22 05:09 (alex445)

AlexNek, в чём проблема, не понимаю? Вы хотите, чтобы всё было изначально хорошо спланировано, сделано и работало как часы? Вас же уволят сразу после того, как это произойдёт. Если это не ваш личный проект или вы не владелец бизнеса, то делать всё идеально - себе дороже. Пока есть проблемные проекты и баги, которые нужно править - вы при работе. А то некоторым надоедает "дураков обучать", и лишь заработанные семь знаков только и помогают пока держаться без работы. А работу без дураков годами найти не могут. А её и нет.

#8 
alex445 коренной житель23.03.22 05:12
NEW 23.03.22 05:12 
в ответ AlexNek 22.03.22 23:07

Поручили челу заняться управлением пользователей. Отлично, нашли опес-соурсе проект, его докер контейнер, загрузили, настроили, работает.

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

А вот я не знаю, что такое докер, и не умею этим пользоваться. У меня бы такой ошибки в принципе не возникло. Незнание - сила. ))


А вы этого чела поди, когда принимали, спрашивали, знает ли он докер. - Конечно знаю. - Вы приняты.


PS. И чё с пользователями? Всех удалили?

#9 
Срыв покровов патриот23.03.22 06:41
NEW 23.03.22 06:41 
в ответ alex445 23.03.22 05:04
Притом, что все хотят человеков-оркестров, а платить в лучшем случае за одну должность.

это отмазка

Прибавь мне 50% к зарплате и я буду писать тот же код. Вероятность багов не уменьшится.

#10 
alex445 коренной житель23.03.22 08:32
NEW 23.03.22 08:32 
в ответ Срыв покровов 23.03.22 06:41

А если отбавить? А если просто не повышать?

#11 
uscheswoi_82 старожил23.03.22 08:49
uscheswoi_82
NEW 23.03.22 08:49 
в ответ AlexNek 22.03.22 23:02

Сейчас пошла мода на WebP см. https://ru.wikipedia.org/wiki/WebP, покуда многие браузеры (в том числе и Microsoft Edge) на движке WebKit. Я тоже jpeg/png картинки в WebP конвертирую, они весят меньше чем jpeg и png.

кто как обзывается, тот так сам называется... маску ношу чтобы не заразить антиваксеров... Дневник тяжелобольного инвалида
#12 
uscheswoi_82 старожил23.03.22 09:10
uscheswoi_82
NEW 23.03.22 09:10 
в ответ Срыв покровов 23.03.22 06:41
Прибавь мне 50% к зарплате и я буду писать тот же код. Вероятность багов не уменьшится.

Надо сразу в коде ставить кучу проверок и везде где можно try catch блоки. Имхо это ещё зависит от языка программирования, допустим если программировать на Ada или Pascal там строгая типизация, меньше ошибок в коде, допустим в Ada если создать новый тип на базе готового (допустим Integer), и присвоить (скопировать) значения базового типа, то произойдёт ошибка во время компиляции. А в JavaScript, PHP, Python абсолютно всё равно какой тип данных, там и может произойти ошибка, а в Си и Си++ можно в свою или чужую память залесть и подпортить. Допустим:

A это тип Integer
B это тип A
A = 5
B = A - тут произойдёт ошибка, т.к. переменная B это не Integer, а новый тип A.

кто как обзывается, тот так сам называется... маску ношу чтобы не заразить антиваксеров... Дневник тяжелобольного инвалида
#13 
alex445 коренной житель23.03.22 09:16
NEW 23.03.22 09:16 
в ответ uscheswoi_82 23.03.22 08:49
According to Google's measurements in November 2011, a conversion from PNG to WebP resulted in a 45% reduction in file size when starting with PNGs found on the web, and a 28% reduction compared to PNGs that are recompressed with pngcrush and PNGOUT.

Фигня какая-то. Сравнили с png, а надо было с jpeg. png плохо сжимает полноцветные картинки - он для малоцветных предназначаен, без градиентных переходов. Обычный jpeg сожмёт обычную фотку на порядок лучше, чем png. Если у них лишь 45% получилось, то он хуже jpeg.


И вообще, когда речь идёт лишь о 45%, то особой разницы нет. Главное, что либы джаваскриптовые по полмегебайта это ок, или первая загрузка сайта со всем этим джаваскриптовым дерьмом в несколько мегабайт - тоже ок. А картинки по 50-200 кБ - нет.


Ещё помню критику дотнета примерно в 2010 - он же целых 200 МБ весит! Мы не можем столько один раз загрузить (это когда фильмы по нескольку ГБ качались как нефиг делать). Им дали клиенсткий профиль на 50 МБ - тоже много! А вот на каждый запрос по нескольку МБ из разжиревших сайтов "на современных технологиях" выкачивать - это норм. Похоже на плачь и жалобы Джобса о флеше - какую только фигню не начнёшь нести и раскручивать в инете, чтобы от конкурентов избавиться.

#14 
alex445 коренной житель23.03.22 09:21
NEW 23.03.22 09:21 
в ответ uscheswoi_82 23.03.22 09:10, Последний раз изменено 23.03.22 09:30 (alex445)
и везде где можно try catch блоки

А что это даст? Ну наставили вы этих блоков, и теперь программа не вылетает... а что делает? Логирует всю эту фигню, выдавая стандартное сообщение "произошла ошибка, щас закроюсь"? А клиенту какая разница, закрывается прога с предупреждением от фреймворка с эксепшеном, или с красиво оформленным окном об ошибке? Она ж всё равно закрывается.


Слышал мнение, что в дебаге прога должна бросать все исключения, а не перехватывать (чтобы быстрее баги выявлялись), а в релизе (т.е. на продакшене) - перехватывать лишь для логирования. В принципе, логично.


А то некоторые наперехватывают исключений, а потом не делают с ними ничего - шито-крыто, прога без багов, не падает. Просто считает всякую фигню, а не то, что надо. У джаваскриптизёров это вообще by design - какая бы хрень ни пришла в переменную, она валидна по умолчанию. Чтобы от этого уйти, громоздят вокруг js тонны костылей по проверке типов и прочих валидаций, которые в нормальных языках из коробки идут.

#15 
alex445 коренной житель23.03.22 09:36
NEW 23.03.22 09:36 
в ответ alex445 23.03.22 09:21, Последний раз изменено 23.03.22 09:48 (alex445)

Скажите, а какого это хрена на некоторых сайтах я копирую выделенный фрагмент текста, а мне в буфер обмена попадает ещё и приписка типа "скопировано с сайта такого-то"? И чем дальше, тем чаще. Там эти джаваскриптизёры не охренели ваще вконец? Я, ять, и так скопирую ваш охеренно важный и секретный текст, залезя в код страницы, но это будет неудобно. А похоже удобство - последнее, о чём вы, ски, думали, делая ваши джаваскриптерские сайтопомойки.


С какого хрена джаваскриптиз может перехватывать то, что ко мне в буфер обмена попадает? Алё, гараж, это флеш-то дырявый был?


Или всякие твиттеры-хриттеры, инстаграммы. Нельзя просто взять и скопировать картинку - она у нас хитровыепонно запрятана в гору стилей. В коде её можно вытащить, продравшись через тонну нагенеренного дерьма, но это неудобно. А похоже удобство - последнее, о чём думали разработчики твиттеров-хриттеров.


Или твиттерная система комментов. Чтобы почитать 10-20 комментов, ты должен, ска, как пианист сделать 5-7 нажатий. А почему в таком популярном Телеграме видео - это просто долбаный прямоугольник с одной функцией - запустить видео на полной громкости? Перемотать нельзя, громкость изменить нельзя. Ничего нельзя. Но мы ска модерновый мессенджер, можно делать "ботов" (скрипт киддис торчат от радости), и ваще идити все к нам. Хотя у нас лысый мессенджер без функций.


Современное хайпожорное айти - ядский цирк с конями и крикливыми "инфлюэнсерами", смузями и барбершопами. Одно слово - джаваскриптизёры...


Когда эта вся нынешняя популярная кодла только начинала, многие скептически говорили - да ну на, не может быть, чтобы сервис "запости одну картинку" или "напиши СМСку не больше 128 символов" взлетел. Ну знаете, есть же готовые мессенджеры, где уже давно дохрена функций, крутые чаты, видео, конференции, и чтобы выйти нормально на рынок, надо сделать типа не хуже. Нет?.. Они и не взлетели бы, если бы в их раскрутку не влили бабла на два порядка больше, чем стоила их разработка. Но так-то можно и натуральное овно популярным сделать и заставить жрать.

#16 
Срыв покровов патриот23.03.22 10:12
NEW 23.03.22 10:12 
в ответ alex445 23.03.22 08:32
А если отбавить? А если просто не повышать?

если долго не повышать, то тоже ничего не изменится

Просто другую работу буду искать

А убавить не получится

#17 
MrSanders коренной житель23.03.22 10:53
NEW 23.03.22 10:53 
в ответ AlexNek 22.03.22 23:07
Месяц, работает/два, проблем нет - маладец. Есть только небольшой ньюанс - база располагается в памяти контейнера, не на диске. Но об этом никто не знает до тех пор пока не потребовалось перегрузить сервер.

Я бы не был так уверен про "память". Очень может быть что погромизд как всегда не стал ничего читать. Пока контейнер работал, всё писалось на диск. Убили контейнер - очистили все файлики. Ой.

А в документации могло быть написано, мол, не забудьте создать volume, он будет использоваться для записи БД.

#18 
AlexNek патриот23.03.22 12:29
AlexNek
NEW 23.03.22 12:29 
в ответ Murr 22.03.22 23:44
А причем тут программист?

А кто должен всем этим заниматься - кодер?смущ

#19 
AlexNek патриот23.03.22 12:32
AlexNek
NEW 23.03.22 12:32 
в ответ alex445 23.03.22 05:09
всё было изначально хорошо спланировано, сделано и работало как часы?

Нет, но есть же правила хорошего тона. Глянул счас в каталог картинок: 1.6Мб, 300 Кб, 250Кб и т.п. шок

#20 
AlexNek патриот23.03.22 12:36
AlexNek
NEW 23.03.22 12:36 
в ответ alex445 23.03.22 05:12
что такое докер

Для десктопа это практически не нужною - обкоцанная виртуалка.


И чё с пользователями? Всех удалили?

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

#21 
AlexNek патриот23.03.22 12:39
AlexNek
NEW 23.03.22 12:39 
в ответ MrSanders 23.03.22 10:53
Пока контейнер работал, всё писалось на диск.

Не знаю, мне сказали что H2 в Keycloak по умолчанию пишет в память.

#22 
Murr патриот23.03.22 13:46
Murr
NEW 23.03.22 13:46 
в ответ AlexNek 23.03.22 12:29

кодер?

------

специалист по картинкам и их размещению... Нее? спок

#23 
MrSanders коренной житель23.03.22 13:58
NEW 23.03.22 13:58 
в ответ AlexNek 23.03.22 12:39
Не знаю, мне сказали что H2 в Keycloak по умолчанию пишет в память.

Это да, это может быть. Но у Keycloak-а вполне неплохая дкументация. База менялась запросто... О, кстати https://www.keycloak.org/getting-started/getting-started-d... Прямо в конце странички


Next

Before you go and run Keycloak in production there are a few more things that you will want to do, including:
  • Switch to a production ready database such as PostgreSQL
  • Configure SSL with your own certificates
    ...

Погромизд не дочитал-с. Ну или забыл-с. Бывает.

#24 
AlexNek патриот23.03.22 17:22
AlexNek
NEW 23.03.22 17:22 
в ответ MrSanders 23.03.22 13:58
Погромизд не дочитал-с

Не, что то делалось. Помню плач - не работает постгрес. В итоге на мс SQL запустилось. Но об этом уже все забыли. Запустилось и забылось.

А вот сказать команде, что ребята - там база в памяти, осторожно. Это не зло

#25 
AlexNek патриот23.03.22 17:26
AlexNek
NEW 23.03.22 17:26 
в ответ alex445 23.03.22 09:21
Она ж всё равно закрывается.

Это не в нашем мире. Тута или клиент падает или сообщение об ошибке получаешь и работаешь дальше.

#26 
AlexNek патриот23.03.22 17:27
AlexNek
NEW 23.03.22 17:27 
в ответ alex445 23.03.22 09:36
а какого это хрена на некоторых сайтах я копирую

Copyright батенька, Copyright.

#27 
alex445 коренной житель23.03.22 19:37
NEW 23.03.22 19:37 
в ответ AlexNek 23.03.22 17:27, Последний раз изменено 23.03.22 19:40 (alex445)

Мне плевать не копирайт. Я же сказал, что вытащу этот текст и так, только не так удобно будет - либо через дев тулс, либо скрипты отключу. Меня интересует, почему джаваскрипт мне в буфер обмена лезет и подменяет его содержимое? А куда ещё он свои ручонки протянуть может? Где гарантия, что браузер не позволяет ему втихушку у меня по папкам шариться?

#28 
Срыв покровов патриот23.03.22 20:41
NEW 23.03.22 20:41 
в ответ alex445 23.03.22 19:37

нет гарантии, пока не начнёшь использовать свой самописный браузер.

#29 
AlexNek патриот23.03.22 21:09
AlexNek
NEW 23.03.22 21:09 
в ответ alex445 23.03.22 19:37
Мне плевать не копирайт

Ну так кто бы сомневался


только не так удобно будет

А просто строку отредактировать мысля не приходит?


почему джаваскрипт мне в буфер обмена лезет

Кто сказал что лезет?

https://stackoverflow.com/questions/42089713/modify-clipbo...


браузер не позволяет ему втихушку у меня по папкам шариться

А он и шарится и более того все нужные файлы уже лежат на серверах тех кому надо и ждут своего часа смущ

От всех жителей всего мира. Нефиг пользовать браузеры недружественных стран бебе

#30 
AlexNek патриот30.03.22 19:54
AlexNek
NEW 30.03.22 19:54 
в ответ AlexNek 22.03.22 22:57

Может и не такой уж и подарок, но неприятно.

Сделал народ батник для спец. билда. Все хорошо, Но пути абсолютные для компа программиста, который это делал.

Новый файлы нужно добавлять вручную в батник

#31 
Murr патриот30.03.22 20:35
Murr
NEW 30.03.22 20:35 
в ответ AlexNek 30.03.22 19:54

Но пути абсолютные для компа программиста

------

Не зря Я крутил билд через гит - взял, построил, протестил - дальше думаешь что делать...

А то, что у прогера - оно у прогера... как ему надо...

#32 
AlexNek патриот30.03.22 21:37
AlexNek
NEW 30.03.22 21:37 
в ответ Murr 30.03.22 20:35
Я крутил билд через гит

Может считаешь что я взял код через SVN?бебе


думаешь что делать

Ну так об этом то и тема, нужно думать, а народ или не хочет или не умеет. Главное - чтобы быстрее сдать.

Хотя именно так начальству и хочется. Первый вопрос на дэйли - а как там burndown поживает?

Что, ключи в гит записали? Ну и что, работает - нефиг на это время тратить.

#33 
Murr патриот30.03.22 22:19
Murr
NEW 30.03.22 22:19 
в ответ AlexNek 30.03.22 21:37

Хотя именно так начальству и хочется.

-----

Буквально на прошлой неделе примерно с таким "потенциальным" начальством и пообщался.

Что могу сказать - начальство так и осталось в своем статусе - "потенциальное"... может кого и отловят...

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


что я взял код

-----

Учись читать - Я код для билда вообще никак не трогаю... все в автомате... даже редактирование файлов проектов...

Потому что-бы и как-бы Я не настроил на биод-сервере - мне до лампочки как и какой исходник покладут в гит...

И акцептансе - по билду, а не "у меня работает"...

#34 
AlexNek патриот30.03.22 22:37
AlexNek
NEW 30.03.22 22:37 
в ответ Murr 30.03.22 22:19
Буквально на прошлой неделе примерно с таким "потенциальным" начальством и пообщался

Не знаю как это можно отследить до того как.

Сколько вот просили покажи код, покажи код, насколько clean.

А в итоге оказалось полностью по барабану.

#35 
Murr патриот30.03.22 22:54
Murr
NEW 30.03.22 22:54 
в ответ AlexNek 30.03.22 22:37

Не знаю как это можно отследить до того как.

-----

Можно.

В данном конкретном случае на ВСЕ мои вопросы об организации работ давался единственный ответ - мы делаем программное обеспечение. Все.

При этом человека интересует специалист готовый плотно работать минимум с десятком языков... и вообще без технологий.

Ну как организуется работа полностью несведущим в самом процессе разработки администратором Я ознакомился еще в 90-е... там ничего не меняется...


оказалось полностью по барабану.

------

Это - да... быстрее, быстрее... еще быстрее... не останавливайся... продолжай... хорошо... дас ист фантастишь.... эээ... а чего это происходит?!. ты куда??... смущ

#36 
alex445 коренной житель31.03.22 04:38
NEW 31.03.22 04:38 
в ответ AlexNek 30.03.22 19:54

Сделал народ батник для спец. билда. Все хорошо, Но пути абсолютные для компа программиста, который это делал.

Новый файлы нужно добавлять вручную в батник

А почему народ специальные общие папки в ОС, которые у всех в одинаковом месте находятся, не использует для этого?

#37 
alex445 коренной житель31.03.22 04:43
NEW 31.03.22 04:43 
в ответ Murr 30.03.22 22:19
Но судя по тому, что у меня в архивах чел проходит под другим именем/фамилией, а секретарша проговорилась об смене названия шараги - с ловлей идиотов имеются трудности... смущ

Вот всякие топы со состояниями до миллиарда баксов не парятся, а работают с любыми идиотами, лишь бы бабки платили. Продукт, проект или даже вся компания пошли по звезде после такого руления? - Да пофиг, лишь бы бабки платили. А всякие семизнаки чёта нос воротят, базы данных ведут с отслеживанием изненений имён руководителей и названий компаний.

#38 
alex445 коренной житель31.03.22 04:46
NEW 31.03.22 04:46 
в ответ AlexNek 30.03.22 22:37

Сколько вот просили покажи код, покажи код, насколько clean.

А в итоге оказалось полностью по барабану.

Ищут соринку в глазах соискателей, не замечая у себя бревна?


Так может они как раз и хотят от своих брёвен-говнокодеров избавиться и найти добрых и пушистых клин кодировщиков.

#39 
alex445 коренной житель31.03.22 04:49
NEW 31.03.22 04:49 
в ответ Murr 30.03.22 22:54
В данном конкретном случае на ВСЕ мои вопросы об организации работ давался единственный ответ - мы делаем программное обеспечение. Все.

Ну хотя бы честно ответили. А могли бы наврать с три короба, что всё по высшему классу. Вы же не будете у них требовать "покажите код"? ))

#40 
AlexNek патриот31.03.22 12:38
AlexNek
NEW 31.03.22 12:38 
в ответ alex445 31.03.22 04:38
А почему народ специальные общие папки в ОС

Это какие например? c:/windows?

#41 
alex445 коренной житель31.03.22 13:06
NEW 31.03.22 13:06 
в ответ AlexNek 31.03.22 12:38, Последний раз изменено 31.03.22 13:18 (alex445)
А почему народ специальные общие папки в ОС
Это какие например? c:/windows?

Обозначенные тут и тут, например.


Т.е. у вас на фирме должно быть принято, что все проекты кидают свои файлы в ALLUSERSPROFILE (аналог Environment.SpecialFolder.CommonApplicationData) и далее в своё приложение. Типа такого


ALLUSERSPROFILE/<CompanyName>/<AppName>/


Вы всем прогерам при начале работы говорите путь, где всё должно лежать, чтобы потом другие прогеры не искали чёрт те где и на других машинах запускалось. И чтобы всегда можно было составить путь к файлам приложения из переменной окружения, названия вашей фирмы, названия аппы и чего-нибудь ещё. И какая-нибудь общая либа подключаемая к каждому проекту - где все устоявшиеся названия и пути или части путей есть. Как-то так.


Как же я ненавижу этот форум, который берёт и просто лять удаляет весь на... код со скобками! Но только при попытке редактирования или новой загрузки страницы. Если первый раз отправить - всё норм.

#42 
Программист коренной житель31.03.22 13:07
NEW 31.03.22 13:07 
в ответ alex445 31.03.22 04:38
А почему народ специальные общие папки в ОС, которые у всех в одинаковом месте находятся, не использует для этого?

Они не находятся у всех в одинаковом месте :) Но есть много папок с заранее известными alias'ми , которые хранятся в переменных окружения.

Ну и неверное нет на фирме дребования всегда использовать переменные окружения для корневых каталогов ;) Уверен, что ты тоже не страдаешь этой хренью :D

#43 
alex445 коренной житель31.03.22 13:14
NEW 31.03.22 13:14 
в ответ Программист 31.03.22 13:07, Последний раз изменено 31.03.22 13:15 (alex445)
Ну и неверное нет на фирме дребования всегда использовать переменные окружения для корневых каталогов ;) Уверен, что ты тоже не страдаешь этой хренью :D

А вот пришлось пострадать. Кстати, переменные окружения и перечисления специальных папок в .NET могут не совпадать. По названиям так уж точно. Это потому, что в МС тоже "не страдали хренью" и каждая команда писала кто во что горазд - а как воедино свести эти ваши разные перечисления из разных мест - та ипитесь вы там сами. Нам, семизнакам, поф - у нас по полляма зарплата в месяц и опционы. Пару-тройку лет поработал - на пенсию с семью знаками ушёл. Красота!

#44 
Murr патриот31.03.22 15:05
Murr
NEW 31.03.22 15:05 
в ответ alex445 31.03.22 13:06

не искали чёрт те где и на других машинах запускалось.

-----

Зааамечательное (ржу в голос) решение...

#45 
Murr патриот31.03.22 15:13
Murr
NEW 31.03.22 15:13 
в ответ Программист 31.03.22 13:07

Но есть много папок с заранее известными alias'ми , которые хранятся в переменных окружения.

------

Вообще-то в .Net есть класс... кажется SpecialFolders...

а дальше уже забота мелкомягких чтобы оно работало во всех вариантах...

С тем чтобы не работало - пока не сталкивался, но от версии к версии физические места меняются..

#46 
7495 местный житель31.03.22 15:52
7495
NEW 31.03.22 15:52 
в ответ alex445 31.03.22 13:14
Нам, семизнакам, поф - у нас по полляма зарплата в месяц и опционы. Пару-тройку лет поработал - на пенсию с семью знаками ушёл. Красота!


Семизнаки годами выращивают себе партнёров. Всё начинается с партнёров, а уж что им потом впаривать - WPF, ASP.NET MVC, .NET Compact, Windows Mobile, Silverlight, WiX, Blazor, акции, БАДы, рекламу, телефоны - дело десятое. (c)

Вопросы и Ответы - Программируем калькулятор пособий для беженцев вместе.
#47 
Программист коренной житель31.03.22 16:55
NEW 31.03.22 16:55 
в ответ alex445 31.03.22 13:14
Кстати, переменные окружения и перечисления специальных папок в .NET могут не совпадать.

Да плевать на перечисления .Net. Речь же шла о батниках :) Какой там .Net? :D

#48 
AlexNek патриот31.03.22 17:43
AlexNek
NEW 31.03.22 17:43 
в ответ alex445 31.03.22 13:06
Обозначенные тут и тут, например.

Когда лично попробуете хаха

Это всё для данных можно как то делать.


Т.е. у вас на фирме должно быть принято

Хорошо что это на другом острове


#49 
uscheswoi_82 старожил31.03.22 18:12
uscheswoi_82
NEW 31.03.22 18:12 
в ответ AlexNek 30.03.22 19:54
Сделал народ батник для спец. билда. Все хорошо, Но пути абсолютные для компа программиста, который это делал.Новый файлы нужно добавлять вручную в батник

Для какого билда? Если имеется ввиду компиляция проекта, то нужно делать спомощью cmake - https://stackoverflow.com/questions/2074144/generate-c-sharp-project-using-cmake. Если батник что-то запускает, то нужно использовать переменные окружения, вот это - https://docs.microsoft.com/ru-ru/dotnet/api/system.environment.getenvironmentvariable?view=net-6.0, или зафигачить настройки в ini файлы вместо bat файла см. - http://plssite.ru/csharp/csharp_ini_files_article.html

кто как обзывается, тот так сам называется... маску ношу чтобы не заразить антиваксеров... Дневник тяжелобольного инвалида
#50 
AlexNek патриот31.03.22 20:57
AlexNek
NEW 31.03.22 20:57 
в ответ uscheswoi_82 31.03.22 18:12
то нужно делать с помощью cmake

Это с какого века то? Или это от любителей программить в нотепаде? смущ

Как сделать правильно, вопрос не ставится.

Но если интересно, то абсолютный путь свободно конвертируется в относительный, для данного случая.

А имена файлов можно генерить из батника

    FOR %%A IN ("*.proto") DO (
      echo  generated for "%%A" 
          ...
    )
#51 
alex445 коренной житель01.04.22 12:27
NEW 01.04.22 12:27 
в ответ Murr 31.03.22 15:13, Последний раз изменено 01.04.22 12:28 (alex445)
Вообще-то в .Net есть класс... кажется SpecialFolders...

А как в конфиги (XML, JSON и т.д.) оттуда значения вставлять? В конфигах должны быть текстовые константы. Поэтому я и привёл вторую ссылку.

#52 
alex445 коренной житель01.04.22 12:31
NEW 01.04.22 12:31 
в ответ AlexNek 31.03.22 17:43
Хорошо что это на другом острове

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

#53 
alex445 коренной житель01.04.22 12:31
NEW 01.04.22 12:31 
в ответ Программист 31.03.22 16:55, Последний раз изменено 01.04.22 12:31 (alex445)
Да плевать на перечисления .Net. Речь же шла о батниках :) Какой там .Net? :D

Для батников - текстовые константы из другой ссылки.

#54 
alex445 коренной житель01.04.22 12:35
NEW 01.04.22 12:35 
в ответ AlexNek 22.03.22 22:58

Картинки в png

Данные в памяти

Абсолютный путь

Обычно ещё такое бывает, когда "какие два дня?! - должно быть сделано ещё вчера! вот тебе два часа на всё про всё, и то лишь потому, что я сегодня добрый".

#55 
Murr патриот01.04.22 14:48
Murr
NEW 01.04.22 14:48 
в ответ alex445 01.04.22 12:27

А как в конфиги

-----

А мат.часть учить кто будет? на предмет ISerializable....

#56 
AlexNek патриот01.04.22 17:55
AlexNek
NEW 01.04.22 17:55 
в ответ alex445 01.04.22 12:31
Ну на вашем острове индусы

Они тоже с другого острова

#57 
AlexNek патриот01.04.22 17:56
AlexNek
NEW 01.04.22 17:56 
в ответ alex445 01.04.22 12:35
Обычно ещё такое бывает

Обычно такое бывает когда народ не привык думать дальше таски.

#58 
uscheswoi_82 старожил01.04.22 23:45
uscheswoi_82
NEW 01.04.22 23:45 
в ответ AlexNek 31.03.22 20:57, Последний раз изменено 01.04.22 23:50 (uscheswoi_82)

С каждой версией .Net Framework поставляется компилятор, т.е. вам не надо устанавливать Visual Studio. Я писал тут - https://programming.mybb.ru/viewtopic.php?id=197 как компилировать если нет возможности посавить Visual Studio. Правда DotPeek не показывает Target Framework см. https://i.ibb.co/rpcybt9/result-exe-13-34-18-08-2021-min.j..., а когда запускаешь в XP даёт сбой и требует NET 4.x https://i.ibb.co/sPb4C3s/error-framework4-04-56-19-08-2021.... Вот там и нужен cmake, я могу на Visual Studio 2008 программировать, а откомпилиовать спомощью cmake для любого target-а.

кто как обзывается, тот так сам называется... маску ношу чтобы не заразить антиваксеров... Дневник тяжелобольного инвалида
#59 
Murr патриот02.04.22 00:53
Murr
NEW 02.04.22 00:53 
в ответ uscheswoi_82 01.04.22 23:45
Вот там и нужен cmake

-----

Студия, между тем, использует MsBuild...

Просто скармливаешь проект и все получается...

#60 
alex445 коренной житель02.04.22 10:10
NEW 02.04.22 10:10 
в ответ uscheswoi_82 01.04.22 23:45, Последний раз изменено 02.04.22 10:27 (alex445)
С каждой версией .Net Framework поставляется компилятор, т.е. вам не надо устанавливать Visual Studio. Я писал тут - https://programming.mybb.ru/viewtopic.php?id=197 как компилировать если нет возможности посавить Visual Studio.

Это мне напоминает статьи, получившие в последнее время распространение, как в том же NuGet управляться текстовыми командами в консоли NuGet. Там обычно заваливают десятками разных команд, вместо того, чтобы вывести всё в понятные кнопки-пиктограммы. Если создателю и любителю всей этой текстовой херни Торвальдсу нравится порхать по клавиатуре, это его дело. Нормальным людям подавай удобство и современность. ))


С другой стороны им противостоят новомодные джаваскриптизёры и любители "всё, что веб". Эти в нормальные и структурированные десктопные интерфейсы привносят свои хипстерские веб-дизайны, где десятки разных кнопок разбросаны по всему экрану, имеют по многу стилей, и не поймёшь, что за что отвечает. Всё это сверху они полируют дизайнерскими изъё...ами, где непонятно, что кнопка это кнопка, пока на неё не наведёшь. У этой братии очень важно, чтобы каждый элемент имел в идеале свой стиль и не было двух похожих контролов. К чему все эти наработки по интерфейсам 90-2000-х, когда все эти проблемы были обсосаны и решены, а мануалы написаны и внедрены в уже готовые библиотеки - бери да пользуйся? Нет, мы наш, мы новый мир построим - с капканами и граблями!


На этом форуме кнопки "изменить", "удалить" и "да, я хочу удалить..." имеют три разных стиля. Каждый разработчик, которому поручили сделать какой-то раздел сайта или форму, придумывает свои стили, а не использует уже готовые на сайте. И то верно - зачем разбираться в этой каше наследования стилей CSS, когда проще намонстрячить свои с нуля?

#61 
AlexNek патриот02.04.22 13:12
AlexNek
NEW 02.04.22 13:12 
в ответ uscheswoi_82 01.04.22 23:45
т.е. вам не надо устанавливать Visual Studio

Ну так и говорю - рекомендации для нотепад любителей BDSM

#62 
7495 местный житель02.04.22 13:31
7495
NEW 02.04.22 13:31 
в ответ AlexNek 02.04.22 13:12
Ну так и говорю - рекомендации для нотепад любителей BDSM


да только так + текстовыми командами в консоль забивать, строка энтер = кулхацкер, а быдлокодеры совсем на бейсиках с# отупели, даже блокчейн не в состоянии понять зло



Вопросы и Ответы - Программируем калькулятор пособий для беженцев вместе.
#63 
uscheswoi_82 старожил02.04.22 16:22
uscheswoi_82
NEW 02.04.22 16:22 
в ответ AlexNek 02.04.22 13:12, Последний раз изменено 02.04.22 16:25 (uscheswoi_82)
Ну так и говорю - рекомендации для нотепад любителей BDSM

Просто есть пользователь uvv - https://my.germany.ru/933659, он просил как-то меня показать как я умею программировать, я посмотрел его портфолио, там он пользуется cmake, я тоже решил изучить cmake, там ничего сложного, нужно создать текстовый файл, в котором написать такие строки:

cmake_minimum_required(VERSION 3.21 FATAL_ERROR)
project(Demo)
file(GLOB Demo_SRC
    "*.c"
)
 
add_executable(Demo ${Demo_SRC})

А cmake сам создаст большущий makefile.

кто как обзывается, тот так сам называется... маску ношу чтобы не заразить антиваксеров... Дневник тяжелобольного инвалида
#64 
uscheswoi_82 старожил02.04.22 16:49
uscheswoi_82
NEW 02.04.22 16:49 
в ответ uscheswoi_82 02.04.22 16:22

А я всё никак не могу научится пользоваться в Windows - File Explorer, а в MacOS Finder, поэтому в Windows использую Far Manager, а Mac Mini лежит и пылится в шкафу, хотя имхо там вроде есть Midnight Commander, но в макинтошах как-то дико пользоваться Bash.

кто как обзывается, тот так сам называется... маску ношу чтобы не заразить антиваксеров... Дневник тяжелобольного инвалида
#65 
AlexNek патриот02.04.22 17:28
AlexNek
NEW 02.04.22 17:28 
в ответ uscheswoi_82 02.04.22 16:22
как я умею программировать, я посмотрел его портфолио, там он пользуется cmake,

Вообще то эти вещи настолько далеки друг от друга, что повторять это - не имеет ну просто никакого смысла.

#66 
AlexNek патриот02.04.22 17:32
AlexNek
NEW 02.04.22 17:32 
в ответ uscheswoi_82 02.04.22 16:49
в Windows использую Far Manager

Это первое что я ставлю на новый комп. смущ

Но каждое (File Explorer, Far) существует для своих вещей.

#67 
alex445 коренной житель02.04.22 17:41
NEW 02.04.22 17:41 
в ответ AlexNek 02.04.22 17:32, Последний раз изменено 02.04.22 17:42 (alex445)

Это вот это фуфло вырвиглазное? Можно же какой-нибудь более приятный Total Commander, Free Commander и т.п. Или все на фирме повторяют вслед за главным альфакодером, застрявшим в средневековье?

#68 
AlexNek патриот02.04.22 17:53
AlexNek
NEW 02.04.22 17:53 
в ответ alex445 02.04.22 17:41
Это вот это фуфло вырвиглазное?

А что там вам не нравится?

#69 
Программист коренной житель02.04.22 20:14
NEW 02.04.22 20:14 
в ответ AlexNek 31.03.22 20:57
Это с какого века то?

CMake - это новая тулза (первый релиз был в 2000 году, последний - 29.03.2022). Ну и сейчас многие фирмы используют CMake. У меня как-то даже был отказ из-за того, что я не работал с CMake'ом :)

#70 
AlexNek патриот02.04.22 20:51
AlexNek
NEW 02.04.22 20:51 
в ответ Программист 02.04.22 20:14
CMake - это новая тулза

Возможно для кого то спок

Считается альтернативой распространённой в сообществе GNU
#71 
uscheswoi_82 старожил02.04.22 23:36
uscheswoi_82
NEW 02.04.22 23:36 
в ответ alex445 02.04.22 17:41

Зато там когда программируешь она подсвечивает разными цветами.

кто как обзывается, тот так сам называется... маску ношу чтобы не заразить антиваксеров... Дневник тяжелобольного инвалида
#72 
alex445 коренной житель03.04.22 05:22
NEW 03.04.22 05:22 
в ответ Программист 02.04.22 20:14
CMake - это новая тулза (первый релиз был в 2000 году, последний - 29.03.2022). Ну и сейчас многие фирмы используют CMake. У меня как-то даже был отказ из-за того, что я не работал с CMake'ом :)

Это скорее для разных удалённых сборок разных проектов, где не развёрнуты полноценные среды разработки, ну и вообще про управление сборками. Это явно не программистские задачи в чистом виде, а скорее админские или кто там на фирме отвечает за автоматизацию кучи сборок. И уж точно такие утилиты не нужны обычным разработчикам - им проще f5 нажать. Поэтому, когда формошлёп-кодер повторяет за местным альфакодером его тимлидские загибы, то это смешно и бесполезно выглядит: сидит в разных FAR'ах, пользуется консольной фигнёй для сборок своих формочек, и тому подобные закидоны. Со стороны ну прямо хакер.

#73 
Программист коренной житель03.04.22 12:06
NEW 03.04.22 12:06 
в ответ AlexNek 02.04.22 20:51
Возможно для кого то спок

Зачем же ты приводишь часть цитаты?

Считается альтернативой распространённой в сообществе GNU системе Autotools, разработанной на базе Perl и M4, которая требует определённых навыков для практического использования, а существующие версии в ряде случаев несовместимы друг с другом.
#74 
Программист коренной житель03.04.22 12:11
NEW 03.04.22 12:11 
в ответ alex445 03.04.22 05:22
И уж точно такие утилиты не нужны обычным разработчикам - им проще f5 нажать.

Зависит от проекта. Далеко не всегда все проекты находятся в одном солюшене.

Но, таки да, для "хелло, ворлд" CMake не нужен. Но мы и не знаем, зачем его применял человек, у которого подсмотрел uscheswoi_82.

#75 
AlexNek патриот03.04.22 12:11
AlexNek
NEW 03.04.22 12:11 
в ответ Программист 03.04.22 12:06
Зачем же ты приводишь часть цитаты?

потому как сообщество GNU находится довольно далеко от меня и что там у них происходит как то ну совершенно не интересно.

#76 
Программист коренной житель03.04.22 12:13
NEW 03.04.22 12:13 
в ответ AlexNek 03.04.22 12:11

При чем тут вообще твоя удаленность от сообщества GNU? :D Если ты не пользуешься какой-то технологией, это не значит, что эта технология стара и/или никому не нужна ;)

#77 
AlexNek патриот03.04.22 13:03
AlexNek
NEW 03.04.22 13:03 
в ответ Программист 03.04.22 12:13
Если ты не пользуешься какой-то технологией

Ну так поэтому и сказал, что

Возможно для кого то

Для меня make (и подобное) ушел вместе с С лет так 25 назад. YAML для бильда еще попадался, а вот какой нибудь make еще ни разу.

#78 
alex445 коренной житель03.04.22 16:01
NEW 03.04.22 16:01 
в ответ Программист 03.04.22 12:11, Последний раз изменено 03.04.22 16:03 (alex445)
И уж точно такие утилиты не нужны обычным разработчикам - им проще f5 нажать.
Зависит от проекта. Далеко не всегда все проекты находятся в одном солюшене.

Я думал, что есть два основных сценария работы:


1) ты подключаешь уже скомпиленные библиотеки и используешь их;

2) если надо копаться в коде этих библиотек, то ты подключаешь в проект солюшены.


А что это за работа, где проекты с исходниками недоступны, и одновременно уже скомпиленные библиотеки не подключаются? Ну я слышал про всякие извращения, где тебе не дают доступ к проекту, но дают какой-то ограниченный удалённый доступ к коду. Ты в основном можешь его лишь посмотреть, что тебе толком не поможет. В чём смысл? Создать программисту побольше проблем на ровном месте?

#79 
Murr патриот03.04.22 16:30
Murr
NEW 03.04.22 16:30 
в ответ alex445 03.04.22 16:01

А что это за работа

------

Нормальная работа.

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

#80 
alex445 коренной житель03.04.22 16:46
NEW 03.04.22 16:46 
в ответ Murr 03.04.22 16:30, Последний раз изменено 03.04.22 16:50 (alex445)
Тут скорее вопрос в том, как целую кучу проблем решают те, кому требуется иметь проект/библиотеку до того как требования к этому проекту/библиотеке были сформулированы клиентом... а клиент со своими хотелками определится после окончания реализации текущего проекта...

Тут тоже есть подходы. Например, сначала решить проблему клиента. Потом убедить клиента, что решил именно ту проблему, которая у него была. А потом убедить его, что она у него таки была. Довольно распространённый бизнес.

#81 
Программист коренной житель03.04.22 21:10
NEW 03.04.22 21:10 
в ответ alex445 03.04.22 16:01
Создать программисту побольше проблем на ровном месте?

Смысл в том, чтобы максимально изолировать команды друг от друга.

Таким образом получается своебразный конструктор, в котором есть архитектура. Простой прирер - слоеная архитектура. Когда нижний слой ничего не должен знать о верхнем. При этом верхний слой работает с абстракциями.

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


Ну а сборка продукта - это просто копирование уже скомпилированных DLL'ек.

#82 
Murr патриот03.04.22 21:38
Murr
NEW 03.04.22 21:38 
в ответ alex445 03.04.22 16:46

Например, сначала

-----

Ты, как всегда, уперся в свое, ограниченное недостатком опыта, видение проблемы и ничто тебя не подвинет изучить проблему и способы решения... пока, по крайней мере...

Я, например, уже лет 20-ть пишу в условиях, когда сначала требуется написать решение, а потом добавят клиентов... часто - без меня... и без исходников...

#83 
alex445 коренной житель07.04.22 17:16
NEW 07.04.22 17:16 
в ответ Murr 03.04.22 21:38, Последний раз изменено 07.04.22 17:20 (alex445)

Вы когда-нибудь видели такую файловую структуру проекта, что в директории с файлами самого проекта (csproj, sln и его остальными файлами и директориями) находится директория, в которой лежит другой проект со своими файлами? Т.е. примерно так


Директория проекта 1

|-файлы и директории типа bin и прочие элементы проекта 1

|-1.csproj

|-1.sln

|-Директория проекта 2

|--файлы и директории типа bin и прочие элементы проекта 2

|--2.csproj

|--2.sln


Что за бред, что за матрёшка? Удаляя проект 1, удаляешь и все вложенные.


В Студии в окне Solution Explorer можно ориентироваться, только если включить вид "решения" (пиктограмма "Switch between solutions and available views"). Тогда эти вложенные проеты идут обычным списком в одной иерархии. Если включить "виды" (это обычная проводниковая файловая структура, как я понимаю), то хрен догадаешься, что в папках одного проекта ещё другие намешаны.

#84 
Murr патриот07.04.22 18:17
Murr
NEW 07.04.22 18:17 
в ответ alex445 07.04.22 17:16

Вы когда-нибудь видели

-----

Я таки видел столько разных, что удивить меня чем-нибудь будет сложно...


Солюшник... 100+ проектов.... 100+проектов тестов...

Все это в сложной иерархии... причем проекты убраны на два уровня вниз...

биновый фолдер - на уровне солюшника... шаренные файлы - уровнем ниже...

Все нормально...

#85 
AlexNek патриот07.04.22 22:02
AlexNek
NEW 07.04.22 22:02 
в ответ alex445 07.04.22 17:16
Что за бред

Конечно, проект в проекте никак не может быть.

#86 
Murr патриот08.04.22 01:28
Murr
NEW 08.04.22 01:28 
в ответ AlexNek 07.04.22 22:02

проект в проекте

-----

Ээээ.... так там такого и нету... там нарисована структура размещения на диске - к проекту в проекте - никакого отношения....


И это... на самом деле - можно и проект в проекте... но только - руками - Студия так не умеет.хммм

#87 
alex445 коренной житель08.04.22 09:27
NEW 08.04.22 09:27 
в ответ Murr 08.04.22 01:28

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

#88 
Срыв покровов патриот08.04.22 09:44
NEW 08.04.22 09:44 
в ответ alex445 08.04.22 09:27

ни разу внутрь файла *.csproj не загадывал?


#89 
Murr патриот08.04.22 12:44
Murr
NEW 08.04.22 12:44 
в ответ Срыв покровов 08.04.22 09:44

ни разу внутрь файла *.csproj не загадывал?

-----

Ему-то зачем туда лезть?

Там же какой-то страшный ХМЛ, который поди еще и учить придется... смущ

жутиковый такой кошмарище... спок

#90 
Murr патриот08.04.22 12:49
Murr
NEW 08.04.22 12:49 
в ответ alex445 08.04.22 09:27

как Студия отслеживает

------

Прописано в процах и таргетсах.

Если пороешься в архиве, то можешь найти мой вопросик про книжку в которой это все описано...

Ну это... читать-изучать придется самому...


Ах, да... там не все - что для процов и таргетсов слишком сложно можно оформить в виде тасков...

Но это опять надо кусок старья изучать...смущ

#91 
alex445 коренной житель08.04.22 17:19
NEW 08.04.22 17:19 
в ответ Срыв покровов 08.04.22 09:44, Последний раз изменено 08.04.22 17:21 (alex445)

И что там? Пути для всех файлов проекта хранятся?

Как Студия понимает, что файл Blahblab.cs или там myPicture.jpg относится к такому-то проекту, а не к другому?

#92 
Срыв покровов патриот08.04.22 17:55
NEW 08.04.22 17:55 
в ответ alex445 08.04.22 17:19

ну все, сгорел на работе))

#93 
alex445 коренной житель08.04.22 18:01
NEW 08.04.22 18:01 
в ответ Срыв покровов 08.04.22 17:55

Я тут багу одну ковырял весь день. Недоковырял и удручён. А вы не пожете сказать мне, как Студия отслеживает эти проклятые файлики...

#94 
Murr патриот08.04.22 20:18
Murr
NEW 08.04.22 20:18 
в ответ alex445 08.04.22 18:01

А вы не пожете

-----

А библию (МСДН) почитать? смущ

#95 
Murr патриот08.04.22 20:22
Murr
NEW 08.04.22 20:22 
в ответ Срыв покровов 08.04.22 17:55

ну все, сгорел на работе

------

Еще нет...

Вот скоро начнет спрашивать как шарповый или вбшный компиляторы обрабатывают Picture.jpg - тогда - да, готов... ну или спекся... как мой предшественник...

#96 
Срыв покровов патриот08.04.22 21:50
NEW 08.04.22 21:50 
в ответ alex445 08.04.22 17:19
Как Студия понимает, что файл Blahblab.cs или там myPicture.jpg относится к такому-то проекту, а не к другому?

один проект - один файл csproj ))

#97 
alex445 коренной житель08.04.22 22:01
NEW 08.04.22 22:01 
в ответ Murr 08.04.22 20:18, Последний раз изменено 08.04.22 22:09 (alex445)

Это я не туда глянул поначалу, оказывается. Открыл сейчас csproj от проекта на .NET Framework - там действительно все пути файлов хранятся. Открыл на .NET Standard - почти пустой файл. Где тут чего хранится?


<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.1</TargetFramework>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <OutputPath></OutputPath>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\CommonResources\CommonResources.csproj" />
  </ItemGroup>

  <ItemGroup>
    <CopyFiles Include="$(TargetDir)*.dll" />
  </ItemGroup>

  <Target Name="CopyFiles" AfterTargets="Build">
    <Copy SourceFiles="@(CopyFiles)" DestinationFolder="" />
  </Target>

</Project>
#98 
Murr патриот08.04.22 23:31
Murr
NEW 08.04.22 23:31 
в ответ alex445 08.04.22 22:01

на .NET Standard

-----

Да, там по-другому.

Я еще не расковыривал детали, но похоже что проект это "все-что-в-папочке"...


Мне - шибко не нравится - у меня часто лишние файлы в папках висят...

#99 
alex445 коренной житель09.04.22 02:40
NEW 09.04.22 02:40 
в ответ Murr 08.04.22 23:31

А нефиг мусорить! Теперь всё по стандарту будет. По дотнетстандарту!

))

AlexNek патриот09.04.22 14:13
AlexNek
NEW 09.04.22 14:13 
в ответ Murr 08.04.22 23:31
у меня часто лишние файлы в папках висят

А вот лишнии файлы как раз и можно убрать

Murr патриот09.04.22 16:43
Murr
NEW 09.04.22 16:43 
в ответ AlexNek 09.04.22 14:13

можно убрать

-----

Можно то можно, но работая без ГИТа версии дорабатываемых файликов надо где-то хранить.

На практике проще сделать резервную копию-по-месту и не включать ее в проект... привычка...

alex445 коренной житель09.04.22 17:57
NEW 09.04.22 17:57 
в ответ Murr 09.04.22 16:43

Вы там в блокнотике что-то пописываете, или на говне мамонте компиляете? Студия уже как миниум с 2019 версии идёт со встроенным гитом, который создаёт локальные репы на вашем компе. Я этому тоже какое-то время внимания не уделял и копипастил проектики-файлики прямо тута, по месту. Ну так я и не семизнак-помидор. ))

AlexNek патриот09.04.22 19:35
AlexNek
NEW 09.04.22 19:35 
в ответ Murr 09.04.22 16:43
и не включать ее в проект... привычка

ну нужно либо бороться с привычками, либо находить способы с ними жить. спок

Всегда пользуюсь локальным репо если что то относительно важное. Хотя и на домашнем сервере гит стоит.

alex445 коренной житель09.04.22 20:00
NEW 09.04.22 20:00 
в ответ AlexNek 09.04.22 19:35
AlexNek патриот09.04.22 20:10
AlexNek
NEW 09.04.22 20:10 
в ответ alex445 09.04.22 20:00

Всё гораздо проще, чем можно подумать бебе

https://www.synology.com/en-global/products/DS218

alex445 коренной житель09.04.22 21:10
NEW 09.04.22 21:10 
в ответ AlexNek 09.04.22 20:10

Да понятно, что любой комп может быть "домашним сервером". Я раньше тоже дома строил тепа домашнюю сеть из нескольких компов и телефонов. Задолбался там всякие права раздавать, папки шарить, порты маппить, чтобы извне доступ был, мак-фильтры настраивать (белый список - чтобы только мои устройства доступ имели). Тем более, что в Винде какая-то хрень с этим - то работает, то не работает, старые настройки с новыми (типа просто "общий доступ" и всякие "домашние группы") перемешаны и мешают друг другу. Потом решил - "нунаф!" и перестал всем этим заморачиваться. Делать нечего больше, чем ещё дома админом работать. ))

alex445 коренной житель09.04.22 21:33
NEW 09.04.22 21:33 
в ответ AlexNek 09.04.22 20:10

Да это что - домашний сорвер, ха. Вон раньше водители могли себе позволить двухэтажный особняк с земельным участком. А сейчас - только семизнаки. ))

AlexNek патриот09.04.22 21:43
AlexNek
NEW 09.04.22 21:43 
в ответ alex445 09.04.22 21:10
дома админом работать

Для стандартных вещей практически ничего не нужно делать. Да и виндой там и не пахнет.

Какую то проблему решить, да нужно поработать, ну так в этом то и удовольствие.

BSDLamer Хвостатый Carpal Tunnel09.04.22 21:50
BSDLamer
NEW 09.04.22 21:50 
в ответ AlexNek 22.03.22 22:57

как-то был в проекте и там один разраб (опыт работы лет 35) написал "майкросервис" для юзерменеджмента.

Юзеры сохранялись в CSV, соответственно чтоб добавить юзера, надо было делать бранч, добавлять строку, пускать пайплайн чтоб докер сделал новый имидж и задеплоить это на кластер.

Если забыл запятую, контейнер при загрузке просто падал и так пока ты не исправишь опять через пайплайн CSV.

Я намекнул что сейчас уже как бы 2020 (два года назад это было) и можно и посовременней сделать, ну хотябы с базой а не с CSV.

Разраб прислушался и сделал. Базу прикрутили. Я обрадовался и подумал что теперь можно юзеров добавлять хотябы через DDL. Но я рано обрадовался.

Сервис при запуске просто как и до этого читал CSV и грузил его в базу и базу почему-то менять нельзя было. Так что юзеров и дальше надо было добавлять через csv.

0001, 0010, 0011, 0100, 0101, вышел зайчег погулядь
BSDLamer Хвостатый Carpal Tunnel09.04.22 22:02
BSDLamer
NEW 09.04.22 22:02 
в ответ AlexNek 22.03.22 22:57

один очень опытный разраб написал сервис для хранения паролей всяких там других майкросервисов. Этим сервисом он очень гордился. Деплоилось это все в AWS ECS. Много времени потратил на написание и отладку.

А потом ему показали что есть AWS KMS и прочие сервисы для этого. Такой вот случай

0001, 0010, 0011, 0100, 0101, вышел зайчег погулядь
AlexNek патриот09.04.22 22:05
AlexNek
NEW 09.04.22 22:05 
в ответ BSDLamer 09.04.22 21:50
Так что юзеров и дальше надо было добавлять через csv

странно, конечно, но у десктоп разработчиков определенное мышление.

Я вот раньше защищенное соединение для MySQL делал, что бы с десктопа в базу на сервере писать.

Сейчас видимо бы REST API попользовал. Но это всё для дома было.

alex445 коренной житель09.04.22 22:23
NEW 09.04.22 22:23 
в ответ AlexNek 09.04.22 22:05, Последний раз изменено 09.04.22 22:28 (alex445)
Я вот раньше защищенное соединение для MySQL делал, что бы с десктопа в базу на сервере писать.

А с VPN можно забить на разные защиты?


Сначала вы храните только пароли в зашифрованном виде.

Потом вы шифруете отдельные сообщения.

Потом вы шифруете весь канал связи.

Потом вы шифруете всю сеть и по сути возвращаетесь к началу - внутри сети требуется дополнительное шифрование.

BSDLamer Хвостатый Carpal Tunnel10.04.22 12:44
BSDLamer
NEW 10.04.22 12:44 
в ответ AlexNek 09.04.22 22:05

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


лазить в базу с десктопа модно было в 90ых

0001, 0010, 0011, 0100, 0101, вышел зайчег погулядь
AlexNek патриот10.04.22 13:01
AlexNek
NEW 10.04.22 13:01 
в ответ alex445 09.04.22 22:23
А с VPN можно забить на разные защиты?

Не думаю, что есть универсальное решение для всех случаев.

AlexNek патриот10.04.22 13:06
AlexNek
NEW 10.04.22 13:06 
в ответ BSDLamer 10.04.22 12:44
а как со здравым смыслом у таких разрабов.

гадать можно долго и нудно и не угадать. Видимо, какой то смысл они видят.

alex445 коренной житель10.04.22 13:11
NEW 10.04.22 13:11 
в ответ BSDLamer 10.04.22 12:44, Последний раз изменено 10.04.22 13:12 (alex445)

"Быстро-быстро!"


А чего у французов такой дизайн Википедии? Ладно там у тех, у кого иероглифы или арабские языки. Но у французов-то чего?

Murr патриот10.04.22 13:16
Murr
NEW 10.04.22 13:16 
в ответ BSDLamer 10.04.22 12:44

как со здравым смыслом у таких разрабов

-----

Обычно у них как раз все нормально... а вот у постановщиков задачи здравомыслие зачастую проблемное...

Или у тебя никогда не случалось ситуации когда тебе ставят задачу, ты ее делаешь... и как только сделал - ставят обратную задачу... при том что покрыть обе задачи стоит +15-20% времени...

Недавно где-то в параллельной ветке написал что отказался от одной из позиций после интервью - как раз нет желания попадать в такие ситуации...

BSDLamer Хвостатый Carpal Tunnel10.04.22 13:20
BSDLamer
NEW 10.04.22 13:20 
в ответ AlexNek 10.04.22 13:06

я конечно понимаю что каждый руководствуется какими-то своими причинами, но за 35 лет, можно конечно было определенные паттерны усвоить.

Но не спорю, у каждого свой взгляд на одну и ту же задачу. Вы попросили юзеров хранить ? Но вы ж не сказали как !

0001, 0010, 0011, 0100, 0101, вышел зайчег погулядь
BSDLamer Хвостатый Carpal Tunnel10.04.22 13:22
BSDLamer
NEW 10.04.22 13:22 
в ответ Murr 10.04.22 13:16

меня кстати всегда интересовали невнятны постановки задачи и еще больше меня интересует почему за них берутся. Ведь приходится выдумывать самому. Разве не легче уточнить ?

0001, 0010, 0011, 0100, 0101, вышел зайчег погулядь
alex445 коренной житель10.04.22 13:24
NEW 10.04.22 13:24 
в ответ BSDLamer 10.04.22 12:44

Вы лучше скажите, как Реддит умудряется уже больше года нагибать весь ваш этот веб и браузеры (по крайней мере основанные на Хромиуме)?

Reddit feed videos playing automatically despite autoplay turned off. : techsupport


Стоит в настройках выключить автоплей - везде на сайтах, форумах, где есть вставка видео с реддита, это дерьмо включается сразу после загрузки страницы и на всю громкость. И все настройки браузеров ему пофиг.


Где, в каком месте HTML-стандарта сайт может игнорить эти настройки? Или это дерьмо сидит в Хромиуме?

alex445 коренной житель10.04.22 13:26
NEW 10.04.22 13:26 
в ответ Murr 10.04.22 13:16, Последний раз изменено 10.04.22 13:30 (alex445)
как со здравым смыслом у таких разрабов
-----
Обычно у них как раз все нормально... а вот у постановщиков задачи здравомыслие зачастую проблемное...
Или у тебя никогда не случалось ситуации когда тебе ставят задачу, ты ее делаешь... и как только сделал - ставят обратную задачу... при том что покрыть обе задачи стоит +15-20% времени...
Недавно где-то в параллельной ветке написал что отказался от одной из позиций после интервью - как раз нет желания попадать в такие ситуации...

Так вы сами тут такие задачи на форуме ставите - каждая первая почти.


Запереть бы двух Мурров в одной комнате (предусмотрительно обклеив там стены чем-нибудь мягким) на несколько дней. И заставить их друг другу задачи ставить. А самим подглядывать в окошечки - чём там да как. Чувствую, они бы, мягко говоря, не сработались...


)))

Murr патриот10.04.22 13:43
Murr
NEW 10.04.22 13:43 
в ответ BSDLamer 10.04.22 13:22

Разве не легче уточнить ?

-----

Делаю задачку - сбор у клиента информации по заказу.

Подошло время хранить данные.

Уточняю:

- Где хранить? Как хранить?

- На диске. Как хочешь.

Леплю интерфейсы обмена, пишу имплементацию файлового ввода-вывода... добавляю сихронизацию двух и более девайсов.

Написал. Тестируем.

- Эээ... а тут бы нам лучше в базу...

- Ну так вам же железо будет нужно чтобы базу тянуть...

- Ну так мы ее тут на сервер поставим...

- Ну тогда нужен тонкий клиент...

- Нее, можно напрямую...

- А как коннектится от клиента? Там же инета может не быть и у нас файрволл...

- Не надо от клиента - тут локально все делать будем...

Т.е. когда все было написано просто поменяли всю задачу. В легкую...

Хорошо, что все было сделано более-менее грамотно - сделал имплементацию под базу и все заработало...

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


Murr патриот10.04.22 13:53
Murr
NEW 10.04.22 13:53 
в ответ alex445 10.04.22 13:24

И все настройки браузеров ему пофиг.

-----

Зато файрволл не пофиг...

Заорал сайт... пофиг почему... разок поправлю настройки и в следующий раз поправлю hosts...


сайт может игнорить эти настройки?

------

Мат.часть когда изучать будем?

https://www.w3schools.com/tags/tag_video.asp

Murr патриот10.04.22 13:58
Murr
NEW 10.04.22 13:58 
в ответ alex445 10.04.22 13:26

Чувствую

-----

Плохая у тебя чувствовалка - Мурр превосходно работает в именно таких условиях... спок Вот только второго Мурр'а найти проблемно...

И Мурр не любит ставить задачи юниорам - требуется пояснять слишком подробно и все одно сделают не так как сказано...

alex445 коренной житель10.04.22 15:39
NEW 10.04.22 15:39 
в ответ Murr 10.04.22 13:53

сайт может игнорить эти настройки?

------

Мат.часть когда изучать будем?

https://www.w3schools.com/tags/tag_video.asp

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


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

Главное, не подписываться нигде, что это вы сделали. А то любят некоторые приписки в файлах кода делать типа "Васян из Питера (С)", или там ирландские кошки какие. Найдут же, связут, и будут в подвале заставлять всё переписывать с утюгом наготове. )

alex445 коренной житель10.04.22 15:44
NEW 10.04.22 15:44 
в ответ Murr 10.04.22 13:43, Последний раз изменено 10.04.22 15:46 (alex445)
Т.е. когда все было написано просто поменяли всю задачу. В легкую...

А в чём проблема? Бабки же платят, или нет? Говорите, сколько эта переделка будет стоить времени и денег и вперёд - на расслабоне по готовым интерфейсам делать вторую имплементацию. А не в режиме "виноват-с, ваше сиятельство - щас в свои выходные быстро-с переделаю-с!". Вы вообще по контракту работаете, или семизнаки только на словах договариваются? А если по баблу кинут?


Вообще, джунские какие-то задачки. Максимум миддловские. Данные собрал, в базе сохранил. Ещё скажите, что клиент про "синхронизацию двух и более девайсов" ничего не говорил - это у вас уже тоже отсебятина. ))

Murr патриот10.04.22 16:03
Murr
NEW 10.04.22 16:03 
в ответ alex445 10.04.22 15:39

Вы лучше скажите

-----

Ссылку на доки получил? Вот и изучай...

MrSanders коренной житель10.04.22 16:52
NEW 10.04.22 16:52 
в ответ Murr 10.04.22 13:58, Последний раз изменено 10.04.22 17:11 (MrSanders)
И Мурр не любит ставить задачи юниорам - требуется пояснять слишком подробно и все одно сделают не так как сказано...

Как там говорят на богоспасаемой мериканщине... Ты сделал мой день! Мурр не любит ставить задачи, rofl.

Да Мурр тупо не умеет ставить задачи. Ни юниорам, никому. Сколько раз тут на форуме, в процессе обсуждения твоего вопроса выяснялось что ты спрашивал одно, имел в виду второе, а ответ услышать хотел на совсем третье?


У меня сейчас в одном проекте такой же Мурр. Орёт что все вокруг тупые, никому ничего нельзя поручить. Всё надо самому делать, а у него времени нет. Сам тикеты, не пишет. Не любит ставить задачи, да. Что же делает этот прекрасный мужчин? Он звонит какому-то разработчику (назовём его Вася) из команды, выносит ему мозг на тему "у нас всё жопа, срочно сделайте мне тут хорошо, а то у меня времени нет". Когда Вася говорит, мол, ну так, надо тикет сделать, отвечает "тебе надо, ты и делай" (красота, да? довкость рук и никакого мошенства, проблема моментально стала не его). Вася как может (в меру того, что он понял из получасовой истерики) пишет тикет. Мой Мурр, конечно же, не находит времени даже прочитать что же Вася написал в задании. У него нет времени! Он и так полчаса объяснял! Потом другой программист (Петя) делает то, что Вася описал в тикете. И тут наступает звёздный час моего Мурра. Он выбирает какой-нить митинг с максимальным количеством участников, и налетает коршуном на Петю. Завывая какой Петя дурак, и как ему, Мурру, тяжело работать с такими дебилами. Всё, ну вот вообще всё, сделано не так как надо! На возражения "что в тикете написано, то и было реализовано" верещит что надо же думать головой, если Вася такой дурак что в тикете просит сделать глупость, надо же это понимать и делать то, что правильно. А правильно что? То что хочет Мурр. А как узнать что он хочет? А кто его знает. Жопой чувствовать. В результате Петя посылает Мурра и его команду куда подальше. Вася тоже не очень-то доволен огребать. Мурр бежит к руководству и требует новых, умных разработчиков.


Руководство задолбалось текучкой в команде, и послало разбираться. С формальным поводом, мол, что-то качество кода падает-с, никто не понимает что делается и тесты не пишет. В общем, я запретил кому-либо писать тикеты, если запрос на изменение пришёл от него. Последний тикет он написал сам. Да. Аж два предложения. Уровня "тут всё работает не так как надо, сделай как надо". Собрали народ на рефайнмент и котёнок ТРИ часа отвечал на вопросы. И правил тикет. Выл, визжал, обещал пожаловаться в Спортлото. Пока всем участникам не стало понятно что же наш гений хочет. А хотел он совсем не того, что изначально написал (кото-то мне это снова напоминает). Посмотрим, как он следующий тикет опишет...

MrSanders коренной житель10.04.22 17:09
NEW 10.04.22 17:09 
в ответ BSDLamer 10.04.22 13:22
меня кстати всегда интересовали невнятны постановки задачи и еще больше меня интересует почему за них берутся. Ведь приходится выдумывать самому. Разве не легче уточнить ?

А вот теперь давайте разберёмся. Не всё так просто, как есть на самом деле. :)

Случается разное. В идеале, конечно, что-то непонятно - спроси на рефайнменте, поправь задачу. А вот в реальности... Я бы назвал две основные причины, почему не уточняют. Обе - человеческие.

1. Постановщик задачи. Не может / не хочет принимать решения. Описывает задачи максимально обтекаемо. Он или начинает выносить мозг при попытке задать любой уточняющий вопрос "ну это же ясно любому", "такие мелкие уточнения нам не важны", "у нас нет времени это обсуждать", или заявляет что "это не важно" (ага, конечно), или говорит "мне надо уточнить". И уточняет неделю-две-месяц. Что может сильно бесить, особенно когда вопрос был вроде "а мы в формочку хотим сначала поле для имени или для фамилии".

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

2. Разработчик, конечно. Он знает как надо. Зачем ему уточнять? А то ещё уточнишь, а тебе скажут делать не так, как ты хотел.

alex445 коренной житель10.04.22 17:13
NEW 10.04.22 17:13 
в ответ Murr 10.04.22 16:03, Последний раз изменено 10.04.22 17:21 (alex445)

Как мне поможет ссылка на тег, если я в браузере включил настройку, а она не работает?


Глянул разметку - что там. Вобще, вставка поста Реддита через два вложенных один в другой iframe. Внутри последнего лежит тег видео с такими настройками:


<video

autoplay=""

playsinline="true"

webkit-playsinline="true"

preload="auto"

src="blob:https://old.reddit.com/...">


И как эти настройки позволяеют обойти опцию в браузере "выключить автоплей"? Причём у многих браузеров сразу - не один мой.


Единственное, что думается - iframe это инлайновый фрейм. А в видео есть настройка для автоплея и для инлайнового автоплея. А в браузерах такой настройки нет - ура, кладём на желания юзеров и силком пичкаем их автоплеем с максимальной громкостью! Знай наших, реддитских! И разработчики браузеров точно так же клали на пользователей - ну в настройке же не сказано, что будет блокироваться инлайновый автоплей. А ещё нет настройки на вебкитовский инлайновый автоплей. А ещё прелоад - авто. Т.е. сидишь на мобильном инете, а там сто мегов, аль гиг - сасай, лох. И пофиг, что ты забил на наш сайт и больше туда не ходишь - мы тебя через вставки фреймами везде достанем. Обычные юзеры не знают этих тонкостей, и думают, что это им другие сайты трафик выжирают и звуком глушат.

BSDLamer Хвостатый Carpal Tunnel10.04.22 17:22
BSDLamer
NEW 10.04.22 17:22 
в ответ MrSanders 10.04.22 17:09

согласен и с 1. и с 2. и наверное добавил бы


3. в 100 раз задача ставится невнятно, надоело бегать и уточнять, сделаю как считаю нужным, чтоб в след раз уточняли что вам хочется.


но иногда бывает реальный сюр, как с юзерами в csv

0001, 0010, 0011, 0100, 0101, вышел зайчег погулядь
alex445 коренной житель10.04.22 17:29
NEW 10.04.22 17:29 
в ответ BSDLamer 10.04.22 17:22, Последний раз изменено 10.04.22 19:53 (alex445)
согласен и с 1. и с 2. и наверное добавил бы


3. в 100 раз задача ставится невнятно, надоело бегать и уточнять, сделаю как считаю нужным, чтоб в след раз уточняли что вам хочется.

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

Murr патриот11.04.22 01:12
Murr
NEW 11.04.22 01:12 
в ответ MrSanders 10.04.22 16:52

тупо не умеет

-----

Умеет не только ставить, но и добиваться выполнения именно в том виде в котором требуется.

Но! Объяснять - юниору у которого еще синтаксис не отошел - совершенно нет желания... если только работа не состоит именно в постановке задачи юниору и объяснению всех деталей реализации. Муторно, долго, с бесконечными повторами... нее, не люблю, не подписываюсь... но если придется - сделаю...


не находит времени

------

У твоего Мурра в рабочих обязанностях стоит прочитать что Вася написал в тиките?

У твоего Мурра в рабочих обязанностях есть наблюдение за имплементацией чего-то там Петей?

Или у него своего кодинга столько, что ни об каком выделении времени на организации процесса и говорить не приходится?

Ну поставь условного Васю или Петю порулить - может у него как раз талант организатора прорежется и он будет все успевать...


Жопой чувствовать.

------

Не поверишь - люблю работать в командах где то что надо делать "чуют жопОм"... т.е. разработчики примерно равной квалификации и равным интересом к проекту... и серьезные проблемы проблемы решаются диалогом вида

- тут не так, надо так...

- нет, если так вот то там будет не то, надо так...

- да, так лучше там, но вона там не будет, можно так..

- да, хорошо, делаем...

Ничего не понятно? Так на посторонних и не рассчитано!!! В команде - все в теме что делается и "контекст" добавлять не нужно...

3-5 минут на все и погнали... об 3 часах обсуждения вообще речи не идет - таски по 15 минут...

Жаль, что редко получается работать в таких командах.

Murr патриот11.04.22 01:38
Murr
NEW 11.04.22 01:38 
в ответ alex445 10.04.22 17:13

Как мне поможет

------

Как именно тебе - не знаю.

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


А в браузерах такой настройки нет

-----

Документацию по ссылкам все же стоит читать. До полного понимания.


юзеры не знают этих тонкостей

------

У человека три смарта и обычный телефон. Еще - таблеты и лапти.

На одном из смартов висит банк.

Человеку сказано - настроено один раз - ничего не менять, никуда не лазить, ничего не инсталить.

Пару раз человек ловился на инсталляции каких-то хрененей...

На все замечания что так делать не надо человек отвечает - мне ЭТО надо...

И вот сегодня человек прибежал с криком - Я попался! У меня много вирусов!!! Мне теперь надо ПЛАТИТЬ!!! - и показывает подписку на VPN.

Об том, что там будет жопа с банком - последний раз на восстановление ушло более двух месяцев - человек просто еще не думает...

А ты об каком-то трафике волнуешься...

alex445 коренной житель11.04.22 01:43
NEW 11.04.22 01:43 
в ответ Murr 11.04.22 01:12, Последний раз изменено 11.04.22 01:51 (alex445)
3-5 минут на все и погнали... об 3 часах обсуждения вообще речи не идет - таски по 15 минут...

Галерная потогонка.


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

alex445 коренной житель11.04.22 01:49
NEW 11.04.22 01:49 
в ответ Murr 11.04.22 01:38, Последний раз изменено 11.04.22 01:49 (alex445)
А ты об каком-то трафике волнуешься...

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

Murr патриот11.04.22 02:00
Murr
NEW 11.04.22 02:00 
в ответ MrSanders 10.04.22 17:09

1. Постановщик задачи. Не может / не хочет принимать решения. Описывает задачи максимально обтекаемо.

------

Как вариант - описывает на уровне своего знания/понимания задачи.


Как то дали мне сделать базу.

По постановке задачи - можно вычленить таблицы и реляции.

Сколько и каких полей (кроме первичных и вторичных ключей) - нигде не определено.
Написал базу - таблицы, реляции... и поле - Дата типа Мемо/Блоб...

Начали меня песочить... ну и выяснилось, что инфы по полям - нет...
Спрашивают у постановщика - а он тоже не знает - надо уточнять у заказчика...

А с заказчиком работает другой человек весьма далекий от нужд заказчика... и ИТ.

Самое смешное - заказчик - вообще ничего не понимает - Ворд и мыло... и все...


Решилось все через пару месяцев - привезли всех к заказчику и провели по всей

шаражке с пояснениями что, где и как делается - появилось представление об том

что там есть и появилась возможность задавать осмысленные вопросы... или додумывать

самостоятельно что и как делать.

Murr патриот11.04.22 02:32
Murr
NEW 11.04.22 02:32 
в ответ alex445 11.04.22 01:43

А потом всплывает баг

-----

И обрабатывается в том же режиме. Все вполне нормально получается.


Проблемы начинаются когда в команде появляются юниоры - им недостаточно приведенного обсуждения - у них нет "контекста" и его надо давать... постепенно, дозированно и с контролем восприятия... а это - время... и не 3-4 минуты... а ближе к упомянутым 3 часам на человека в день...

По факту - взяв 3-4-х юниоров в команду надо выключать Мурра из кодинга - задергают, выхлоп в кодинге будет почти нулевым... миддлов на Мурра можно повесить с полтора десятка... но тоже придется заниматься только ими...

alex445 коренной житель11.04.22 09:02
NEW 11.04.22 09:02 
в ответ Murr 11.04.22 02:32, Последний раз изменено 11.04.22 09:03 (alex445)
Проблемы начинаются когда в команде появляются юниоры - им недостаточно приведенного обсуждения - у них нет "контекста" и его надо давать... постепенно, дозированно и с контролем восприятия... а это - время... и не 3-4 минуты... а ближе к упомянутым 3 часам на человека в день...
По факту - взяв 3-4-х юниоров в команду надо выключать Мурра из кодинга - задергают, выхлоп в кодинге будет почти нулевым... миддлов на Мурра можно повесить с полтора десятка... но тоже придется заниматься только ими...

И это нормально. Хотя мне тоже не нравится.

alex445 коренной житель11.04.22 10:15
NEW 11.04.22 10:15 
в ответ Murr 11.04.22 02:32, Последний раз изменено 11.04.22 10:16 (alex445)
А потом всплывает баг
-----
И обрабатывается в том же режиме. Все вполне нормально получается.

Да не этот детский баг, который в нормальном режиме обрабатывается. А тот, ради которого держат на складе запас клав и мониторов для оперативной замены.

MrSanders коренной житель11.04.22 12:52
NEW 11.04.22 12:52 
в ответ Murr 11.04.22 02:00

1. Постановщик задачи. Не может / не хочет принимать решения. Описывает задачи максимально обтекаемо.

------

Как вариант - описывает на уровне своего знания/понимания задачи.

Это всегда так. Описывать не на "уровне своего знания" могут не только лишь все, мало кто может это делать. (ц)

Что делает адекватный постановщик задач, когда возникает технический вопрос, на который он не может ответить? Говорит это. Ротом. Мол, ребята, я не знаю что на это ответить. И или

а. просит предложить решения, которые видят разработчики, описать плюсы и минусы и на основании этого всё же принимает решение "давайте сделаем А".

б. говорит что проконсультируется с архитектором / ПО / знакомым который такое уже делал такое и на следующее обсуждение придёт с ответом (пригласит специалиста, и он даст ответ).

Для такого надо хотеть брать на себя ответственность и принимать решения. Минимум 2/3 этого делать не хотят, и формулируют требования специально размытыми. Чтобы можно было любой косяк спихнуть на разработчиков. Есть разработчики, которым тоже нравятся размытые требования. Потому что можно нахреновертить что угодно, оправдывая это "а так в требованиях написано".

Murr патриот11.04.22 15:51
Murr
NEW 11.04.22 15:51 
в ответ MrSanders 11.04.22 12:52

Говорит это. Ротом.

-----

Я думал что опытный всегда писает. На хардкопи... безум


Это всегда так.

------

Пыхх...

Инструкция по применению Ложки Столовой...

Пишется на том уровне который требуется исполнителю для выполнения задания.

Далеко не всегда это уровень его понимания задачи .


проконсультируется с архитектором

------

А толку?

Описанная выше ситуация - она не выдуманная.

Кодеров завязали на постановщика, постановщика - на контактное лицо, а лицо контактировало с никем у заказчика.

Нормальный "испорченный телефон"

Пока не ознакомили кодеров с предметной областью - ничего не двигалось...

alex445 коренной житель25.07.22 10:24
NEW 25.07.22 10:24 
в ответ Murr 11.04.22 15:51, Последний раз изменено 25.07.22 10:26 (alex445)

Кто-нибудь может объяснить, зачем делать такое объявление класса


class A<T> where T : B, new()

{

public T MyProperty

}


если можно сделать сразу свойство типа B


class A

{

public B MyProperty

}


Только для того, чтобы потребовать, чтобы у типа B был конструктор без параметров?

alex445 коренной житель25.07.22 10:29
NEW 25.07.22 10:29 
в ответ alex445 25.07.22 10:24, Последний раз изменено 25.07.22 10:32 (alex445)

Это как написать


class A<T1, T2, T3>

where T1 : Int32

where T2 : String

where T3 : String

{

public T1 Age

public T2 Name

public T3 Surname

}


Круто же!

Это только цветочки. А если ягодки добавить, то становишься сразу незаменимым - хрен кто разберётся. И обфускатор не нужен. Комментов ко всему этому - что и зачем - тоже нет, кстати.

Программист коренной житель25.07.22 17:08
NEW 25.07.22 17:08 
в ответ alex445 25.07.22 10:24
Только для того, чтобы потребовать, чтобы у типа B был конструктор без параметров?

А этого мало? :)

AlexNek патриот25.07.22 18:28
AlexNek
NEW 25.07.22 18:28 
в ответ alex445 25.07.22 10:24
если можно сделать сразу свойство типа B

А в дополнение типа С, Д, Е. Вопрос был бы а нужны ли мне в данной реализации "генерики"?

alex445 коренной житель25.07.22 22:17
NEW 25.07.22 22:17 
в ответ Программист 25.07.22 17:08
Только для того, чтобы потребовать, чтобы у типа B был конструктор без параметров?

А этого мало? :)

Это слишком много. Настолько, что можно обойтись и без этого.

alex445 коренной житель25.07.22 22:34
NEW 25.07.22 22:34 
в ответ AlexNek 25.07.22 18:28
А в дополнение типа С, Д, Е. Вопрос был бы а нужны ли мне в данной реализации "генерики"?

Если ему нужен конструктор без параметров, значит он создаёт экземпляр объекта через этот конструктор. Если такого конструктора нет - при компиляции появится ошибка на месте попытки создания объекта, и придётся идти и делать конструктор без параметров для нужного типа. Но она же появится и если написать как он - через дженерик. Но через дженерик более запутанно.

Wanderer_ завсегдатай25.07.22 23:56
NEW 25.07.22 23:56 
в ответ alex445 25.07.22 10:24
class A where T : B, new(){public T MyProperty}



"В" это обычно или интефейс или абстрактный класс. Подставляя вместо "Т" унаследованные классы от "В" при создании обьекта от класса "А", можно реализовать различный функционал.

Такая структура используется для инкапсуляции, но обычно обьявляют приватным обьектом. .

Программист коренной житель26.07.22 07:32
NEW 26.07.22 07:32 
в ответ alex445 25.07.22 22:17
Это слишком много. Настолько, что можно обойтись и без этого.

Ну если добавили такое ограничение, значит оно для чего-то нужно :) Например где-то в недрах этого класса создается объект типа B, не важно десериализацией или Activator'ом.

alex445 коренной житель26.07.22 10:35
NEW 26.07.22 10:35 
в ответ Программист 26.07.22 07:32
Ну если добавили такое ограничение, значит оно для чего-то нужно :) Например где-то в недрах этого класса создается объект типа B, не важно десериализацией или Activator'ом.

Как я написал, что если не ставить такое ограничение для параметра типа, то ошибка компиляции возникнет при попытке создания такого объекта внутри этого класса, если конструктора без параметров нет. А если ставить такое ограничение - то при попытке создать экземпляр этого класса с конкретным типом в качестве параметра типа. Т.е. в любом случае ошибка возникнет при компиляции - т.е. при написании кода, т.к. у нас компилятор на лету это проверяет. Но вариант с ограничениями параметров типов более запутанный.

alex445 коренной житель26.07.22 10:37
NEW 26.07.22 10:37 
в ответ alex445 26.07.22 10:35, Последний раз изменено 26.07.22 10:40 (alex445)

Вот ещё один "подарок". В базе данных стоит ограничение на поле nvarchar(40). Где-то в глубине бизнес логики при логировании проверяется длина поля на 40 символов (захардкодено числом), и если больше - обрезается. Я так понимаю, что где-то эта строка может оказаться и больше 40 символов. Почему ещё при её создании она не валидируется на длину? А если в обрезанной части важная инфа? А нельзя было сделать так, чтобы эти ограничения на длину где-то в одном месте сидели и оттуда брались, а не были разбросаны захардкоденным способом по всем частям проекта?


Блин, да там дохрена таких полей. Кусок с логированием - магические чиселки без комментов 40, 12, 36 и т.д. Нумерология! Пока в БД не заглянешь в эти поля, не поймёшь, что это такое. Чел, который писал логирование, похоже тупо со схемы БД руками копировал и никак не обозначил, что они означают.

Программист коренной житель26.07.22 10:51
NEW 26.07.22 10:51 
в ответ alex445 26.07.22 10:35
Как я написал, что если не ставить такое ограничение для параметра типа, то ошибка компиляции возникнет при попытке создания такого объекта внутри этого класса, если конструктора без параметров нет.

Нет, ошибки на этапе компиляции не будет. Исключение будет в рантайм.


Можешь проверить:

    public class TestType
    {
        public int Val { get; private set; }
        public TestType(int val)
        {
            Val = val;
        }
    }

...

Activator.CreateInstance(typeof(TestType));


alex445 коренной житель26.07.22 11:07
NEW 26.07.22 11:07 
в ответ Программист 26.07.22 10:51, Последний раз изменено 26.07.22 11:23 (alex445)

Это подходит только для Активатора и других подобных способов создания объектов в процессе выполнения программы? Т.е. если я работую "обычным" способом - создаю объекты не через динамические механизмы, то всё это мне не нужно?


Вот тут челы из XML их создают (в моём проекте тоже этим балуются). Правда, непонятно, почему не использовать банальную сериализацию? Т.е. они откуда-то получают описание типа в XML, но доступа к C# коду описания этого типа не имеют? Супер-секретность, или раздолбайство с невозможностью пошарить библиотеки с описанием типов?

alex445 коренной житель26.07.22 11:08
NEW 26.07.22 11:08 
в ответ alex445 26.07.22 11:07, Последний раз изменено 26.07.22 11:18 (alex445)

А вот тут чел пишет, что если нет доступа к приватным конструкторам, то Активатор позволяет его заиметь. Зачем тогда вся эта инкапсуляция, если я могу её легко обойти?

Программист коренной житель26.07.22 11:39
NEW 26.07.22 11:39 
в ответ alex445 26.07.22 11:07
Это подходит только для Активатора и других подобных способов создания объектов в процессе выполнения программы?

Я с ходу вспомню только 3 способа динамического создания объектов: активатор, взять конструктор через рефлершен (по сути тот же активатор) и десериализация. Во всех 3-х случаях ошибка не будет поймана на стадии компилирования.


Т.е. если я работую "обычным" способом - создаю объекты не через динамические механизмы, то всё это мне не нужно?

Совершенно верно.


Правда, непонятно, почему не использовать банальную сериализацию? Т.е. они откуда-то получают описание типа в XML, но доступа к C# коду описания этого типа не имеют? Супер-секретность, или раздолбайство с невозможностью пошарить библиотеки с описанием типов?

Может быть несколько причин для ручного чтения. Например, использования аттрибута KnownTypeAttribute добавляет в XML вспомогательные метаданные, которые по каким-то причинам нежелательны.

Программист коренной житель26.07.22 11:53
NEW 26.07.22 11:53 
в ответ alex445 26.07.22 11:08
Зачем тогда вся эта инкапсуляция, если я могу её легко обойти?

Перед тем как выстрелить себе в колено нужно изучить все детали :)

alex445 коренной житель26.07.22 13:42
NEW 26.07.22 13:42 
в ответ Программист 26.07.22 11:53

В чём прикол делать приватный словарь, а потом публичные методы доступа к нему GetValue и SetValue, которые просто достают данные из словаря и помещают их в него?

alex445 коренной житель26.07.22 14:00
NEW 26.07.22 14:00 
в ответ alex445 26.07.22 13:42, Последний раз изменено 26.07.22 14:09 (alex445)

Ещё такой подарок. В одном месте данное называется FileName. Потом оно передаётся в другое место, и там оно уже - FormName. Далее в третьем месте присваивается - уже SessionState (не спрашивайте про логику названия). Чтобы понять, что состояние сессии в поле таблицы в БД - это на самом деле имя файла формы в проекте - надо перелопатить кучу кода и отследить кучу присваиваний.


Или вот циклическое владение друг другом. Форма имеет ссылку на сессию, а сессия - на форму. Связь 1 к 1. Нахрена?!


И до кучи - специально выделенные строковые поля для имени формы в объекте сессии, и для состояния сессии в объекте формы. С учётом вышесказаного...


Или вот у нас в классе формы, которая хранит состояние сессии, ещё добавлен объект транзакции в БД. А объекту транзакции в БД передаётся состояние сессии, которое имеет ссылку на форму. Короче, эти три типа - транзакция, сессия, форма - связаны друг с другом и имеют ссылки друг на друга. А теперь нужно разделить эту байду и перенести на другой GUI. Конечно, всё не просто так - там ещё кучка базовых классов добавлена для каждого типа, интерфейсики на каждый тип - всё по фен-шую. Естественно, ссылки друг на друга тоже заложены ещё на этапе базовых классов и интерфейсов. Правда, процентов 90 этих интерфейсов имеют единственную реализацию. Ну и требование конструктора без параметров для динамического создания типов, и всё такое.


Как можно в одном месте сделать по фен-шую, а в другом - самые гразные и разнузданные антипаттерны применять?

Программист коренной житель26.07.22 14:20
NEW 26.07.22 14:20 
в ответ alex445 26.07.22 13:42
В чём прикол делать приватный словарь, а потом публичные методы доступа к нему GetValue и SetValue, которые просто достают данные из словаря и помещают их в него?

Тут может быть 3 варианта:

1) написавший это пришел из C++ и на момент написания еще не перестроился :)

2) GetValue и SetValue изменяют стандартное поведение словаря. Например GetValue проверяет, есть ли ключ и возвращает null, если ключа нет (стандартное поведение - кинуть исключение KeyNotFoundException) или при SetValue запретить перезаписывание уже имеющегося ключа.

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

Программист коренной житель26.07.22 14:28
NEW 26.07.22 14:28 
в ответ alex445 26.07.22 14:00
Ещё такой подарок. В одном месте данное называется FileName. Потом оно передаётся в другое место, и там оно уже - FormName. Далее в третьем месте присваивается - уже SessionState (не спрашивайте про логику названия). Чтобы понять, что состояние сессии в поле таблицы в БД - это на самом деле имя файла формы в проекте - надо перелопатить кучу кода и отследить кучу присваиваний.

Скорее всего это писали несколько разработчиков и/или в разное время. Поэтому использовали разную терминологию. Я бы сказал, что это косяк проектирования. Или даже побочный эффект от отсутствия проектирования :)


Или вот циклическое владение друг другом. Форма имеет ссылку на сессию, а сессия - на форму. Связь 1 к 1. Нахрена?!

Для более удобного доступа к данным. Такое очень часто встречается. Ничего ужасного в этом нет. Типичные юз-кейсы: 1) если сессия стала невалидной, то надо закрыть окно. Для этого из сессии должна быть ссылка на окно. 2) Окно должно предупредить о скором истечении времени сессии, для это окно должно иметь ссылку на сессию :)


alex445 коренной житель26.07.22 14:47
NEW 26.07.22 14:47 
в ответ Программист 26.07.22 14:28, Последний раз изменено 26.07.22 14:48 (alex445)


Или вот циклическое владение друг другом. Форма имеет ссылку на сессию, а сессия - на форму. Связь 1 к 1. Нахрена?!
Для более удобного доступа к данным. Такое очень часто встречается. Ничего ужасного в этом нет. Типичные юз-кейсы: 1) если сессия стала невалидной, то надо закрыть окно. Для этого из сессии должна быть ссылка на окно. 2) Окно должно предупредить о скором истечении времени сессии, для это окно должно иметь ссылку на сессию :)

Тогда по сути это один объект. Не лучше собрать всё это под одним классом и использовать как поля (т.е. поле формы и поле сессии, а не поля этих классов в одном классе), чем циклы владения создавать? Я привык к иерархии наследования или владения, а не к циклическим зависимостям. Где потоки управления, кто на ком стоял? И если в наследовании циклы запретили по дизайну, то во владении говнокодеры могут себе насоздавать сиюминутных "удобных" юз-кейсов, что потом не разберёшься.

alex445 коренной житель26.07.22 14:49
NEW 26.07.22 14:49 
в ответ alex445 26.07.22 14:47

А как убить объект с циклическим владением? Ну, с точки зрения деструктора?

alex445 коренной житель26.07.22 15:05
NEW 26.07.22 15:05 
в ответ Программист 26.07.22 14:20, Последний раз изменено 26.07.22 15:12 (alex445)
В чём прикол делать приватный словарь, а потом публичные методы доступа к нему GetValue и SetValue, которые просто достают данные из словаря и помещают их в него?
Тут может быть 3 варианта:
1) написавший это пришел из C++ и на момент написания еще не перестроился :)
2) GetValue и SetValue изменяют стандартное поведение словаря. Например GetValue проверяет, есть ли ключ и возвращает null, если ключа нет (стандартное поведение - кинуть исключение KeyNotFoundException) или при SetValue запретить перезаписывание уже имеющегося ключа.
3) Скрыть используемые контейнер. Например для того, чтобы можно было легко заменить контейнер без изменения внешнего интерфейса.

Щас глянул - при добавлении значения SetValue проверяет, есть ли уже такой ключ, и если да, то меняет значение по ключу. Если нет - добавляет новый ключ и значение через метод Add словаря. Стандартный словарь кидает исключение, если ключ уже есть. Однако, точно такого же поведения можно добиться, просто используя индекс - он тоже добавляет ключ и значение, если ключа нет, и обновляет значение, если ключ есть. Т.е. программист, похоже, просто не знал о таком свойстве индекса словаря, иначе бы не стал заморачиваться с добавлением значения через метод Add, а не через индекс.


Вот, посмотрел - эта особенность индекса словаря существовала ещё минимум со времён Дотнета 2.0

6 - https://docs.microsoft.com/en-us/dotnet/api/system.collect...

2.0 - https://docs.microsoft.com/en-us/dotnet/api/system.collect...


Метод GetValue же просто берёт значение по индексу, никак это не обрабатывая - т.е. если индекса (ключа) нет, то словарь кидает исключение, а класс-обёртка над словарём с ним ничего не делает.


Т.е. вся портянка GetValue-SetValue просто переписывает логику индекса словаря. А ещё это же и в интерфейсе сделано. А к нему - тесты. И тесты тупо тестируют дефолтный словарь.


Остаётся вариант со скрытием имплементации. Но здесь явно пахнет преждевременными оптимизациями. Я думаю, остаётся "программист не знал" как самый вероятный вариант.

Программист коренной житель26.07.22 15:30
NEW 26.07.22 15:30 
в ответ alex445 26.07.22 14:47
Тогда по сути это один объект.

Нет, у каждого класса есть своя зона ответственности.


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

Поздравляю, ты изобрел божественный объект.


Я привык к иерархии наследования или владения, а не к циклическим зависимостям.

Я так понимаю, что двунаправленных списков и других моделей ты никогда не встречал :) Ну это скорее твоя беда.

MrSanders коренной житель26.07.22 15:31
NEW 26.07.22 15:31 
в ответ Программист 26.07.22 14:28
Я бы сказал, что это косяк проектирования. Или даже побочный эффект от отсутствия проектирования :)

Как только в игре возникает БД, количество вариантов увеличивается... Раньше в БД в SessionState действительно хранилось состояние сессии. Какое-то. Потом прорефакторили и поняли что оно нам нафиг не надо. А нужно имя формы. Но переименовывать столбец в БД... Это же геморрой! Надо во всех базах переименовать... А если ещё за БД отвечает другой отдел, которому для любого изменения надо заполнить 30-и страничный формуляр... Да ну нафиг! И остаётся поле SessionState. Менеджмент доволен, база стабильна! :)

Только что из поля GESCHSPEZ выуживал ID адреса для контакта. Который в коде везде ansprechpartnerId. Так и живём.

Программист коренной житель26.07.22 15:34
NEW 26.07.22 15:34 
в ответ alex445 26.07.22 14:49
А как убить объект с циклическим владением? Ну, с точки зрения деструктора?

Как сделаешь, так и будет. За это программистам и платят зарплату ;)

Программист коренной житель26.07.22 15:36
NEW 26.07.22 15:36 
в ответ alex445 26.07.22 15:05
Я думаю, остаётся "программист не знал" как самый вероятный вариант.

Или это было написано до .Net 2.0 или код был перенесен из плюсов.

Не надо думать, что другой программист чего-то не знал. Возможно, чего-то не знаешь ты ;)

alex445 коренной житель26.07.22 17:13
NEW 26.07.22 17:13 
в ответ Программист 26.07.22 15:30
Тогда по сути это один объект.

Нет, у каждого класса есть своя зона ответственности.


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

Поздравляю, ты изобрел божественный объект.

И то, и то - божественный объект. Оттого, что вы разобьёте один класс на два, но очень связанных, от божественности вы не избавитесь. Зато усложнится понимание и управление этими сиамскими близнецами.


Я привык к иерархии наследования или владения, а не к циклическим зависимостям.

Я так понимаю, что двунаправленных списков и других моделей ты никогда не встречал :) Ну это скорее твоя беда.

Может и не встречал, но это явно не тот случай. Тут форма связана с сессией и с транзакцией в БД - явно без списков обошлись. Чел просто захотел всю логику хранить в одном месте, но строк кода выходило многовато (несколько тысяч), поэтому накропал с пару десятков классов и интерфейсов - по несколько сотен строк, всё равно тесно их связав. Теперь, чтобы понять, что делают эти сиамские близнецы, я должен держать открытыми эти же пару десятков вкладок, что не укладывается ни на моём экране, ни в моей голове. Даже диаграмма классов выглядит как паутина.

alex445 коренной житель26.07.22 17:17
NEW 26.07.22 17:17 
в ответ alex445 26.07.22 17:13, Последний раз изменено 26.07.22 17:19 (alex445)
Чел просто захотел всю логику хранить в одном месте, но строк кода выходило многовато (несколько тысяч), поэтому накропал с пару десятков классов и интерфейсов - по несколько сотен строк, всё равно тесно их связав.

Ещё посмотрел - он их ещё и по разным проектам разнёс, а проекты - по разным частям приложения (типа апп сервер, веб сайт и прочее). И друг без друга это не работает - т.е. прокты все тоже друг на друга ссылаются.


Это классический махровый монолит, который зачем-то разбили на множество осколков, осколки разнесли по разным углам-доменам, чтобы потом снова собрать их, склеив часть соплями странных наследований, а другую часть "соединив" на расстоянии через интероп, активацию классов динамическим путём и прочую магию.

AlexNek патриот26.07.22 17:58
AlexNek
NEW 26.07.22 17:58 
в ответ alex445 26.07.22 15:05
точно такого же поведения можно добиться, просто используя индекс

ну вот видишь две строки:

obj.Add(key,value);

obj[key] = value;

Что делает каждая из них чисто по внешнему виду?

Murr патриот26.07.22 18:54
Murr
NEW 26.07.22 18:54 
в ответ alex445 26.07.22 10:37

Почему ещё при её создании она не валидируется на длину?

----

А как?

Ну создали стринг... проверили - все Ок.

Ну добавили что-то полученное где-то... строку в процессе 5 раз пересоздали...

Будем проверять? Или ну его нах... в смысле нарушать инкапсуляцию нах...

Срыв покровов патриот26.07.22 19:34
NEW 26.07.22 19:34 
в ответ alex445 26.07.22 13:42
В чём прикол делать приватный словарь, а потом публичные методы доступа к нему GetValue и SetValue

чтобы словарь не обнулить?

P.S. Не знал про доступ по индексу с квадратными скобками. Спасибо.

Программист коренной житель26.07.22 21:14
NEW 26.07.22 21:14 
в ответ alex445 26.07.22 17:13
И то, и то - божественный объект.

Нет. Читай, что такое божественный объект.


Оттого, что вы разобьёте один класс на два, но очень связанных, от божественности вы не избавитесь.

Сильная связь - композиция. Слабая связь - агрегация. Что ты понимаешь под сильной и слабой связью мне не ведомо. Боюсь, что тебе тоже :)


Тут форма связана с сессией и с транзакцией в БД - явно без списков обошлись.

Список - это просто пример модели. Но если ты посмотришь на любую реляционную БД, то увидишь, что таблицы связаны между собой какими-то ключами.

Ну скажем Клиент через ID связан с каким-то Адресом. Т.е. имея Клиента ты всегда можешь получить адрес и имея адрес всегда можешь получить Клиента (или несколько).

Т.е. интерфейсы можно записать так:

public interface ICustomer
{
   int Id { get; }
   string FirstName { get; }
   string LastName { get; }
   IAddress Address { get; }
}

public interface IAddress
{
    string City { get; }
    string Zip { get; }
    string Street { get; }
    string HouseNr {get; }
    IEnumerable<ICustomer> Customers { get; }
}

Такая конструкция вполне имеет право на жизнь. Никакого криминала тут нет.


alex445 коренной житель27.07.22 09:45
NEW 27.07.22 09:45 
в ответ AlexNek 26.07.22 17:58

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

ну вот видишь две строки:

obj.Add(key,value);

obj[key] = value;

Что делает каждая из них чисто по внешнему виду?

Вы апеллируете к тому, что программист может не знать особенности работы индекса словаря, а особенности работы его метода Add ему хорошо известны?

alex445 коренной житель27.07.22 09:51
NEW 27.07.22 09:51 
в ответ Murr 26.07.22 18:54

Почему ещё при её создании она не валидируется на длину?

----

А как?

Ну создали стринг... проверили - все Ок.

Ну добавили что-то полученное где-то... строку в процессе 5 раз пересоздали...

Будем проверять? Или ну его нах... в смысле нарушать инкапсуляцию нах...

Ну согласен. Или городить свой класс строк, которые бы имели встроенное ограничение (пусть задаваемое).


Но с этим ладно. А вот как сделать, чтобы к валидирующим значениям (типа макс. длина, границы чисел) можно было легко иметь доступ в любом месте приложения? В том числе в БД. Эти магические числа (string <= 20) в разных частях приложения - явно не то.


Похоже, нужна генерация. Где-то хранить данные по валидации, затем по ним генерировать таблицы БД (подгоняя туда ограничения по длинам, диапазонам и прочему), затем по ним же генерировать атрибуты для классов (которые тоже в свою очередь генерировать). Если без генерации, то минимум для каждой технологии придётся иметь хранилище валидирующих данных. Т.е. написал БД, затем пишешь модель на языке программирования, а валидацию в тех же атрибутах - просто копируешь из данных БД руками.

alex445 коренной житель27.07.22 09:55
NEW 27.07.22 09:55 
в ответ Срыв покровов 26.07.22 19:34, Последний раз изменено 27.07.22 09:57 (alex445)
В чём прикол делать приватный словарь, а потом публичные методы доступа к нему GetValue и SetValue
чтобы словарь не обнулить?
P.S. Не знал про доступ по индексу с квадратными скобками. Спасибо.

Обнулить словарь? Так его можно обнулить и цепочкой вызовов этих методов доступа.


Я максимум что могу предположить - абстрагирование деталей хранения от пользователя. Но как уже писал, судя по реализации - больше похоже на преждевременную оптимизацию.

alex445 коренной житель27.07.22 10:08
NEW 27.07.22 10:08 
в ответ Программист 26.07.22 21:14
Оттого, что вы разобьёте один класс на два, но очень связанных, от божественности вы не избавитесь.

Сильная связь - композиция. Слабая связь - агрегация. Что ты понимаешь под сильной и слабой связью мне не ведомо. Боюсь, что тебе тоже :)

Здесь я имею ввиду не понития компоновки объектов, а то, как тесно они взаимодействуют. Можно сделать "слабую связь" по вашим понятиям (аггрегацию), а затем заставить их очень тесно взаимодействовать. Вот это я и имею ввиду - два класса (уже три), все используют друг друга очень сильно (вызывают друг у друга свойства и методы). Выкинь один - другой становится бессмысленным. А как оно там скомпоновано - дело десятое.

Программист коренной житель27.07.22 10:45
NEW 27.07.22 10:45 
в ответ alex445 27.07.22 10:08
Здесь я имею ввиду не понития компоновки объектов, а то, как тесно они взаимодействуют. Можно сделать "слабую связь" по вашим понятиям (аггрегацию), а затем заставить их очень тесно взаимодействовать. Вот это я и имею ввиду - два класса (уже три), все используют друг друга очень сильно (вызывают друг у друга свойства и методы). Выкинь один - другой становится бессмысленным. А как оно там скомпоновано - дело десятое.

Ккак тесно они взаимодействуют не имеет никакого значения. У тебя в компе процессор и материнская плата взаимодействуют очень тесно, более того, процессор без материнской платы - бессмысленен, материнская плата без процессора тоже не имеет большого смысла. Однако по сути это независимые друг от друга объекты.

И если у тебя в PC процессор можно вынуть из материнской платы и заменить на другой (агрегация) - это слабая связь, то у тебя в смартфоне процессор впаян в материнскую плату (композиция) и это сильная связь.


Murr патриот27.07.22 12:07
Murr
NEW 27.07.22 12:07 
в ответ alex445 27.07.22 09:55

Так его можно обнулить и

-----

Научись читать - собирались грохнуть инстансе словаря...

AlexNek патриот27.07.22 12:28
AlexNek
NEW 27.07.22 12:28 
в ответ alex445 27.07.22 09:45
программист может не знать особенности работы индекса словаря

Это как бы мелочь.

Для начала неизвестно, что у нас с левой стороны.

Затем видим - операция добавления, значит коллекция меняется.

Вторая строка - операция присваивания, коллекция меняться не должна, мы ведь работаем с конкретным элементом.

То бишь налицо побочный эффект, я бы сказал отрицательный. Потому что хочу менять только те элементы что уже имеются, а добавлять только те которых нет. Вполне возможно что кто то захочет ровно наоборот, но это никак не причина разделять одну операцию на две


alex445 коренной житель27.07.22 13:39
NEW 27.07.22 13:39 
в ответ Программист 27.07.22 10:45

Ладно, вот другой примерчик странных подарков. К чему может быть такое наследование?


public class Config : ConfigBase<Config>


Конструктора у Config нет. Но это значит, что у него есть дефолтный без параметров.


Внутри ConfigBase сидит статическое свойство


public static T Configuration { get ... ; set ... ;}


в котором под блокировкой (lock) организуется загрузка конфигурации в геттере.


Как я понимаю, любой Config имеет статическое свойство на самого себя... И что это даёт? Можно в бесконечном цикле самого себя опрашивать?


Я бы подумал, что это какая-то странная организация синглетона через наследование и параметр типа, но дефолтный-то конструктор не мешает насоздавать сколько угодно Config? Плюс сеттер публичный доступен. "Протекающий" синглетон какой-то.

alex445 коренной житель27.07.22 13:43
NEW 27.07.22 13:43 
в ответ Murr 27.07.22 12:07

Так его можно обнулить и

-----

Научись читать - собирались грохнуть инстансе словаря...

Сделайте его или только для чтения или доступным только по геттеру.

Программист коренной житель27.07.22 14:05
NEW 27.07.22 14:05 
в ответ alex445 27.07.22 13:39
К чему может быть такое наследование?

Вот тут хз... Статики вообще маст дай :)

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

alex445 коренной житель27.07.22 19:15
NEW 27.07.22 19:15 
в ответ Программист 27.07.22 14:05

Кто-нибудь работал с проектами, которые нельзя запустить по Ф5 в Студии? Проекту требуется сложная система конфигурационных файлов, находящихся строго в нужных папочках. Эти файлы копируются и генерятся (!) в процессе установки. Протестировать юнит-тестами - тоже сомнительное дело, т.к. даже объект конфигурации - сложная система классов (вот как я выше привёл со странным наследованием в виде себя же в качестве параметра типа), имеющая ссылки на кучу других классов и ресурсов. Вобщем, собрать mock-объект для такого типа - та ещё задачка. Ну и вообще проект при инсталляции перемещает туда-сюда горы исполняемых и конфигурационных файлов, и по их захардкоденным путям потом их используют другие части проекта. Если просто дрюкнуть Ф5 - ничего на своих местах не обнаруживается.

Murr патриот27.07.22 19:57
Murr
NEW 27.07.22 19:57 
в ответ alex445 27.07.22 13:39

И что это даёт?

-----

Кеширование?

Murr патриот27.07.22 19:59
Murr
NEW 27.07.22 19:59 
в ответ Программист 27.07.22 14:05

не знаю, как генерики дружат со статиками.

-----

Нормально - по одному на каждый тип т.к. он есть класс со своим статиком.

Murr патриот27.07.22 20:00
Murr
NEW 27.07.22 20:00 
в ответ alex445 27.07.22 13:43

Сделайте его или

-----

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

Murr патриот27.07.22 20:03
Murr
NEW 27.07.22 20:03 
в ответ alex445 27.07.22 19:15

требуется сложная система

-----

МОКи... Что такое - читать самостоятельно.

Срыв покровов патриот28.07.22 06:52
NEW 28.07.22 06:52 
в ответ alex445 27.07.22 09:55
Обнулить словарь? Так его можно обнулить и цепочкой вызовов этих методов доступа.

для этого нужно знать, какие в словаре существуют ключи

Ну и это уже будет намеренный выстрел в ногу.

Срыв покровов патриот28.07.22 07:28
NEW 28.07.22 07:28 
в ответ alex445 27.07.22 13:43
Сделайте его или только для чтения или доступным только по геттеру.

имея только геттер, ты получаешь доступ ко всем методам и свойствам словаря

И список ключей можешь получить

И все очистить.

alex445 коренной житель28.07.22 10:46
NEW 28.07.22 10:46 
в ответ Murr 27.07.22 19:57

И что это даёт?

-----

Кеширование?

Опять же, вы имеете ввиду синглетон или что-то подобное - один раз загрузил конфиг и держишь в памяти? Но почему так сложно - для этого можно просто иметь статическое свойство с конфигурацией в памяти. А там нагородили наследование и параметр типа в виде самого себя же.

alex445 коренной житель28.07.22 10:49
NEW 28.07.22 10:49 
в ответ Murr 27.07.22 20:00, Последний раз изменено 28.07.22 10:52 (alex445)
Сделайте его или
-----
нее, это слишком просто... всякие джуны полезут править без понимания что и зачем...

Так делают все - от ждунов до помидоров. Если после недельки кипящих мозгов и отсутствия нормальных доков всё ещё невозможно понять, что там понаписано - выкидываешь в мусор и переписываешь по-своему.


Сделайте его или

-----

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

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

alex445 коренной житель28.07.22 11:02
NEW 28.07.22 11:02 
в ответ Срыв покровов 28.07.22 07:28, Последний раз изменено 28.07.22 11:10 (alex445)
имея только геттер, ты получаешь доступ ко всем методам и свойствам словаря
И список ключей можешь получить
И все очистить.
Ну и это уже будет намеренный выстрел в ногу.

Нууу... вобщем и целом первое объяснение как-то катит. Правда, зависит от контекста. У меня юзер словаря и так знает все ключи - так что он обнулит всё равно, если захочет. Да и всё равно, даже если все не знает - обнулит те, что знает. Т.е. не защита от вредителя (тут вообще другие механизмы нужны, а не абстрагирование в коде), да и от дурака - так себе. Зато куча неудобств для нормальных людей.


Заметьте, что по фен-шую (ну, как тут на некоторых островах принято) нужно на GetValue/SetValue сделать интерфейс, затем унаследоваться от него и написать реализацию, и наконец протестировать это всё. Со словарём ничего такого делать не надо. Пишешь такой неработающую "защиту от дурака" - два-три тикета в таск-трекере, работы на полдня, на митинге что-то брякнул про важность и полезность такого подхода. А по факту только наговнокодил и усложнил всё. ))


А потом через время придёт "дурак" со стороны, для поддержки этой всей дури, через недельку бесполезных попыток понять, что происходит, плюнет и перепишет проще и по-своему. Так что все защиты, паттерны и прочие глюки сектантов с островов полетят в корзину.


Больше подходит, что чел хотел абстрагироваться от конкретного способа хранения, но это преждевременная оптимизация - менять словарь на что-то другое с индексами и ключами явно незачем.

Программист коренной житель28.07.22 12:27
NEW 28.07.22 12:27 
в ответ alex445 27.07.22 19:15
Кто-нибудь работал с проектами, которые нельзя запустить по Ф5 в Студии? Проекту требуется сложная система конфигурационных файлов, находящихся строго в нужных папочках. Эти файлы копируются и генерятся (!) в процессе установки.

Все просто - устанавливаешь свою прогу, меняешь в студии output path и отлаживаешь уже в папочке с установленной версией :)



alex445 коренной житель28.07.22 16:12
NEW 28.07.22 16:12 
в ответ Программист 28.07.22 12:27

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


Но я считаю это неправильным, когда по Ф5 приложение не работает. Как его тестировали? Одними юнит-тестами? А процесс установки довольно длительный и, главное, требует ввода кучих данных. Т.е. приходится разрабатывать на установленном приложении. Но после каждого существенного обновления (разработал фичу) нужно править установщик - т.е. деинсталлировать и инсталлировать снова. И так постоянно. Бред...

Программист коренной житель28.07.22 16:23
NEW 28.07.22 16:23 
в ответ alex445 28.07.22 16:12
Но я считаю это неправильным, когда по Ф5 приложение не работает.

Так оно работает :) Просто надо немного подготовить систему. Такое, кстати, бывает очень часто. А раньше, когда надо было регистрировать COM компоненты такая байда была сплошь и рядом. Сейчас тоже программы часто привязываются к путям на жестком диски и/или к реестру.


Как его тестировали?

Устанавливали и тестировали :)


А процесс установки довольно длительный и, главное, требует ввода кучих данных.

Наверняка есть silent install, где все эти данные можно ввести заранее (через командную строку или через конфигурационный файл)


Но после каждого существенного обновления (разработал фичу) нужно править установщик - т.е. деинсталлировать и инсталлировать снова. И так постоянно. Бред...

Или просто поменять сборки в уже установленном софте :)

AlexNek патриот28.07.22 17:40
AlexNek
NEW 28.07.22 17:40 
в ответ alex445 28.07.22 16:12
Но я считаю это неправильным, когда по Ф5 приложение не работает

Совершенно правильно. Если нужны особые настройки то они должны выполнятся на автомате. На крайняк батник для самого первого запуска.

Murr патриот28.07.22 19:39
Murr
NEW 28.07.22 19:39 
в ответ alex445 28.07.22 16:12

без установки никак

-----

А если попробовать использовать мозг для думания? смущ


Бред...

-----

Разумеется...

Murr патриот28.07.22 19:45
Murr
NEW 28.07.22 19:45 
в ответ AlexNek 28.07.22 17:40

батник для самого первого запуска

-----

Тебе даже место куда команды прописать выделили... хоть ДО, хоть ПОСЛЕ...

Если совсем не нравится, то есть даже пример того, как по Ф5 запустить другой (отличный от используемого для разработки) инстанисе Студии с установленным разрабатываемым расширением для Студии в режиме отладки...

AlexNek патриот28.07.22 22:08
AlexNek
NEW 28.07.22 22:08 
в ответ Murr 28.07.22 19:45
хоть ДО, хоть ПОСЛЕ

А даже сказали как это сделать один единственный раз?


как по Ф5 запустить другой

А причем здесь отладка аддонов к студии?

Murr патриот28.07.22 22:22
Murr
NEW 28.07.22 22:22 
в ответ AlexNek 28.07.22 22:08

А даже сказали как это сделать один единственный раз?

-----

А что мешает?

IF NOT EXISTS (OneTimeCopyFile) COPY .\OneTime\CopyFile OneTimeCopyFile | DoSomething

Murr патриот28.07.22 22:24
Murr
NEW 28.07.22 22:24 
в ответ AlexNek 28.07.22 22:08

А причем здесь отладка аддонов к студии?

-----

Какая разница что отлаживать?

AlexNek патриот29.07.22 12:17
AlexNek
NEW 29.07.22 12:17 
в ответ Murr 28.07.22 22:22
А что мешает?

привычка смущ

А что делать если ошибка какая будет?

Лучше уж батник сюды подцепить.

Murr патриот29.07.22 12:37
Murr
NEW 29.07.22 12:37 
в ответ AlexNek 29.07.22 12:17

А что делать если ошибка какая будет?

-----

Обрабатывать ERRORLEVEL...


Лучше уж батник сюды подцепить.

------

Батник не даст доступа к переменным определенным в проекте, а они будут нужны. Не сейчас так позднее.

Так что лучше - выучить пропсы с таргетсами, обдумать задачу и уложить в них.

Но это одна из тех областей, которую полезно знать, но которая пользуется крайне редко и потому с ней знакомятся только иногда...


alex445 коренной житель29.07.22 16:49
NEW 29.07.22 16:49 
в ответ Программист 28.07.22 16:23, Последний раз изменено 29.07.22 16:59 (alex445)
Но после каждого существенного обновления (разработал фичу) нужно править установщик - т.е. деинсталлировать и инсталлировать снова. И так постоянно. Бред...
Или просто поменять сборки в уже установленном софте :)

Для этого нужно

либо вручную заменять эти сборки,

либо писать программулину, которая их заменяет (проще тогда уж поправить установщик и переустановить),

либо прописывать пути, куда при сборке складывать либы.


Последний вариант требует разных типов сборочного процесса - для тестирования в установленном виде и для собирания установщика. Т.е. начинаем ипаца с разными переменными сборки: Debug, InstalledDebug, Release, Distrib и прочее. Либо немного по-другому - при компиляции складываем всё в привычные Debug или Release, но потом запускаем скрипты для тестирования в установленном виде, для тестирования без установки, для сборки дистриба и прочее. Т.е. усложняем процесс разработки - нам ведь не нужны простые решения, чтобы каждый джун мог разобраться сходу.

alex445 коренной житель29.07.22 16:52
NEW 29.07.22 16:52 
в ответ Murr 28.07.22 19:45, Последний раз изменено 29.07.22 18:11 (alex445)
Тебе даже место куда команды прописать выделили... хоть ДО, хоть ПОСЛЕ...

Не место, а места. В MSBuild-скриптах ещё и батники вызываются. И ещё много чего до кучи. И ДО, и ПОСЛЕ, и ВО ВРЕМЯ, и даже ВМЕСТО. И наверняка найдётся какой-нибудь Мурр, который скажет, что ему этого мало, и он хочет кастомное расширение написать: ДО_И_ПОСЛЕ_НО_НЕ_ВО_ВРЕМЯ_ПЛЮС_ДВА_РАЗА_ВМЕСТО_ПО_ЧЁТНЫМ_ПОНЕДЕЛЬНИКАМ_КАЖДОГО_ВИСОКОСНОГО_ГОДА.

alex445 коренной житель29.07.22 16:57
NEW 29.07.22 16:57 
в ответ Murr 29.07.22 12:37

Батник не даст доступа к переменным определенным в проекте, а они будут нужны. Не сейчас так позднее.

Так что лучше - выучить пропсы с таргетсами, обдумать задачу и уложить в них.

Но это одна из тех областей, которую полезно знать, но которая пользуется крайне редко и потому с ней знакомятся только иногда...

Если бы было придумано ещё чего посложнее, а потом ещё, и ещё, то Мурр наверняка бы во всё это с удовольствием зарылся. Если всё будет просто, то незаменимым не станешь и семь знаков не заработаешь. Какие семь знаков, если каждый джун сможет всё скомпилить и собрать без перелопачивания тонн тьюториалов? ))

AlexNek патриот29.07.22 17:52
AlexNek
NEW 29.07.22 17:52 
в ответ Murr 29.07.22 12:37
Обрабатывать ERRORLEVEL

ни разу еще не попадалось с правильным значением смущ


Батник не даст доступа к переменным определенным в проекте, а они будут нужны

не имею понятия зачем, но входные параметры батника вроде для этого и могут использоваться

Murr патриот29.07.22 20:06
Murr
NEW 29.07.22 20:06 
в ответ alex445 29.07.22 16:49

либо вручную заменять

-----

Чего люди только не делают лишь бы не учится...


чтобы каждый джун мог разобраться сходу

-----

Конечно нет!

Нам таки нужно чтобы джун рос над собой...

Murr патриот29.07.22 20:14
Murr
NEW 29.07.22 20:14 
в ответ AlexNek 29.07.22 17:52

ни разу еще не попадалось с правильным значением

-----

Ну с этим не ко мне - код выхода будет в этой переменной, а что он будет обозначать спрашивай у разработчика.

К тому же там определено единственное значение - 0 - "все Ок!", а остальное не регламентировано.


не имею понятия зачем

-----

Ну откуда Я могу знать - ЗАЧЕМ - если задача еще не определена.


Когда-то давно пользовал оное для принудительной перекомпиляции шаблонов в проекте.

Потом вроде сделали более цивильный вариант...

alex445 коренной житель29.07.22 22:03
NEW 29.07.22 22:03 
в ответ Murr 29.07.22 20:06, Последний раз изменено 29.07.22 22:04 (alex445)
Нам таки нужно чтобы джун рос над собой...

"А компот?!"


ЗЫ. Почему "Я" всегда с большой буквы?
alex445 коренной житель03.08.22 21:48
NEW 03.08.22 21:48 
в ответ alex445 29.07.22 22:03, Последний раз изменено 04.08.22 10:16 (alex445)

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

alex445 коренной житель03.08.22 22:07
NEW 03.08.22 22:07 
в ответ alex445 03.08.22 21:48, Последний раз изменено 03.08.22 22:08 (alex445)
При этом был узнаваемый стиль - один контрол со всеми атрибутами строго на одну строку. Если строка занимает три экрана - твои проблемы.

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

AlexNek патриот03.08.22 22:15
AlexNek
NEW 03.08.22 22:15 
в ответ alex445 03.08.22 21:48
Кто-нибудь встречал такой кейс

Не думаю. Telerik и Dev Express попадались.

alex445 коренной житель04.08.22 10:08
NEW 04.08.22 10:08 
в ответ AlexNek 03.08.22 22:15, Последний раз изменено 04.08.22 10:10 (alex445)

Но там чуваки не занимаются созданием своих базовых типов с дофига встроенной функциональности взамен дотнетовских?


Насколько я знаю, даже Телерик и Девэкспресс стараются копировать свойства и методы дотнетовских компонентов, лишь немного что-то изменяя или добавляя своего. Т.е. полностью отличающихся наборов членов и поведением нет, если они заменяют дотнетовский.

MrSanders коренной житель04.08.22 13:43
NEW 04.08.22 13:43 
в ответ alex445 03.08.22 21:48
Кто-нибудь встречал такой кейс, что базовые типы, типа строк, чисел, булевых и прочих (но не все) переписаны, в них добавлена встроенная валидация, способность определять

Встречал. В одном ORM можно было хранить только данные, унаследованные от DbData. Стринги, инты, булеаны - для всего был свой класс.

alex445 коренной житель04.08.22 15:54
NEW 04.08.22 15:54 
в ответ MrSanders 04.08.22 13:43, Последний раз изменено 04.08.22 15:56 (alex445)

Это из нового или что-то допотопное или самописное?

AlexNek патриот04.08.22 17:50
AlexNek
NEW 04.08.22 17:50 
в ответ alex445 04.08.22 10:08
даже Телерик и Девэкспресс стараются копировать свойства и методы дотнетовских компонентов

имелось в виду что любую либу не просто перенести на что то другое. В том же Девэкспресс полно вкусных плюшек в дополнение к UI элементам.

MrSanders коренной житель04.08.22 21:19
NEW 04.08.22 21:19 
в ответ alex445 04.08.22 15:54

Допотопное и самописное. Появилось примерно в одно время с хибернейтом, может года с 2002-2003, потом проект свернули. В проекте, в котором я это видел, заменять ни на что не стали, а купили права, и потом 10 лет допиливали его сами. Уже и как называлось не вспомню.

alex445 коренной житель05.08.22 01:58
NEW 05.08.22 01:58 
в ответ alex445 03.08.22 21:48, Последний раз изменено 05.08.22 02:41 (alex445)
Кто-нибудь встречал такой кейс, что базовые типы, типа строк, чисел, булевых и прочих (но не все) переписаны, в них добавлена встроенная валидация, способность определять, можно ли их отрисовывать (на основе встроенной авторизации и аутентификации), присутствуют состояния и сообщения об ошибках (т.е. в "базовых" типах заведена куча полей, логики, они сами из себя представляют лютую иерархию наследования)? И все остальные модели строятся на этих кастомным "базовых" типах.

Щас ещё глянул - как я писал, эти базовые типы наследуются от другого базового, у которого есть уникальный идентификатор GUID. И от этого базового наследуются вообще все типы - и строки, числа, булевы и т.п. данные, и всякие более высокоуровневые, типа меню, таблиц, отдельных строк таблиц, форм. При этом форма может состоять из строк и чисел, но все они наследуются от одного базового типа с полем уникального идентификатора. Т.е. получается, что все элементы и данные в приложении имеют зачем-то свой GUID.


Но этого мало. В этот самый базовый тип встроена логика по аутентификации и правам (нужно ли быть залогиненным, чтобы видеть этот объект, и имеет ли юзер достаточно для этого прав), по валидации и сообщениям об ошибках валидации (да, на каждое данное и каждый объект вообще), по фокусировке (объект может получить фокус в UI), знает своего родителя в визуальном дереве (т.е. например поле "имя пользователя" знает, что его родитель - форма залогинивания), и ещё много чего. Т.е., повторю, эту функциональность имеет абсолютно каждый объект в программе - от простого числа, до целой формы.


По-моему, в проекте нарушены потоки управления. Вместо привычного, скажем, "форма залогинивания или объект пользователя управляет видимостью своих полей, проводит их валидацию и показывает ошибки", существует какой-то дикий треш, в котором каждый сам собой управляет, валидируется и предоставляет сообщения об ошибках. Это вообще ООП или что? Где инкапсуляция, где границы ответственности данных и объектов? Такое ощущение, что все данные всех объектов отделены от них и представляют из себя огромную кучу из атомарных данных со своими идентификаторами и встроенной независимой функциональностью. При этом они всё же объединены в формы и объекты, но типа для вида - всё равно эти формы и объекты ими не управляют.


Делали явно не от мира сего. Мне трудно представить себе какой-то уникальный процесс на фабрике в реальном мире, который бы моделировался подобной конструкцией. Нахрена иметь абсолютно уникальные айдишники для абсолютно всех данных, которые существуют, скажем, лишь на протяжении одной сессии? И всё это дерьмо ещё и логируется через каждые 3-5 строчек кода. Ну и что даст чтение логов через месяц, где будет отображено, что данное с айди таким-то при обработке в форме с айди таким-то получило ошибочные данные с айди таким-то? Я же не смогу воссоздать эту ситуацию и продебажить её - айди же каждый раз разные, даже для одинаковых данных.

alex445 коренной житель05.08.22 02:37
NEW 05.08.22 02:37 
в ответ alex445 05.08.22 01:58, Последний раз изменено 05.08.22 02:45 (alex445)

Ну и вишенка - этот GUID существует в базовом классе в виде... строки! При инициализации создаётся новый идентификатор через Guid.NewGuid(), что возвращает структуру типа Guid, и тут же переводится в строку через ToString. Т.е. не по месту где надо конвертиться в строку, а изначально гуляет по приложению в виде строки. Ну и потом ещё с ним манипуляции проводят, типа дополняют эту строку разными символами. Т.е. это уже не Guid, а хрень собачья - назад в Guid не сконвертишь. Но есть финт ушами - в одном месте есть метод GetUID, который проверяет строку на магическое число 36 (всё без комментариев, напомню). И если строка больше 36, то метод берёт подстроку в 36 символов.


Правда, нашёл ещё метод, который конкатинирует эти GUIDы в одну строку. Там создаётся локальная переменная szId и ей присваивается результат конкатенации. В принципе, пофиг, т.к. переменная существует лишь в этом методе, и можно назвать её хоть "абракадабра", и за пределами этого метода можно об этой бессмысленной переменной забыть. Но мне просто интересно, что может означать название "szId"? Комментов нигде ни строчки нет. Там человек ещё местами вкорячивает вперемешку немецкий с английским в названиях переменных. Но вот просто любопытно - если сконкатинировать два гуида, то почему получается szId?

alex445 коренной житель05.08.22 03:33
NEW 05.08.22 03:33 
в ответ alex445 05.08.22 02:37

Они там постоянно говорят о каких-то Unikat. Но это явно какие-то отдельные вещи, типа поступлений на склад или движения объектов по фабрике. Но не отдельный уникат на каждое свойство каждого объекта в каждой сессии. Надо расспросить получше, но последний вариант с уникатами на всё и вся - явно чушь.

alex445 коренной житель05.08.22 12:36
NEW 05.08.22 12:36 
в ответ alex445 05.08.22 02:37, Последний раз изменено 05.08.22 12:42 (alex445)

Во, ещё нашёл. В каждом данном - любом, типа "имя пользователя" или "масса изделия" хранятся данные, кто у этого данного непосредственный (родительский) контейнер и кто - корневой контейнер. Вот нахрена это знать каждому числу, строке и вообще любой величине? Не объекту в целом, а даже отдельным свойствам этого объекта. Но и сам объект тоже знает, т.к. он тоже унаследован от базового типа, где эти данные хранятся. Просто дикий оверхед по памяти и обработке информации. Про то, что в исходниках этой каши ещё и сложно разобраться, вообще молчу. Как будто всё приложение в каждой своей части сделано против всех правил - зато "оригинальная архитектура". Явно делали, чтобы никто кроме создателей поддерживать не мог. То, что создатели могут продать своей проект с потрохами, без поддержки, их команда может развалиться, они могут свалить куда-то или просто умереть - да пофиг. Ну а тот, кто купил эту байду без экспертизы и своего рода аудита, думая, что его программеры сами разберутся - лох.

AlexNek патриот05.08.22 17:37
AlexNek
NEW 05.08.22 17:37 
в ответ alex445 05.08.22 01:58
В этот самый базовый тип встроена логика по аутентификации и правам

видимо ради этого всё и затевалось. Чтобы автоматом показывалось только то что можно пользователю.

alex445 коренной житель08.08.22 14:49
NEW 08.08.22 14:49 
в ответ AlexNek 05.08.22 17:37, Последний раз изменено 08.08.22 15:24 (alex445)

Ещё такой прикол. Есть много форм, где часто встречается поле, в которое нужно ввести название одной и той же сущности (но разные экземпляры). Т.е. скажем поле "расположение" - много где надо его ввести. Обработка ввода и валидация этого поля везде одна и та же, проверка на одни и те же исключения, показ одних и тех же сообщений об ошибках. Но... В каждой, ска, форме, делается это немного по-другому! И для каждой формы своё сообщение об ошибке! Т.е. логика остаётся той же, а оформление и код - немного другой. И сообщения об обшибках ввода этого поля выглядят в разных формах примерно так:


"введённое расположение не найдено"

"расположение не найдено"

"введённое вами расположение отсутствует в базе данных"

"такого расположения не существует"


Но все эти сообщения находятся под разными ключами, т.к. формат ключа "имяФормы_ещёМногоРазныхУсловныхОбозначений_ключСообщения". То, что в разных формах одна и та же обработка и одни и те же сообщения об ошибках должны быть - создатели такой архитектуры, похоже, не предусмотрели.


В этом проекте "гениальность" архитектуры соперничает с абсолютной идиотичностью реализации её мелких частей - вот типа такого способа хранения сообщений в одном словаре с гигантскими составными ключами (и сотнями строк парсинга этих ключей, плюс тесты на всё это), или способа валидации одной и той же сущности в разных местах по смыслу одинаково, но по коду - немного по-разному.

alex445 коренной житель08.08.22 14:53
NEW 08.08.22 14:53 
в ответ alex445 08.08.22 14:49, Последний раз изменено 08.08.22 14:54 (alex445)

Ну а вообще - бывает, что одна и та же сущность в разных случаях должна валидироваться по-разному? Как тогда?


Вот есть модель БД в виде ORM. Там валидация в атрибутах прописана. Но если я хочу в разных формах по-разному отвалидировать? Тогда надо ввести допольнительный слой - скажем, модели (или модели представления) и валидацию прописать уже в них такую, какая нужна для каждой формы. А потом при отправке в БД согласовать их валидацию с валидацией в ORM. Правильно?


Entity Location (location validation)


ViewModel LocationInLocationForm (location in location form validation)

ViewModel LocationInOrderForm (location in order form validation)

and so on...

AlexNek патриот08.08.22 18:18
AlexNek
NEW 08.08.22 18:18 
в ответ alex445 08.08.22 14:53
... А потом при отправке в БД согласовать их валидацию с валидацией в ORM. Правильно?

А есть море примеров где это нужно? Хотя придумать можно.

То есть однозначно сказать нельзя. Думаю, в большинстве случаев это не нужно. Например, возраст/год рождения.

AlexNek патриот08.08.22 18:20
AlexNek
NEW 08.08.22 18:20 
в ответ alex445 08.08.22 14:49
В этом проекте "гениальность" архитектуры соперничает

Видимо не один писал. Вначале чисто для себя, как думалось что клиент захочет. А после каждый дорабатывал как действительно надо.

alex445 коренной житель09.08.22 13:56
NEW 09.08.22 13:56 
в ответ AlexNek 08.08.22 18:20, Последний раз изменено 09.08.22 14:02 (alex445)

В одном месте встречаю проверку строки на целое число в методе IsInteger через Double.TryParse.

Через 10 строчек кода, в этом же методе эта же строка конвертится через Int.Parse.


В методе IsInteger после вызова Double.TryParse распарсенный результат проверяется на <=long.MaxValue и >=long.MinValue. Зачем? Вероятность ввода строки "NaN" явно исключена.


В одном методе при конвертации строки в число используется параметр культуры.

В перегрузке этого метода, не использующей параметр культуры, в комменте написано, что эта перегрузка использует актуальную культуру. А в коде тут же вызывается первая перегрузка с захардкоденным параметров "en-US".


Окончательно убедился в "гениальности" данного проекта.

alex445 коренной житель09.08.22 14:57
NEW 09.08.22 14:57 
в ответ alex445 09.08.22 13:56

Я уже рассказывал, что лучше в принципе исключить ошибки на этапе ввода, чем с упорством барана их обрабатывать. Нужно лишь подобрать правильный контрол.


Оцените подход. В проекте используются везде контролы, принимающие лишь строки. Хотя вводить в некоторые поля нужно и числа. Что делают авторы этого проекта? - В каждой форме пишут однотипный код по проверке введённой строки и показывании статуса - типа "поле не должно быть пустым", "введённое значение - не число" и т.п. Хорошо хоть методы парсинга строк в числа вынесли в переиспользуемый код. Но вот эти обработки со статусами - в каждой форме. На эти статусные сообщения - словарик ресурсов с локализацией.


И всё это вместо того, чтобы методы парсинга строки и сообщения об ошибках ввода затолкать в какой-нибудь контрол, пусть и самописный.

AlexNek патриот09.08.22 17:41
AlexNek
NEW 09.08.22 17:41 
в ответ alex445 09.08.22 13:56
Double.TryParse распарсенный результат проверяется на <=long.MaxValue и >=long.MinValue. Зачем?

по определению

public const double MaxValue = 1.7976931348623157E+308;


public const long MaxValue = 9223372036854775807;
alex445 коренной житель09.08.22 21:13
NEW 09.08.22 21:13 
в ответ AlexNek 09.08.22 17:41, Последний раз изменено 09.08.22 21:25 (alex445)

И? Я логику всё равно не понимаю. Ну парси тогда лонг сразу?

Дальше-то оно всё равно через обычный int парсится. Программист в десяти строчках кода не может решить, с каким типом он работает - три разных использует.


С другой стороны, я когда на эту всю вакханалию смотрю, то тоже не охота ничего особо править. У меня задача - перевести на новый интерфейс. Тупо беру и копирую код. Там и так править много, чтобы под новую версию фреймворка подогнать, так что исправлять ещё и косяки и странности остального кода, до кучи вникая, зачем это и почему было сделано, и не порушит ли что другое - нет ни времени, ни желания особого. Но вот такие штуки просто в глаза бросаются. Думаешь про себя - да хер с ним, раньше же как-то у них много лет работало, значит и сейчас как-то будет работать, если я просто скопирую. Мне постоянно напоминают, мол "клиент этого не заказывал, того не заказывал" - т.е. времени править все грехи всех предыдущих погромистов нет, и за это не заплатят. Но из-за этого иногда приходится вкорячивать костыли, чтобы обойти костыли предыдущих бедолаг. Вот так код и приходит в совершенную негодность и "проще выкинуть" через несколько таких итераций "да нам по-быстрому, лишь бы на новых версиях железа/ПО заработало". У заказчика только одна претензия к этому ону мамонта - не работает нормально в новых браузерах, а только в ИЕ. Работало бы в новых - они до сих пор сидели бы на попе ровно с этим кодом 15-20-летней давности, который никуда не масштабируется и к которому прилагаются старинные PDA с Вин Мобайл на борту и специальным гуём, вместо единообразной адаптивной вёрстки десктоп/мобилы.

AlexNek патриот09.08.22 21:26
AlexNek
NEW 09.08.22 21:26 
в ответ alex445 09.08.22 21:13
Я логику всё равно не понимаю. Ну парси тогда лонг сразу?

Если вводятся только строки, то скорее всего ориентация идет на double, как базовый тип.


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

alex445 коренной житель09.08.22 21:27
NEW 09.08.22 21:27 
в ответ AlexNek 09.08.22 21:26, Последний раз изменено 09.08.22 21:27 (alex445)

Главное, в конце всё равно распарсивается как обычный инт32 и получившееся идёт в обработку. ))

Ну вот про это - не заморачиваться - я и написал выше. ))

MrSanders коренной житель10.08.22 09:49
NEW 10.08.22 09:49 
в ответ AlexNek 09.08.22 21:26
Совершенно не следует понимать, почему так сделано

Я-я, натюрлихь! Тафай-тафай, прокраммируй, не задумывайся, блин. Самый отвратительный совет, который только можно дать.

Прям 1 в 1 мои коболисты. А чо, работает же? А то что ты уже за эти полгода пятый раз ошибки правишь в этом куске кода, ничерта не понимая, добавляя очередной if-else ни на какие мысли не наводит, нет. Главное быстро тикет сделать.

AlexNek патриот10.08.22 13:00
AlexNek
NEW 10.08.22 13:00 
в ответ MrSanders 10.08.22 09:49
Тафай-тафай, прокраммируй, не задумывайся, блин

Похоже мы смотрим в разные стороны. Имелось в виду совершенно другое.

Понять как "правильно" делать - это вроде как само собой разумеется. То, что у всех может быть разное мнение по этому поводу - вопрос дополнительной дискуссии.

alex445 коренной житель10.08.22 13:17
NEW 10.08.22 13:17 
в ответ AlexNek 10.08.22 13:00
Похоже мы смотрим в разные стороны.

"Живём на разных островах" же! ))

alex445 коренной житель16.08.22 18:20
NEW 16.08.22 18:20 
в ответ alex445 10.08.22 13:17, Последний раз изменено 16.08.22 18:23 (alex445)

Встретил такое


свойство


public bool HasFocus

get

internal set


метод


public void SetFocus


Нафига, чтобы прочитать свойство, нужно обратить себя к свойству, а чтобы установить его - к специальному методу?


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

AlexNek патриот16.08.22 20:17
AlexNek
NEW 16.08.22 20:17 
в ответ alex445 16.08.22 18:20
Нафига, чтобы прочитать свойство, нужно обратить себя к свойству, а чтобы установить его - к специальному методу?

вполне объяснимо. Фокус можно установить, но невозможно снять.

a.HasFocus = false - всегда можно написать, но это недопустимо.

Срыв покровов патриот16.08.22 22:58
NEW 16.08.22 22:58 
в ответ alex445 16.08.22 18:20

явщик программировал.

alex445 коренной житель17.08.22 00:59
NEW 17.08.22 00:59 
в ответ Срыв покровов 16.08.22 22:58, Последний раз изменено 17.08.22 01:04 (alex445)
явщик программировал.

Чё?

Небухай.

alex445 коренной житель17.08.22 01:11
NEW 17.08.22 01:11 
в ответ AlexNek 16.08.22 20:17
Нафига, чтобы прочитать свойство, нужно обратить себя к свойству, а чтобы установить его - к специальному методу?
вполне объяснимо. Фокус можно установить, но невозможно снять.
a.HasFocus = false - всегда можно написать, но это недопустимо.

Ладно, согласен - иногда бывает, что нужно так сделать. Но тогда это надо в комментах писать. А у чела комментов нет, и, похоже, принципиально. Сиди и догадывайся, почему тут так сделано. Ну или выцепляй его и пиши ему письма.


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

Программист коренной житель17.08.22 09:25
NEW 17.08.22 09:25 
в ответ alex445 16.08.22 18:20, Последний раз изменено 17.08.22 09:37 (Программист)
Нафига, чтобы прочитать свойство, нужно обратить себя к свойству, а чтобы установить его - к специальному методу?

Я бы сказал, что это составной контрол. Ну например ввод времени - два едит кокса и лейбл между ними. SetFocus устанавливает фокус на конкретный едитбокс (скажем на ввод минут), а GetFocus показывает емеет ли весь контрол фокус.


Альтернатива еще может быть такой, что HasFocus призван просто сообщать о состоянии объекта. Такой прием часто используется в WPF, когда к объекту добавляются проперти IsXXX чтобы иметь булевое значение для XAML'а

Программист коренной житель17.08.22 09:26
NEW 17.08.22 09:26 
в ответ AlexNek 16.08.22 20:17
a.HasFocus = false - всегда можно написать, но это недопустимо.

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

AlexNek патриот17.08.22 12:39
AlexNek
NEW 17.08.22 12:39 
в ответ alex445 17.08.22 01:11
Но тогда это надо в комментах писать.

Не думаю, что такие очевидные вещи будет еще кто то описывать.

AlexNek патриот17.08.22 12:44
AlexNek
NEW 17.08.22 12:44 
в ответ Программист 17.08.22 09:26
В таком случае можно написать логику сеттера

О том, что сеттер может иметь подобную логику, можно еще долго и нужно обсуждать.

Но runtime ошибка немного другое, чем если видишь проблему даже до компиляции кода.

alex445 коренной житель17.08.22 12:59
NEW 17.08.22 12:59 
в ответ alex445 17.08.22 01:11

Человек завёл себе в бизнес логике кастомные типы данных, типа MyInt, MyString, которые могут получать фокус, быть отформатированы внутри себя (через перегрузку их методов или установку делегатов форматирования), быть отвалидированы, хранить сообщения об ошибках, и т.д. У этих типов есть свойство значения Value, которое хранит и устанавливает конкретное значение int, string и т.д. Но использовать его нельзя (хотя геттер и сеттер у него публичные), т.к. иначе не будет проведена логика валидации, установки фокуса и т.д. А нужно для этого использовать специальные методы, в которых всё это делается. Почему не сделать этого в геттерах и сеттерах Value? Почему свойство открыто для редактирования, если его нельзя напрямую использовать? Почему не сделать его внутренним для класса или сборки, где оно применяется напрямую?


Затем ты пишешь модель представления, в которой обычные типы данных типа int и string заменены этими кастомными типами. И затем байндишь представление на эти кастомные типы данных из бизнес логики. Но напрямую забайндить нельзя - свойство Value же нельзя использовать. Поэтому в модели представления ты делаешь своё свойство Value, в геттере и сеттере которого ты вызываешь вышеупомянутые методы по установке и чтению значений. Короче, чтобы нормально работать с этими чудными кастомными типами, делаешь обёртки вокруг них (в виде моделей представления на каждый такой кастомный тип или ещё как), которые приводят их к божескому виду, который подходит для нормальных GUI фреймворков.


Вроде, сказали, что чел, который это придумал, несколько лет работал один над этим проектом. Поэтому всякие странные поведения, паттерны, отсутствие комментов, документации и прочие прелести "одиноких гениев".

alex445 коренной житель17.08.22 13:08
NEW 17.08.22 13:08 
в ответ AlexNek 17.08.22 12:39, Последний раз изменено 17.08.22 13:14 (alex445)



В таком случае можно написать логику сеттера
О том, что сеттер может иметь подобную логику, можно еще долго и нужно обсуждать.
Но runtime ошибка немного другое, чем если видишь проблему даже до компиляции кода.




Но тогда это надо в комментах писать.
Не думаю, что такие очевидные вещи будет еще кто то описывать.

Это для создателя кода они очевидные, а для пользователя - нет. Я должен не просто держать в голове, что внутри у этого свойства странное поведение, отличающееся от обычного, но и как-то самостоятельно вывести такое поведение из анализа доступных членов класса. Опираясь при этом чисто на названия - ну вот есть методы и свойства со словом Focus в названии - наверное, они как-то связаны. Но подтверждения нет. Всё это вместо того, чтобы прочитать короткий тьюториал с примерами, как этот класс или его связанные свойства и методы работают. Ну или хотя бы просто комменты у метода и свойства - "установить можно так, а прочитать - так, а не так, как вы раньше могли подумать".

AlexNek патриот17.08.22 21:23
AlexNek
NEW 17.08.22 21:23 
в ответ alex445 17.08.22 13:08
что внутри у этого свойства странное поведение

Почему странное? Проперти без public сеттера вполне себе так нормальное поведение. Для какой либо библиотеки может быть и можно было написать. А для обычного внутреннего класса - не думаю.

alex445 коренной житель18.08.22 00:47
NEW 18.08.22 00:47 
в ответ AlexNek 17.08.22 21:23
Проперти без public сеттера вполне себе так нормальное поведение

Без паблик сеттера - обычное. А без паблик сеттера, но с паблик методом установки - необычное.

AlexNek патриот18.08.22 12:39
AlexNek
NEW 18.08.22 12:39 
в ответ alex445 18.08.22 00:47
без паблик сеттера, но с паблик методом установки - необычное.

Мне кажется что эта связь создалась виртуально только у вас. Проперти есть проперти, функции есть функции. То что они имеют схожие имена не должно играть особой роли.

Ну и так мне кажется всё понятно: у объекта можно опросить фокус и установить фокус, забрать фокус снаружи нельзя (только изнутри). Я никак не догоняю, что здесь необычного.

alex445 коренной житель19.08.22 17:44
NEW 19.08.22 17:44 
в ответ AlexNek 18.08.22 12:39, Последний раз изменено 19.08.22 17:55 (alex445)
Ну и так мне кажется всё понятно: у объекта можно опросить фокус и установить фокус, забрать фокус снаружи нельзя (только изнутри). Я никак не догоняю, что здесь необычного.

По определению, в фокусе может быть лишь один объект. Вы можете снаружи установить фокус, но не забрать. Но сама установка получается, что забирает фокус. Получается, фокус можно забрать и снаружи - установкой фокуса на другой элемент. В чём смысл тогда делить геттер/сеттер на геттер и метод-сеттер, играясь в разделение ответственностей, которого (разделения) нет?


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


Та же байда, кстати, в этом приложении с правами доступа и контролем состояния элементов управления - элемент должен сам себя проверять, есть ли у пользователя доступ к нему и какие права редактирования. Т.е. в каждом элементарном значении (и контроле, к которому это значение привязано) хранится эта информация, и контрол сам себе меняет состояние. Я вот только не пойму, как сделать ИЗНУТРИ КОНТРОЛА, чтобы он не показывался, если у пользователя нет доступа к нему? Если бы сама форма решала - тут просто - не рисуешь этот контрол и всё. А тут вот есть HTML элемент <input>, и ты либо не рисуешь его, либо используешь его атрибут disabled. Но всё это делается на уровне формы, а не внутри самого элемента. Получается, нужно делать кастомный input, где всю разметку запихать в условный оператор - типа if (hasAccess). Абсолютно идиотское и костыльное решение.

alex445 коренной житель19.08.22 18:05
NEW 19.08.22 18:05 
в ответ alex445 19.08.22 17:44, Последний раз изменено 19.08.22 18:09 (alex445)
Абсолютно идиотское и костыльное решение.

На ровном месте нагромоздили своих базовых типов. Из-за этого надо делать свои контролы на каждый базовый тип (текстбоксы для разных типов данных, лейблы, чекбоксы, списки, таблицы и т.п.). Из-за этого ни один встроенный контрол ни из одного GUI-фреймворка не подходит. Из-за этого не подходит ни одна из моделей валидации форм в этих фреймворках... Там ещё и ORM свой - костыльный и обрезанный, под которым крутится первая версия NHibernate - убогая до невозможности.


Как же достали эти "кулибины", не соблюдающие никаких правил. Как они вообще умудряются писать такой кривой софт для больших контор и не получать по шапке за свой саботаж? Читаешь, читаешь всякие советы по "чистому коду", а в реале забронзовевшие семизнаки творят всякую херню, и им за это ничего нет - наоборот, как сыр в масле катаются. Все эти "книжонки с советами" - такое ощущение, что от чуваков, которые в реальный мир не выходят, а обитают исключительно в параллельной реальности, где всё делается по написанному ими фен-шую.

AlexNek патриот20.08.22 17:49
AlexNek
NEW 20.08.22 17:49 
в ответ alex445 19.08.22 17:44
Получается, фокус можно забрать и снаружи - установкой фокуса на другой элемент

За одним маленьким исключением, что имеется спец. логика для этого. Может быть еще нужно данные обновить если фокус ушел другому элементу


Только они теперь должны быть все связаны

Они только должны знать своего родителя.


Нахрена это делать, если управлять фокусом должна сама форма

необязательно. Или делать базовую форму или делать базовые элементы. В данном случае, выбрали решение делать базовые элементы.

И судя по описаниям, сильно перестарались в этом, дав элементам сильно много ответственности.


Я вот только не пойму, как сделать ИЗНУТРИ КОНТРОЛА

Не знаю конкретики, но обычно есть метод для отрисовки в базов классе, вот его и не вызывать.


По идее, все сводилось к тому, чтобы иметь максимально простые формы.

alex445 коренной житель20.08.22 18:26
NEW 20.08.22 18:26 
в ответ AlexNek 20.08.22 17:49, Последний раз изменено 20.08.22 18:29 (alex445)

А вот формы-то как раз и не простые - в них тоже полно логики. Поэтому я и не понимаю, нафига передавать управление из формы в контролы лишь частично.


По сути, я вижу лишь одну главную ошибку, которая привела к этого дикому костылению - он придумал свои базовые типы и напихал туда бизнес-логику. После этого пошли множится костыли по цепочке: нужны свои контролы (тег-хелперы в MVC), нужны свои механизмы валидации и отображения ошибок (включая ручное применение стилей для этого - типа красных рабок вокруг контрола и прочих "эффектов"), нужны свои средства коммуникации между этими god-object-custom-basic-types. Надо было сделать всё на моделях, на которые ложится вся встроенная валидация, формы и прочее во всех нормальных фреймворках. Нет, он пошёл поперёк всех. Он обмолвился, что мол нужна кастомная валидация - типа проверить значение в БД. А что, свой атрибут валидации не может проверить значение в БД?


Ещё он почему-то называет паттерн, который использует, MVVC (Model-View-View Controller), а не MVC. И модель называет View Controller. Т.е. я вижу, что у него есть класс Чего-то_там_ViewController, который он натурально использует как модель в MVC-фреймворке. Я ещё первое время путался в названиях его классах и понять не мог - где модель-то?.. Т.е. модель у него тоже всё таки есть, но она состоит из кастомных базовых типов. И логика сидит частично в модели, частично в его типах.

AlexNek патриот20.08.22 18:53
AlexNek
NEW 20.08.22 18:53 
в ответ alex445 20.08.22 18:26
А вот формы-то как раз и не простые - в них тоже полно логики

Тогда немного странно


Он обмолвился, что мол нужна кастомная валидация

так что оригинальный разработчик под боком?


свой атрибут валидации не может проверить значение в БД

Каким образом? Данные и база в роде в разных местах. Или что под этим понималось?


Ещё он почему-то называет паттерн, который использует, MVVC (Model-View-View Controller)

видимо личное изобретение, не нахожу пока смущ

alex445 коренной житель20.08.22 20:45
NEW 20.08.22 20:45 
в ответ AlexNek 20.08.22 18:53, Последний раз изменено 21.08.22 01:43 (alex445)
так что оригинальный разработчик под боком?

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


Оригинальные разрабы, похоже, давно ушли. Связи с ними нет. А тот человек, что сейчас и уже давно переписывает, предлагает вот такой странный подход. При этом у него самого на его фреймворке почти ни одной работающей формы нет - там что-то по залогиниванию и какие-то наработки по основным формам, работающим с бизнес-логикой. Но у меня даже залогинивание не работает. Т.е. демонстрационного доказательства, что его подход работает и как, тоже нет. Вдобавок, он ещё и не пишет комменты к своему коду (почему и как что-то работает, зачем нужно). Лишь на словах поясняет и недавно я попросил типа инструкции написать. Общение с ним и заказчиком выглядит как череда писем и видеоконференций, где я по крупицам вытаскиваю подробности (с учётом некоторого недопонимания из-за моего корявого немецкого), из которых часто узнаю, что я не могу нормально использовать ту или иную удобную и очевидную штуку из Блейзор-фреймворка, т.к. у него там другой подход. Что, конечно, не добавляет энтузиазма.

alex445 коренной житель20.08.22 20:48
NEW 20.08.22 20:48 
в ответ AlexNek 20.08.22 18:53, Последний раз изменено 20.08.22 20:52 (alex445)
свой атрибут валидации не может проверить значение в БД
Каким образом? Данные и база в роде в разных местах. Или что под этим понималось?

Насколько я помню конкретные места, там юзер вводит обозначение объекта (что-то типа айди) в текстовое поле вручную, и валидация заключается в проверке, есть ли такой объект в БД. Если есть - открываем для редактирования следующие контролы формы, переводим фокус на один из этих контролов. Не вижу причин, почему это нельзя встроить в стандартную модель валидации через атрибуты. В атрибуте указать... да ничего не надо указывать - данные для соединения с БД и реквизиты текущего пользователя и так можно брать из приложения. Текущее значение поля берёшь и проверяешь, есть ли это значение в БД. И назвать атрибут как-то типа "ExistsInDatabase".

AlexNek патриот20.08.22 21:12
AlexNek
NEW 20.08.22 21:12 
в ответ alex445 20.08.22 20:45
Общение с ним и заказчиком выглядит как

Понятно, абидна канешна. Одному в грязи копаться неприятно. И перспективы мрачные.


предлагает вот такой странный подход

Пока все странности непонятны, но если неудобно, то видимо решение неудачное.


Но у меня даже залогинивание не работает

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

Подозреваю там тоже что то накрутили. Небось тоже всё своё?

AlexNek патриот20.08.22 21:14
AlexNek
NEW 20.08.22 21:14 
в ответ alex445 20.08.22 20:48
И назвать атрибут как-то типа "ExistsInDatabase".

Это был бы самый странный атрибут, для меня это никак не валидация

alex445 коренной житель20.08.22 21:30
NEW 20.08.22 21:30 
в ответ AlexNek 20.08.22 18:53
Ещё он почему-то называет паттерн, который использует, MVVC (Model-View-View Controller)

видимо личное изобретение, не нахожу пока смущ

Да всё понятно - контроллер обозвал контроллером представления. Не знаю, может по аналогии с MVVM. Но меня больше смутило то, что у него в контроллер передаётся объект типа BlahBlah_ViewController, который используется как модель. Вот тут уж точно что-то своё придумал. Ну или неудачно назвал. Ну он-то неудачно назвал, а я сижу и голову ломаю - "чё за херня тут происходит?", что не добавляет душевного спокойствия. ))

alex445 коренной житель20.08.22 21:32
NEW 20.08.22 21:32 
в ответ AlexNek 20.08.22 21:12, Последний раз изменено 21.08.22 00:32 (alex445)
И перспективы мрачные.

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


А это правда говорят, что после джобцентра первые полгода работодателю платит за меня фактически государство? Ну типа он берёт меня к себе на работу и рисков почти не несёт, по крайней мере денежных? Поэтому, мол, легко могут взять на пробецайт и после этого срока тут же уволить так же легко?

alex445 коренной житель20.08.22 21:36
NEW 20.08.22 21:36 
в ответ AlexNek 20.08.22 21:14
Это был бы самый странный атрибут, для меня это никак не валидация

Ну логика такая - если есть в БД, значит правильно ввёл. Программа по сути складская, только склад навороченный - товары гуляют по разным местам, и нужно, чтобы товар был в конкретном месте в конкретное время. Это сохраняется в таблицах БД. Т.е. товар путешествует по складу, и когда приходит куда-то - это событие сохраняется в БД. И оператор на каком-нибудь месте, когда запрашивает этот товар, должен получить подтверждение, что товар в этом месте есть - он вводит в поле типа номера товара, и если в нужной таблице в этот момент есть запись на этот номер, значит валидация прошла.

AlexNek патриот21.08.22 10:57
AlexNek
NEW 21.08.22 10:57 
в ответ alex445 20.08.22 21:32
что после джобцентра первые полгода работодателю платит за меня фактически государство?

Что значит - после джобцентра? После харц IV?

AlexNek патриот21.08.22 10:59
AlexNek
NEW 21.08.22 10:59 
в ответ alex445 20.08.22 21:36
и если в нужной таблице в этот момент есть запись на этот номер, значит валидация прошла.

никак не тянет это у меня это на валидацию жёстко привязанную к полю.

Срыв покровов патриот21.08.22 14:31
NEW 21.08.22 14:31 
в ответ alex445 20.08.22 21:32
А это правда говорят, что после джобцентра первые полгода работодателю платит за меня фактически государство?

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

alex445 коренной житель21.08.22 19:37
NEW 21.08.22 19:37 
в ответ AlexNek 21.08.22 10:57
Что значит - после джобцентра? После харц IV?

Да.

alex445 коренной житель21.08.22 19:40
NEW 21.08.22 19:40 
в ответ Срыв покровов 21.08.22 14:31, Последний раз изменено 21.08.22 19:40 (alex445)
А это правда говорят, что после джобцентра первые полгода работодателю платит за меня фактически государство?
Такая возможность есть, но оно должно быть соответсвенно оформлено.
Но оно больше для безнадёжных случаев: типа предпенсионный безработный водитель погрузчика.

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


Это важно, т.к. по сути может объяснить, что меня взяли лишь чтобы срубить денег. И почему держат весь пробный срок (полгода). Спустя полгода видно будет - если оставят, значит либо денег от джобцентра работодатель не получил, либо я ему всё же как-то выгоден и без выплат от государства.

alex445 коренной житель21.08.22 19:45
NEW 21.08.22 19:45 
в ответ AlexNek 21.08.22 10:59
и если в нужной таблице в этот момент есть запись на этот номер, значит валидация прошла.

никак не тянет это у меня это на валидацию жёстко привязанную к полю.

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


Почему не тянет? "Введённое значение должно быть в определённой таблице БД" - чем не проверка (валидация)? "Определённая таблица БД" - это может быть таблица типа "содержимое складской комнаты номер такой-то".


Как я говорил, там типа склада (ну и производство к нему) с движущимися по нему товарами. Как я понял, движение товара не хранится постоянно в оперативке, а на каждой точке маршрута сохраняется в БД. И оператор в определённой форме вводит значение и нужна проверка - есть ли товар в определённой точке. Можно проверять длину строки, можно диапазон чисел, а можно наличие в определённом месте.

AlexNek патриот21.08.22 21:11
AlexNek
NEW 21.08.22 21:11 
в ответ alex445 21.08.22 19:45
приписать его к полю.
а можно наличие товара в определённом месте

Поле и объект никак не могут быть связаны вместе.


Тем более зачем атрибут для проверки наличия?

alex445 коренной житель22.08.22 00:30
NEW 22.08.22 00:30 
в ответ AlexNek 21.08.22 21:11, Последний раз изменено 22.08.22 00:30 (alex445)

Связаны в том смысле, что у любого объекта этого типа данное поле должно проверяться на наличие в таблице БД, когда пытаешься ввести это поле.


Можно не атрибут, можно функцию. Но любую логику можно поместить куда угодно. А раз у нас валидация в атрибутах - почему бы и эту проверку туда не поместить? Тем более, что эта проверка отвечает логике работы формы - если ввели что-то неправильно, то форму подтвердить нельзя. Вот и тут - если товара в нужном месте нет, то введённое поле будет неправильным, и форму нельзя будет подтвердить.

AlexNek патриот22.08.22 12:13
AlexNek
NEW 22.08.22 12:13 
в ответ alex445 22.08.22 00:30
если товара в нужном месте нет, то введённое поле будет неправильным, и форму нельзя будет подтвердить.

Возможно вопрос философский, но наличие товара не должно сказываться на валидности формы.

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

alex445 коренной житель22.08.22 12:22
NEW 22.08.22 12:22 
в ответ AlexNek 22.08.22 12:13

Других подробностей не знаю. В старом приложении так сделано - проверка на наличие в определённой таблице. Мне думать об их решениях не очень хочется, да и за это не платят - у них и так куча странностей и костылей, как я уже писал, так что подобные проверки-валидации меня даже не удивляют. Им надо, чтобы я старую логику повторил с новым интерфейсом и с подходами их текущего главного разработчика.

AlexNek патриот22.08.22 12:29
AlexNek
NEW 22.08.22 12:29 
в ответ alex445 22.08.22 12:22
Им надо

Ну тогда нужно есть кактусы и молчать в тряпочку улыб


Хотя да, пар выпускать тоже надо.

alex445 коренной житель22.08.22 13:29
NEW 22.08.22 13:29 
в ответ AlexNek 20.08.22 21:12, Последний раз изменено 22.08.22 13:30 (alex445)
Но у меня даже залогинивание не работает
Я бы начал именно с этого, либо с части которая точно не требует данные пользователя.
Подозреваю там тоже что то накрутили. Небось тоже всё своё?

В коде человека, который сейчас там главный (но не изначальный автор программы), полно опечаток в именах переменных и классов. Ну ладно, когда назвал с опечаткой, но использует-то тоже потом всегда с опечаткой - неужели не замечает? Ну ок, можно и с опечатками использовать - главное, чтобы она потом в именах везде повторялась. А вот сейчас встретил такое в переменной, которая потом в CSS пойдёт


expanded = "fasle"


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

alex445 коренной житель22.08.22 13:31
NEW 22.08.22 13:31 
в ответ AlexNek 22.08.22 12:29
Им надо

Ну тогда нужно есть кактусы и молчать в тряпочку улыб


Хотя да, пар выпускать тоже надо.

Ну да. Я тут подтираю иногда слишком сильный пар. ))

alex445 коренной житель22.08.22 14:51
NEW 22.08.22 14:51 
в ответ alex445 22.08.22 13:31, Последний раз изменено 22.08.22 14:58 (alex445)

Ещё у их программиста зачем-то заведено перечисление со взаимоисключающими вариантами


Enabled,

Disabled, - аналогичен HTML attribute "disabled" и применяется в их программе, если нет прав доступа

Hidden, - прямо мапится на CSS visibility

Collapsed - прямо мапится на CSS visibility


Нафига делать три варианта недоступности компонента? Не проще тогда уж рисовать и не рисовать его? Т.е. если имеешь права доступа - рисуем, не имеешь - не рисуем. Зачем юзеру знать, что вот есть ещё контролы, которые ему недоступны, т.к. прав нет? Disabled-контролы же рисуются, только недоступными. По мне, disabled-атрибут применяется не для разграничения прав, а если контрол недоступен в процессе редактирования - например, неправильно что-то ввёл в форму - кнопка подтверждения недоступна. А для прав - проще вообще этот контрол не рисовать. Но у человека какая-то своя логика.

Murr патриот22.08.22 15:10
Murr
NEW 22.08.22 15:10 
в ответ AlexNek 20.08.22 21:12

либо с части которая точно не требует данные пользователя.

-----

У него проверка допустимости использования контрола в базе контрола прописана... спок

Murr патриот22.08.22 15:13
Murr
NEW 22.08.22 15:13 
в ответ alex445 18.08.22 00:47

А без паблик сеттера, но с паблик методом установки - необычное.

------

Поработал бы с Жабой - было бы обычным...

alex445 коренной житель22.08.22 15:13
NEW 22.08.22 15:13 
в ответ alex445 22.08.22 14:51, Последний раз изменено 22.08.22 15:19 (alex445)

Во, ещё нашёл - он обрабатывает это перечисление двумя if:


if(Invisible)

else if(Collapsed)


и в зависимости от этого добавляет стили. Но ниже ещё проверки идут


if(Enabled)

else if(Disabled)


и опять стили применяет. При этом эти две ветки проверок идут независимо поочереди. Но ведь перечисление-то взаимоисключаемое!


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


Похоже, он использует перечисление просто как хранилище кучи малосвязанных друг с другом значений.


Не говоря уже о том, что такая обработка в разы раздувает код. Было бы два булевых свойства, то все проверки были бы однострочные (через тот же ?: оператор или просто через ==), а так он городит if-else на полэкрана кода.

alex445 коренной житель22.08.22 15:16
NEW 22.08.22 15:16 
в ответ Murr 22.08.22 15:13

А без паблик сеттера, но с паблик методом установки - необычное.

------

Поработал бы с Жабой - было бы обычным...

В Жабе вроде вообще испокон веков сеттеры и геттеры методами реализовывались, нет? Не знаю, есть ли у них сейчас аналоги шарповских свойств. Но в том-то и дело, что если бы были чисто методы или чисто свойства - вопросов нет. А когда мешают в кучу разные подходы - где консистентность? Начинаешь думать, что за этим стоит какое-то тайное знание, высшая логика, недоступная простым смертным. А чаще оказывается, что чел намудрил что-то, неподумав, да так и оставил.

Murr патриот22.08.22 15:16
Murr
NEW 22.08.22 15:16 
в ответ alex445 22.08.22 14:51

Не проще тогда уж рисовать и не рисовать его?

-----

???

Три варианта:

- передаем на клиента и рисуем

- передаем на клиента и не рисуем

- не передаем на клиента

Что непонятного то?

alex445 коренной житель22.08.22 15:23
NEW 22.08.22 15:23 
в ответ Murr 22.08.22 15:16, Последний раз изменено 22.08.22 15:28 (alex445)
Три варианта:
- передаем на клиента и рисуем
- передаем на клиента и не рисуем
- не передаем на клиента
Что непонятного то?

Непонятно то, что разбирая логику этого, видишь, что оно не используется так, а используется по сути два несвязанных набора данных в одном наборе (энуме) - как я выше сказал. Т.е. в реальности оно используется как два независимых варианта по два зависимых варианта:


Два варианта:


- Два варианта:

-- передаём и рисуем;

-- передаём и рисуем недоступным;


- Два варианта:

-- передаём и не рисуем;

-- передаём и не рисуем (но по-другому).


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

Программист коренной житель22.08.22 15:54
NEW 22.08.22 15:54 
в ответ alex445 22.08.22 14:51
Нафига делать три варианта недоступности компонента? Не проще тогда уж рисовать и не рисовать его?

Ну это вроде очевидно:

Disabled - элемент виден, но неактивен

Hidden - элемент не виден, но для него зарезервировано место.

Collapsed - элемент не виден и его место "свернуто"

alex445 коренной житель22.08.22 17:51
NEW 22.08.22 17:51 
в ответ Программист 22.08.22 15:54, Сообщение удалено 22.08.22 18:09 (alex445)
alex445 коренной житель22.08.22 18:05
NEW 22.08.22 18:05 
в ответ alex445 22.08.22 17:51, Последний раз изменено 22.08.22 18:17 (alex445)

Вобщем, как выглядит моя обёртка (часть кода) над кастомным базовым типом строки StringDataItem Data


public enum VisibilityEnum
{
    Enabled, Disabled, Hidden, Collapsed,
}

public class InputTextComponent : ComponentBase
{
    [Parameter]
    public StringDataItem Data { get; set; } // custom string data type

    string Value
    {
        get => Data.Value; // I can read the value only through this property...
        set => Data.SetValue(value); // and set it only through this methode.
    }

    bool Disabled => Data.VisibleStyle == VisibilityEnum.Disabled; // used with "disabled" HTML attribute

    string Visibility => Data.VisibleStyle switch
    {
        VisibilityEnum.Collapsed => "collapse", // Bootstrap style class
        VisibilityEnum.Hidden => "invisible", // Bootstrap style class
        _ => string.Empty,
    };
}


И как я использую это в разметке для своего строкового компонента для ввода (часть кода)


<input type="text" @bind="Value" disabled="@Disabled" class="@Visibility" />


alex445 коренной житель22.08.22 18:10
NEW 22.08.22 18:10 
в ответ alex445 22.08.22 18:05, Последний раз изменено 22.08.22 18:17 (alex445)

И как могло бы выглядеть, не будь этих извращений - два варианта с Collapsed. Я уже не говорю о том, что без этих извращений вообще бы не нужно было свой компонент делать, а сразу использовать готовые из Блейзор и его валидацию для форм.


public class InputTextComponent : ComponentBase
{
    [Parameter]
    public string Data { get; set; }

    [Parameter]
    bool Disabled { get; set; }
    
    [Parameter]
    string Collapsed { get; set; };
    [Parameter]
    bool Collapsed2 { get; set; }
}

<input type="text" @bind="Data" disabled="@Disabled" class="@Collapsed" />

if(!Collapsed2)
{
    <input type="text" @bind="Data" disabled="@Disabled"/>
}
Срыв покровов патриот23.08.22 06:49
NEW 23.08.22 06:49 
в ответ alex445 22.08.22 18:05
disabled="@Disabled"

а вот тут тебя ждёт сюрприз ХТМЛ

Для браузера Disabled=false это то же самое что просто disabled 🤕

alex445 коренной житель23.08.22 10:13
NEW 23.08.22 10:13 
в ответ Срыв покровов 23.08.22 06:49

Знаю. Но в Блейзор гарантирон умный подход к этому делу - раздел "Special cases".


Единственное, что в Блейзоре пока нельзя или сложно-костыльно сделать - также классы стилей добавлять, как атрибуты. И ладно бы просто перечислять в атрибуте class эти классы, типа


class="@ButtonCss @ButtonPrimaryCss"


но там ещё заморочки со встроенными стилями всяких InputBase-элементов, которые надо конкатенировать с вот такими своими стилями. Но вроде если приписать к какому-нибудь InputText стилевой класс таким образом - работает. Я до конца пока не понял - конкатенируются ли стили из свойства CssClass и мои собственные, добавленные способом выше.

alex445 коренной житель23.08.22 15:29
NEW 23.08.22 15:29 
в ответ alex445 23.08.22 10:13, Последний раз изменено 23.08.22 17:08 (alex445)

Всё больше и больше странностей. Вот на форме есть кнопка подтверждения ввода логина и пароля. Логин, пароль, команда подтверждения - всё это его (изобретателя своего фреймворка с кастомными базовыми типами) собственные типы - два кастомных базовых и один - команда, которая тоже от такого типа унаследована. Как я говорил, суть всех этих типов - они вроде как сами управляются внутренним кодом. Но! У них куча делегатов, которые нужно все наприсвоить, чтобы они управлялись! Т.е. они конечно внутри управляются, но логику надо дать им снаружи!


Далее, чтобы определить, например, состояние кнопки (доступна, недоступна) и присвоить соответствующий стиль, нужно дать этой кнопке делегат, в логике которого анализируется состояние других кастомных типов (логина и пароля) - установлены они или нет. И если установлены - то кнопка переключит себя в состояние "доступно"... А нельзя туда-сюда не гонять логику, а оставить её всю на уровне модели для формы залогинивания? Я ведь и так на уровне модели формы определяю эту логику - зачем мне её передавать кнопке, чтобы она своё состояние поменяла? Модель формы и поменяет.

alex445 коренной житель23.08.22 15:34
NEW 23.08.22 15:34 
в ответ alex445 23.08.22 15:29, Последний раз изменено 23.08.22 17:11 (alex445)

А, ещё немного запутаннее. Мало установить делегат, который определит состояние кнопки. Я же ещё и выполнить должен его! А как выполнить? А у этой кнопки (точнее, у кастомного объекта команды для этой кнопки) есть спец метод "Установить текущий стиль". Этот метод просто вызывает установленный делегат.


Т.е. я из формы беру объект команды кнопки, устанавливаю этой команде делегаты (по стилю, ещё много какие), а затем вызываю эти делегаты спецметодом. Т.е. всё управление кнопкой делается снаружи. А нафига тогда тащить эту логику в кнопку, нафига кнопке знать, как её валидируют, ставят ей стили и прочее?


У него на каждый такой кастомный базовый тип по хелперу для рисования HTML-тегов сделано. Т.е. в формах он не разные там < input > использует, а свои кастомные хелперы на каждое значение. И все эти хелперы ещё и сохраняют своё состояние - т.е. банально всё содержимое его кастомного базового типа сохраняется в хранилище, чтобы пережить HTTP-сессию... Может, из-за этого весь сыр-бор? Ну типа на форме компоненты меняют своё значение, обновляются, но всё происходит через HTTP запросы, которые не помнят состояния. И он придумал, как для каждого значения сохранить это состояние. Но это же бред - такая модель реализуется на MVVM фреймворках типа Angular или ещё каких, с частничным обновлением UI через ajax (ну или в Блейзор такое с поддержкой состояний из коробки идёт), но уж точно не требует кастомных базовых типов. А человек просто написал свой фреймворк.

alex445 коренной житель23.08.22 16:06
NEW 23.08.22 16:06 
в ответ alex445 23.08.22 15:34, Последний раз изменено 23.08.22 16:07 (alex445)

И чего я пока ещё не понял - а нахрена два разных гуя иметь - на ASP.NET MVC и Blazor? Если уж переписываем, то на какой-то один, и не привязываемся одну платформу к ограничениям другой через свои мудрёные "универсальные" базовые типы и модельки. Вот есть логика в старом приложении - я её вытаскиваю и привязываю к новому гую. Зачем мне в вашу трясину с ASP.NET MVC лезть и разбираться в ваших извращениях с состояниями?.. Надо бы задать этот вопрос. Самый прикол будет, если там какая-то мутная схема, мало связанная с быстрым успешным решением задачи, а моя часть - подпевать и не отсвечивать о явных нестыковках. Но прямо об этом никто не говорит. Бывает такое? Вот, например, Мурр участвовал в подобных проектах?

AlexNek патриот23.08.22 17:52
AlexNek
NEW 23.08.22 17:52 
в ответ alex445 23.08.22 16:06
а моя часть - подпевать и не отсвечивать о явных нестыковках

Очень возможно. Можно попробовать спросить, а почему так?

alex445 коренной житель24.08.22 01:27
NEW 24.08.22 01:27 
в ответ AlexNek 23.08.22 17:52

Да я уже пробовал спрашивать, зачем мол ваши типы использовать. А мне он ответил что-то типа - а для привязок (что там в ASP.NET MVC за сложности с привязками, что надо что-то кастомное городить?) и для разных кастомных валидаторов, типа проверки наличия в БД. Ну и ещё у него в его типах поддержка состояния через какое-то хранилище, которое переживает HTTP сессии. Ну и чтобы бизнес-логику отделить от представления.


Так в Блейзор привязки из коробки идут, как и поддержка состояния. Проблемы с кастомной валидацией не вижу. Как и с изоляцией бизнес-логики. В упор не вижу, зачем мне его запутанный фреймворк. Но мне намекают, что надо делать, что требует заказчик, а не самодельничать. Сказали сделать с использованием его кастомных типов и подходов - делай. Я решил, что попробую по-ихнему реализовать сначала, потом покажу, что их типы применительно к Блейзор не решаеют никаких задач, а лишь усложняют всё.

AlexNek патриот24.08.22 12:17
AlexNek
NEW 24.08.22 12:17 
в ответ alex445 24.08.22 01:27
Но мне намекают, что надо делать, что требует заказчик, а не самодельничать

Ну если не удаётся переубедить, то приходится только следовать указаниям. хммм

alex445 коренной житель24.08.22 13:33
NEW 24.08.22 13:33 
в ответ AlexNek 24.08.22 12:17

А не напомните - в ASP.NET MVC никаких привязок нет? Насколько помню, там при формировании разметки вы расставляете элементы, в которые вставляете данные из модели, но в обратную сторону если модель нужно обновить - только через HTML-запрос с параметрами. Так? Т.е. ничего подобного двусторонним привязкам WPF или Blazor нет?


Если так, то пожалуй становится понятно, почему такие навороты. Ещё и попытка поддержать состояния своих "контролов". Всё это в Блейзор просто не нужно, т.к. есть из коробки. Надо всё же попробовать их убедить, а то они не знают, как работает Блейзор, и навязывают свои костыли, а я долго не мог понять, что за тайная логика за этими костылями стоит, что нужно обязательно ей следовать.

AlexNek патриот24.08.22 17:11
AlexNek
NEW 24.08.22 17:11 
в ответ alex445 24.08.22 13:33
А не напомните

Всё что помню - фигово было смущ

https://www.tutorialsteacher.com/mvc/model-binding-in-asp....

alex445 коренной житель24.08.22 17:47
NEW 24.08.22 17:47 
в ответ AlexNek 24.08.22 17:11, Последний раз изменено 24.08.22 17:48 (alex445)

Так это не байндинг. Я, кажется, вспомнил - в ASP.NET MVC по шаблонам роутинга вы парсите полученную HTTP-строку адреса с параметрами, передаёте её в контроллер, где эти параметры мапятся на параметры контроллера, а контроллер затем уже использует эти параметры для отдачи их модели или ещё как. В Блейзор же именно привязки - большая часть работы по маппингу данных между слоями проходит под капотом, а вы лишь указываете, что к чему привязывать.


Вобщем, кажется, я понял - чел изобрёл свой statefull фреймворк на базе stateless ASP.NET MVC. Отсюда все эти кастомные типы, кастомные тег-хелперы с поддержкой состояний и прочий бред. Я щас пытаюсь Блейзор натянуть на этот его подход - вот один в один у меня состояние. Но чтобы убедить их, что у них какой-то лажовый подход, нужно эту лажу попытаться сделать и показать им, какой бред получился. Без этого что-то они не догоняют.

alex445 коренной житель24.08.22 19:43
NEW 24.08.22 19:43 
в ответ alex445 24.08.22 17:47

То, что в Блейзор сотворили с байндингами - это конечно полный трындец. По сравнению с тем же WPF. Штуки 4 вида байндингов, и на каждый вариант - свой синтаксис и условности. Не как в WPF - забайндил и выбрал вариант (односторонний, двусторонний и т.п.).

AlexNek патриот25.08.22 12:19
AlexNek
NEW 25.08.22 12:19 
в ответ alex445 24.08.22 19:43
То, что в Блейзор сотворили с байндингами - это конечно полный трындец.

Как то, пока, не замечаю проблем. Можно подробнее?

alex445 коренной житель25.08.22 14:16
NEW 25.08.22 14:16 
в ответ AlexNek 25.08.22 12:19, Последний раз изменено 25.08.22 14:29 (alex445)

Байндинги в Блейзор:


one-way between view and view model (or code behind for view) of the same component:

@PropName - in view


two-way between view and view model of the same component:

@bind-PropName - in view


two-way between two components:

Parameter + EventCallback + code that invokes the event callback - in code behind of the child component

<ChildComponent @bind-ChildPropName="parentFieldOrProperty" @bind-PropName:event="ChildEventCallback"> - in view of the parent component


Специально выделил жирным в последней строчке - жонглирование именами членов двух компонентов.


Плюс всякие неочевидные тонкости, о которых надо знать, типа


"Generally, avoid creating components that write directly to their own component parameters. For more information, see ASP.NET Core Razor components."


Т.е. у вас есть свойство с атрибутом "параметр", но вы не можете в него писать. Нужно свойство-обёртку для него сделать:


[Parameter]
public string? ChildMessage { get; set; }

private string BoundValue
{
    get => ChildMessage ?? string.Empty;
    set => ChildMessageChanged.InvokeAsync(value);
}


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


В который раз убеждаюсь, что лучше читать оригинальный МСДН. Там тьюториалы тоже иногда замудрёно написаны, но хотя бы актуальная информация и примеры есть.

alex445 коренной житель25.08.22 14:26
NEW 25.08.22 14:26 
в ответ alex445 25.08.22 14:16, Последний раз изменено 25.08.22 14:29 (alex445)

one-way between view and view model (or code behind for view) of the same component:

@PropName - in view


two-way between view and view model of the same component:

@bind-PropName - in view


two-way between two components:

Parameter + EventCallback + code that invokes the event callback - in code behind of the child component

<ChildComponent @bind-ChildPropName="parentFieldOrProperty" @bind-PropName:event="ChildEventCallback"> - in view of the parent component

Сравните эти портянки с WPF-скими байндингами. Там лишь в коде надо реализовать INotifyPropertyCHanged, а в разметке всё просто указывается, плюс вариант байндинга.


Когда надо связать иерархию компонентов, то что в Блейзор, что в ВПФ начинается акробатика: в Блейзор начинаем пробрасывать значения по иерархии компонентов посредством тонн кода, а в ВПФ - жонглировать с разными расширениями разметки по поиску таргета для байндинга в иерархии контролов.

AlexNek патриот25.08.22 17:20
AlexNek
NEW 25.08.22 17:20 
в ответ alex445 25.08.22 14:16
специально выделил жирным в последней строчке - жонглирование именами членов двух компонентов.

Ничего не понял - называй как хочешь.

Всё равно ни вижу никаких проблем. смущ


alex445 коренной житель25.08.22 20:59
NEW 25.08.22 20:59 
в ответ AlexNek 25.08.22 17:20
Ничего не понял - называй как хочешь.

Просто показал, насколько дохрена условностей и мелочей надо учитывать и держать в голове, а также писать простыней, чтобы привязать ОДНО свойство между компонентами.

AlexNek патриот25.08.22 21:32
AlexNek
NEW 25.08.22 21:32 
в ответ alex445 25.08.22 20:59
насколько дохрена условностей и мелочей надо учитывать и держать в голове

Хмм, как то не задумывался о этом, и думаю, в будущем беспокоится не буду смущ

alex445 коренной житель25.08.22 21:53
NEW 25.08.22 21:53 
в ответ AlexNek 25.08.22 21:32

Всеядный, значит. Без претензий. ))

AlexNek патриот25.08.22 22:00
AlexNek
NEW 25.08.22 22:00 
в ответ alex445 25.08.22 21:53
Всеядный, значит. Без претензий.

не всеядный и с претензиями бебе (но другого плана)

1 2 3 4 5 6 7 8 9 10 все