|
Модератор
|
|||
Использование Code Behind Окна: допустимо и, если да, то в каких случаях?17.01.2021, 13:04. Показов 13382. Ответов 167
Метки нет (Все метки)
Тема создана из исходной Генерация имён при генерации элементов
Собственно вопрос данной темы это сообщение: Прошу воспринимать тему не как "Священные войны", а попытку разобраться в этом вопросе, когда на практике не совсем понятна цель "запрета" на использование CB. Особенно интересует мнение тех кто реально работает программистом в софтверной компании и знает на практики нюансы коллективной, корпоративной работы, проблемы поддержки выпущенного софта. Возьму на себя смелость специально "пригласить": Usaga, Rius, kolorotur, Рядовой, proa33, novikov.ea, escoult. В WPF есть шаблоны элементов и шаблоны данных. А то, что вы показали - это чёрт знает, что. Но точно не шаблон. Шаблоны задаются ИСКЛЮЧИТЕЛЬНО на XAML. XAML - это основной язык WPF. Code Behind в WPF не используется. Он должен оставаться пустым. Вообще забудьте, что он существует и никогда даже не открывайте файлы "*.xaml.cs".
0
|
|||
| 17.01.2021, 13:04 | |
|
Ответы с готовыми решениями:
167
Написание GUI руками, без привлечения специализированных фреймворков - нужно ли и если да, то в каких случаях? |
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
|
||
| 23.01.2021, 17:39 | ||
|
Потому как понимаешь, что сейчас научишь (примером своего древнего говнокода) человека плохому, а у него потом жизнь не сложится, ибо он банально собеседования не сможет пройти и ему придётся драгоценное время тратить на переучивание.
0
|
||
|
Модератор
|
||
| 23.01.2021, 17:41 [ТС] | ||
![]() Добавлено через 48 секунд Смотрю на него и думаю, как меня вообще мысль посетила создать такое творенье...
0
|
||
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
|
||
| 23.01.2021, 18:32 | ||
|
Можно, например, писать на русском языке с вкраплениями транслита или даже иностранных слов, записанных на другом языке, можно использовать подчёркивания вместо пробелов, а перед знаками препинания ставить пробелы, можно каждое слово писать с новой строки. И да, такой текст "будет работать", т.е. при желании его можно будет прочесть и понять. Но это очень усложнит процесс. А если потребуется ещё и вносить изменения в такой текст, то придётся либо досконально изучить вот этот вот странный стиль конкретного автора и научиться его повторять, либо вносить изменения в своём стиле, и тогда текст станет ещё сложнее для восприятия, т.к. в нём будет намешано множество разные стилей оформления. А учитывая, что программного кода пишется очень много, и что регулярно приходится изучать/модифицировать чужие библиотеки (внутренние проекты, внешние бибилотеки на гите, исходники фреймворков), то страшно подумать, насколько это было бы больно, если бы сообщество не придерживалось определённых правил.
3
|
||
| 23.01.2021, 18:37 | |||||||
|
120
Для моего шаблона построения прикладного приложения характерно динамическая работа с функкционалом (реализованном в UserControl). Запуская приложение из класса MainWindow формируется объект MainWindow, содержащий и визуализацию, и данные, и методы, и обработчики событий. Всё что необходимо.
По требованию пользователя происходит построение (инициализация) объекта UserControl. Объект содержит всё необходимое для фунционирования. По завершению работы объект UserControl уничтожается со всеми занятами ресурсами и управление получает графическая оболочка MainWindow. Если функционал (реализованный одним объектом UserControl) реализован кучей объектов, как потом эту кучу уничтожать?
0
|
|||||||
|
Модератор
|
||||
| 23.01.2021, 18:52 [ТС] | ||||
|
Если есть, то сформируйте его правила и обоснуйте их теоретически. Вы программируете "как левая нога захочет". Вы даже азы терминологии не удосужились выучить. UserControl - это тоже UI элемент. Во-первых, согласно принципов ООП в нём не должно быть кода не относящегося к GUI. То есть код для доступа к данным, работы с ним должен быть инкапсулирован в отдельном объекте. Во-вторых, если вы не используете в Окне этот UseControl, то зачем его, вообще, создаёте? Добавлено через 7 минут Burlak1951, вы пишите как вы делаете, как для вас лично лучше. Но тема же о другом. Тема о качественном коде, не в вашем личном восприятии, а в принятом в сообществе C# программистов. С вашим кодом, я даже особенности WPF не вижу смысла обсуждать. Просто, в целом для C#, ваш код неприемлемого качества.
0
|
||||
| 23.01.2021, 20:22 | |||||
|
125
0
|
|||||
|
Wanna be serious
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
|
|
| 23.01.2021, 20:25 | |
|
У меня был пример, когда "очень" нужно было впихнуть невпихуемое - библиотеку, очень слабо поддерживающую методологию паттерна MVVM в боевой проект, который целиком и полностью был построен на MVVM без CB. Именно в этот момент были созданы классы обёртки над этими решениями, которые работали с CB, максимально инкапсулируя это всё внутри, выдавая интерфейсы нашим компонентам. Поэтому, всё же, бывают такие экстраординарные сценарии, когда без CB не обойтись.
1
|
|
|
Модератор
|
|||
| 23.01.2021, 20:50 [ТС] | |||
|
Вы похоже русский язык плохо знаете? "Шаблон" - 2. перен. Общеизвестный, избитый образец, трафарет (в 3 знач.),к-рому подражают. Сочинять по шаблону.Шаблон - может быть лекалом раскройки ткани. Может быть - образцом Проекта. Это то на что вы дали ссылки. А может быть образцом архитектуры ООП приложения - это то о чём мы всю эту тему говорим. И к архитектуре приложения шаблон проекта имеет не большее отношение чем лекало для кройки ткани. Добавлено через 1 минуту Чем отличается класс от объекта?
0
|
|||
|
46 / 128 / 11
Регистрация: 24.04.2019
Сообщений: 941
|
||
| 23.01.2021, 20:57 | ||
|
0
|
||
|
Модератор
|
||
| 23.01.2021, 21:10 [ТС] | ||
|
См.: а) Абстракция - воспримаю, как взаимодействие объектов которые описывают модель чего либо. И ещё раз пишу (раз в цатый) - WPF это не инструмент построения ПРИЛОЖЕНИЯ. Это всего лишь средство создания GUI. А GUI это единицы процентов от приложения в целом. И проблема у вас не с WPF - до него вы ещё "не доросли". У вас проблема просто с любым C# приложением. Если вы делали Формы, то вот вам тема Архитектура ПО в WinForms (FAQ & HowTo). Были ли ваши Формы с такой архитектурой? Я на 100% уверен, что нет. Я на 100% уверен, что даже Консольное приложение из ваших рук это свалка кривых костылей. Вы понятия не имеете об архитектуре (шаблоне, паттерне) приложений ООП. И даже не хотите приложить малейшего усилия для их изучения. То есть вы не просто неуч, а неуч упорствующий в своём незнании: "У меня и так всё работает! Нечего мне там учить!". Вы даже элементарные Правила Именования не можете соблюдать по какой-то надуманной причине.
1
|
||
|
Модератор
|
||
| 23.01.2021, 21:10 [ТС] | ||
|
Но не бывает когда можно сделать, только в CB. Но вопрос несколько в другом. В тех случаях, когда используется CB Окна, хотя и несколько сложнее по количеству кода можно сделать и без CB, можно ли такой код считать КАЧЕСТВЕННЫМ, хорошим (то есть прозрачным, легко читаемым и понятным, не нарушающим ни каких правил ООП и Net и т.д.)? Или всё таки это упрощение за счёт ухудшения качества. Допустим, проще создавать код без тегов XML документации. На создание этих тегов порой требуется времени и сил больше чем на создание самого исполнительного кода. Но код с такими тегами однозначно качественнее чем без оных. Вот с CB так же или нет?
0
|
||
|
Wanna be serious
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
|
||||
| 23.01.2021, 23:12 | ||||
|
Чаще всего, следование MVVM, как и следование MVC, MVP, и другим архитектурным паттернам, позволяет управлять сложностью кодовой базы (хотя бывают исключения, когда за дело берётся пока ещё не опытный инженер ). Мы можем добавлять новый функционал, тестировать наши Model/VM части без View, иметь достаточно прозрачные связи модулей, и предоставлять интерфейс для View, который будет независим от неё, что может положительно сыграть при реализации моделей, которые будут использоваться в других типах приложений. Но не нужно это всё пихать в проекты, на подобии студенческих лабораторных. Обычно здравомыслящий человек доходит до этого в момент, когда глядя на код, ты понимаешь что придётся перелопатить весь проект, чтобы просто добавить условный новый пункт меню.
4
|
||||
| 23.01.2021, 23:25 | ||
|
129
Весь функционал ПО КИС реализуется прикладными приложениями (реализуюся в средах Delphi, C#-WF, C#-WPF,...). Приложения: а) могут разрабатываться в разных конторах на АРХИТЕКТУРАХ б) не должны инсталлироваться в) должны принимать параметры запуска (args[]) Приложения хранятся на сервере. По требованию переносятся на клиентский компьютер (возможно берутся из локального кеша) и запускаются. По завершению удаляются из памяти клиентского компьютера. Мне не приятно, когда частное (вариант) возводится в абсолют и безальтернативно навязывается. И измы, измы...
0
|
||
|
46 / 128 / 11
Регистрация: 24.04.2019
Сообщений: 941
|
||
| 24.01.2021, 11:04 | ||
|
1
|
||
|
Модератор
|
|||||
| 24.01.2021, 12:54 [ТС] | |||||
Функция UI элемента - это отображение образов (отражений) данных. И, согласно вышеуказанного, это должно оставаться единственной функцией UI элемента. Поэтому в CB (без нарушения ООП) допустим только код работающий UI элементом и вложенными в него. И код работающий с образом данных (по простому с VM) которые представляет этот UI элемент. Допустим получение значения свойства VM или вызов метода VM. Любой код в CB, работающий непосредственно с данными (получение их, сохранение, какая-то БЛ, модификация и т.д.) - это нарушение ООП. Теперь по и этим же принципам ООП рассмотрим, что допустимо для поставщика данных для UI элементов - ViewModel. Функция VM - отразить исходные данные в удобном для View виде и передать действия из View в слой работающий с данными (Модели). И любой код не относящийся к этой функции - это нарушение ООП. Так же все детали VM должны быть скрыты (инкапсулированы) от View и Model. А их детали инкапсулированы от VM. Тем самым, если мы рассматриваем приложение с пользовательским интерфейсом в целом, для реализации его по правилам ООП мы автоматически приходим к трёхзвенной архитектуре. Для WPF - это MVVM, для Форм и Консоли - MVC/MVP. Даже если не устраивают эти паттерны, то они должны быть заменены другим также содержащим не менее трёх звеньев. Всё это к вашей фразе Внутри CB мы можем писать вполне сносный код, который можно считать "тру ООП'шным".Если взять с чего началась данная дискуссия - это пример от kotelok. Он рассматривает случай когда в CB идёт обработка значений UI элементов и обращение к VM. Такой код не нарушает ОПП - поэтому и вопросы об ООП не подымались. Речь шла только о том, что тоже самое можно сделать (пусть несколько сложнее) и без использования CB. И задавался вопрос практикующим профессиональным программистам: Как всё же лучше? Вопросы об ООП поднялись только в ответ на сообщения от Burlak1951. Его код в CB работает непосредственно с данными. То есть он нарушает принципы абстракции, инкапсуляции, единственной ответственности и др. Следовательно его код, вообще, не может считаться кодом ООП. Да он работает, но это не ООП. И для C# (не только для WPF) - это очень низкокачественный код. То есть в данном случае, он хоть формально и использует C#, но по сути он пользуется только его синтаксисом. И для удобного ему стиля скорее всего лучше подойдёт другой ЯП не так строго заточенный по ОПП как C#.
0
|
|||||
|
46 / 128 / 11
Регистрация: 24.04.2019
Сообщений: 941
|
||
| 24.01.2021, 13:07 | ||
|
1
|
||
|
Модератор
|
|||
| 24.01.2021, 13:26 [ТС] | |||
|
У WPF есть несколько ключевых отличий. Но большая их часть касается его графических решений. С точки зрения же ООП для решения в целом, главной особенностью WPF является встроенные возможности по получению данных. С точки зрения архитектуры Net основным отличием WPF элементов является введение нового базового класса DependencyObject. Все WPF элементы производные от него, а не от Object напрямую. А смысл в DO только один - возможность задания DependencyProperty. Дальше по наследованию - все WPF элементы производные от FrameworkElement. А у FrameworkElement добавлено специальной свойство для Контекста Данных, метод для задания привязок SetBinding и автоматическое использование привязками источником по умолчанию Контекста Данных. Из вышесказанного следует, что ПРАВИЛЬНО оформленное GUI на WPF должно получать основную часть данных через Контекст Данных, а основным способом получения значений из данных для свойств UI элементов должны быть привязки с источником по умолчанию, то есть к Контексту Данных. Поэтому даже когда в CB требуется получить контейнер отражающий данные (в том числе ViewModel) надо его получать оттуда откуда он доступен и UI элементам: Контекст Данных (основные данные), XAML Ресурсы (дополнительные данные, объекты), статические свойства и поля (для некоторых особенных случае. Расширение разметки, например). С этой точки зрения, получение в CB контейнера, отражающего данные, недоступного для UI элементов в XAML не нарушает ООП, но как бы выглядит криво, некрасиво для концепции WPF. Добавлено через 8 минут Но дело даже не в самом паттерне. В чём нарушение ООП используемом в стиле Burlak1951? Это работа с данными в CB Окна и, как следствие, нарушение абстракции и инкапсуляции. Причём никакой насущной необходимости в этом нет. Без каких либо значительных изменений весь его код можно вынести из CB и инкапсулировать друг от друга детали GUI и БЛ. Почему он так делает? Нет никаких объяснений. Скорее всего просто потому, что по другому не умеет. Если "Интеллектуальный пользовательский интерфейс" это паттерн ООП, то наверное его реализация всё же не предполагает нарушение основных принципов ООП.
0
|
|||
|
Модератор
|
||
| 24.01.2021, 13:37 [ТС] | ||
|
Мы рассматриваем особенности реализации одних и тех же задач двумя разными способами. Кто может аргументированно и квалифицированно ответить на такие вопросы? Как минимум у такого человека (эксперта) должны быть знания о том как реализовывать задачи обоими способами и опыт реализации одних и тех же задач обоими способами. Все в этой теме (кроме вас) кто рассуждает об этом имеют такие знания и опыт. А теперь вопрос к вам. Достаточно ли (по вашему мнению) у вас знаний для реализации ВСЕХ ваших задач без использование Code Behind? Можете ли вы показать ваш опыт реализации одной и той же задачи обоими способами? Вот туже КИС вы реализовали в CB, а покажите как вы её реализовали без использования оного. Если же у вас нет нужных знаний и опыта, то все ваши аргументы это аналог совкового "Не читал, но осуждаю!".
0
|
||
|
46 / 128 / 11
Регистрация: 24.04.2019
Сообщений: 941
|
||
| 24.01.2021, 13:43 | ||
|
1
|
||
| 24.01.2021, 14:03 | ||||||||||||||||||||||
|
135
У меня для получения данных из базы функционалу панели (UserControl) необходимо выполнить запрос (SELECT) к хранимой процедуре:
0
|
||||||||||||||||||||||
| 24.01.2021, 14:03 | |
|
В каких случаях использовать обращение self::, а в каких $this. В чём разница между ними? В каких случаях уместно применять F-критерий, а в каких - эмпирическое корреляционное отношение?
В каких случаях нужно использовать подключаемый уровень, а в каких автономный В каких случаях надо создавать индексы к полям, а в каких - нет? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|