Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/55: Рейтинг темы: голосов - 55, средняя оценка - 4.53
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2

Использование Code Behind Окна: допустимо и, если да, то в каких случаях?

17.01.2021, 13:04. Показов 13382. Ответов 167
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Тема создана из исходной Генерация имён при генерации элементов

Собственно вопрос данной темы это сообщение:
Цитата Сообщение от kotelok Посмотреть сообщение
Но в некоторых сценариях эта гонка за идеальной архитектурой усложняет код и/или провоцирует перенос логики из View во VM.
Предыдущие посты приведены, чтобы было понятно откуда взялся этот вопрос.

Прошу воспринимать тему не как "Священные войны", а попытку разобраться в этом вопросе, когда на практике не совсем понятна цель "запрета" на использование CB.
Особенно интересует мнение тех кто реально работает программистом в софтверной компании и знает на практики нюансы коллективной, корпоративной работы, проблемы поддержки выпущенного софта.
Возьму на себя смелость специально "пригласить": Usaga, Rius, kolorotur, Рядовой, proa33, novikov.ea, escoult.

Цитата Сообщение от Wiis Посмотреть сообщение
как для каждой пиццы и её элементов генерировать новое имя, если засунуть шаблон в цикл?
Сам шаблон:
Для начала изучить азы WPF.
В WPF есть шаблоны элементов и шаблоны данных.
А то, что вы показали - это чёрт знает, что. Но точно не шаблон.
Шаблоны задаются ИСКЛЮЧИТЕЛЬНО на XAML.
XAML - это основной язык WPF.
Code Behind в WPF не используется. Он должен оставаться пустым.
Вообще забудьте, что он существует и никогда даже не открывайте файлы "*.xaml.cs".
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.01.2021, 13:04
Ответы с готовыми решениями:

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

В каких случаях оправданно использование локальных классов?
Здравствуйте. Вопрос: в каких случаях оправданно использование локальных классов? Или когда нужно использовать локальные классы? Какие есть...

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

167
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
23.01.2021, 17:39
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
который не стыдно будет показать другим, в том числе возможным работодателям
И младшим коллегам. Приходит новичок, ему выдают твои старые проекты для мелкого сопровождения, и поначалу приходится чуть ли ни на каждой задаче объяснять человеку, что используемые там решения не стоит рассматривать в качестве правильного подхода и применять в будущем, что этот код (и по архитектуре, и по оформлению) следствие моей неопытности в те времена, и далее приводить правильные примеры, дабы человек уловил разницу.

Потому как понимаешь, что сейчас научишь (примером своего древнего говнокода) человека плохому, а у него потом жизнь не сложится, ибо он банально собеседования не сможет пройти и ему придётся драгоценное время тратить на переучивание.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
23.01.2021, 17:41  [ТС]
Цитата Сообщение от kotelok Посмотреть сообщение
ему выдают твои старые проекты
У меня самого куча такого говнокода в загашниках...


Добавлено через 48 секунд
Смотрю на него и думаю, как меня вообще мысль посетила создать такое творенье...
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
23.01.2021, 18:32
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Мне подобные правила не подходят.
Соглашения об именовании и оформлении кода, применение паттернов и организация проектов определённым образом - это, по сути, тоже часть языка. Не конкретного языка программирования, а языка общения между программистами. Это упрощает коммуникацию, облегчает понимание кода, снижает риски ошибок при внесении изменений. Эти правила, ведь, не просто для развлечения придумали, а именно с целью упрощения работы.

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

А учитывая, что программного кода пишется очень много, и что регулярно приходится изучать/модифицировать чужие библиотеки (внутренние проекты, внешние бибилотеки на гите, исходники фреймворков), то страшно подумать, насколько это было бы больно, если бы сообщество не придерживалось определённых правил.
3
18 / 18 / 1
Регистрация: 18.01.2021
Сообщений: 183
Записей в блоге: 8
23.01.2021, 18:37
120
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Ну, это только лишнее подтверждение вашей квалификации.
Может быть. Повторю ещё раз.
Для моего шаблона построения прикладного приложения характерно динамическая работа с функкционалом (реализованном в UserControl). Запуская приложение из класса MainWindow формируется объект MainWindow, содержащий и визуализацию, и данные, и методы, и обработчики событий. Всё что необходимо.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
namespace ns_Решение {
  public enum e_Права : int {
    ГруппыПодстановка, ГруппыРедактирование,                    //-- 00
    . . .    
  }
  interface I_Плитка {
    void uc_ЗапросДанных();
    . . .
  }
  interface IMainWindow {
    void uc_Добавить(string ucName, Object obj);  //-- добавить новую панель (UserControl) 
    void uc_Удалить();                            //-- удаление панели (UserControl) 
    . . .  
  }
 
  public partial class MainWindow : Window, IMainWindow, I_Плитка {
    public Guid pk_Guid = гп.gd_0;
    private DispatcherTimer dpt;
    private int iPgbFrm;         //-- Счетчик прогрессбара
    private UserControl ucNew;
    private UserControl x_uc;
    private string ucName;
    private Object oUC;
    private bool bl_Фильтр = false;
    string caption_Entity = "Работа с базой данных Хранилища";
По завершинию инициализации имеем объект MainWindow. На этом этапе есть классы UserControl, но не существует объектов UserControl.
По требованию пользователя происходит построение (инициализация) объекта UserControl. Объект содержит всё необходимое для фунционирования. По завершению работы объект UserControl уничтожается со всеми занятами ресурсами и управление получает графическая оболочка MainWindow.
Если функционал (реализованный одним объектом UserControl) реализован кучей объектов, как потом эту кучу уничтожать?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
23.01.2021, 18:52  [ТС]
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Для моего шаблона построения прикладного приложения характерно динамическая работа с функкционалом (реализованном в UserControl)
Начнём с того, что у вас просто нет шаблона.
Если есть, то сформируйте его правила и обоснуйте их теоретически.
Вы программируете "как левая нога захочет".

Цитата Сообщение от Burlak1951 Посмотреть сообщение
Есть классы UserControl но не существует объектов UserControl.
Что такое "классы", и что такое "объекты"?
Вы даже азы терминологии не удосужились выучить.

Цитата Сообщение от Burlak1951 Посмотреть сообщение
Объект содержит всё необходимое для фунционирования. По завершению работы объект UserControl уничтожается со всеми занятами ресурсами и управление получает графическая оболочка MainWindow.
А что с того?
UserControl - это тоже UI элемент.
Во-первых, согласно принципов ООП в нём не должно быть кода не относящегося к GUI. То есть код для доступа к данным, работы с ним должен быть инкапсулирован в отдельном объекте.
Во-вторых, если вы не используете в Окне этот UseControl, то зачем его, вообще, создаёте?

Добавлено через 7 минут
Burlak1951, вы пишите как вы делаете, как для вас лично лучше.
Но тема же о другом.
Тема о качественном коде, не в вашем личном восприятии, а в принятом в сообществе C# программистов.
С вашим кодом, я даже особенности WPF не вижу смысла обсуждать.
Просто, в целом для C#, ваш код неприемлемого качества.
0
18 / 18 / 1
Регистрация: 18.01.2021
Сообщений: 183
Записей в блоге: 8
23.01.2021, 20:22
125
Цитата Сообщение от Элд Хасп Посмотреть сообщение
...Если есть, то сформируйте его правила и обоснуйте их теоретически.
Смотрим здесь. Шаблон создаётся из проекта. Почему Вы не требуете у Microsoft теоретического обоснования?
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Что такое "классы", и что такое "объекты"?
Вы даже азы терминологии не удосужились выучить.
Почитайте здесь.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Во-первых, согласно принципов ООП в нём не должно быть кода не относящегося к GUI. То есть код для доступа к данным, работы с ним должен быть инкапсулирован в отдельном объекте.
Подтвердите сиё ссылкой на то, откуда Вы это взяли. Здесь я этого не увидел.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Во-вторых, если вы не используете в Окне этот UseControl, то зачем его, вообще, создаёте?
Вы о чем? Функционал, к примеру, реализованный UserControl uc_Отделы дает пользователю работать с сущностями справочника Отделы. Когда, к примеру, ему потребуется работать с сушностями Группы, он завершит работу с сущностями Отделы (тем самым уничтожив объектuc_Отделы) и инициализирует объект uc_Группы
0
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
23.01.2021, 20:25
У меня был пример, когда "очень" нужно было впихнуть невпихуемое - библиотеку, очень слабо поддерживающую методологию паттерна MVVM в боевой проект, который целиком и полностью был построен на MVVM без CB. Именно в этот момент были созданы классы обёртки над этими решениями, которые работали с CB, максимально инкапсулируя это всё внутри, выдавая интерфейсы нашим компонентам. Поэтому, всё же, бывают такие экстраординарные сценарии, когда без CB не обойтись.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
23.01.2021, 20:50  [ТС]
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Смотрим здесь. Шаблон создаётся из проекта. Почему Вы не требуете у Microsoft теоретического обоснования?
Я в ауте....
Вы похоже русский язык плохо знаете?
"Шаблон" - 2. перен. Общеизвестный, избитый образец, трафарет (в 3 знач.),к-рому подражают. Сочинять по шаблону.
Шаблон - может быть лекалом раскройки ткани.
Может быть - образцом Проекта. Это то на что вы дали ссылки.
А может быть образцом архитектуры ООП приложения - это то о чём мы всю эту тему говорим.
И к архитектуре приложения шаблон проекта имеет не большее отношение чем лекало для кройки ткани.

Добавлено через 1 минуту
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Почитайте здесь.
И какие вы сделали вывода?
Чем отличается класс от объекта?
0
46 / 128 / 11
Регистрация: 24.04.2019
Сообщений: 941
23.01.2021, 20:57
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Функционал, к примеру, реализованный UserControl uc_Отделы дает пользователю работать с сущностями справочника Отделы. Когда, к примеру, ему потребуется работать с сушностями Группы, он завершит работу с сущностями Отделы (тем самым уничтожив объектuc_Отделы) и инициализирует объект uc_Группы
Идея интересная, но она настолько не вписывается в ШАБЛОНЫ АРХИТЕКТУРЫ ООП ПРИЛОЖЕНИЯ, что не найдет здесь отклика. Зачем вы спорите и что хотите доказать?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
23.01.2021, 21:10  [ТС]
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Подтвердите сиё ссылкой на то, откуда Вы это взяли. Здесь я этого не увидел.
Я вам уже дал по вашей же ссылке цитату.
См.: а) Абстракция - воспримаю, как взаимодействие объектов которые описывают модель чего либо.
И ещё раз пишу (раз в цатый) - WPF это не инструмент построения ПРИЛОЖЕНИЯ.
Это всего лишь средство создания GUI.
А GUI это единицы процентов от приложения в целом.

И проблема у вас не с WPF - до него вы ещё "не доросли".
У вас проблема просто с любым C# приложением.
Если вы делали Формы, то вот вам тема Архитектура ПО в WinForms (FAQ & HowTo).
Были ли ваши Формы с такой архитектурой?
Я на 100% уверен, что нет.
Я на 100% уверен, что даже Консольное приложение из ваших рук это свалка кривых костылей.

Вы понятия не имеете об архитектуре (шаблоне, паттерне) приложений ООП.
И даже не хотите приложить малейшего усилия для их изучения.
То есть вы не просто неуч, а неуч упорствующий в своём незнании: "У меня и так всё работает! Нечего мне там учить!".
Вы даже элементарные Правила Именования не можете соблюдать по какой-то надуманной причине.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
23.01.2021, 21:10  [ТС]
Цитата Сообщение от Bespridelschic Посмотреть сообщение
Поэтому, всё же, бывают такие экстраординарные сценарии, когда без CB не обойтись.
Конечно, бывают задачи когда проще сделать в CB.
Но не бывает когда можно сделать, только в CB.

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

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

Вот с CB так же или нет?
0
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
23.01.2021, 23:12
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Конечно, бывают задачи когда проще сделать в CB.
Но не бывает когда можно сделать, только в CB.
Практически всегда проще написать код в CB, вместо того что бы разнести его по нужным классам, ViewModel'ам, и прочим потрясающим штукам, позволяющим многократно снизить сложность поддержки кода. Но слишком высока цена изменений, которые рано или поздно наступят в будущем, при разрастании кодовой базы. В задаче, что я упомянул выше, была именно та самая ситуация, когда без CB невозможно было обойтись. Но ввиду упомянутых тезисов, были приложены существенные усилия что бы не возникла чрезвычайная сложность поддержки написанного кода в будущем.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
В тех случаях, когда используется CB Окна, хотя и несколько сложнее по количеству кода можно сделать и без CB, можно ли такой код считать КАЧЕСТВЕННЫМ, хорошим (то есть прозрачным, легко читаемым и понятным, не нарушающим ни каких правил ООП и Net и т.д.)?
Или всё таки это упрощение за счёт ухудшения качества.
Нет однозначного ответа, по моему мнению. Правила ООП можно трактовать по разному. Внутри CB мы можем писать вполне сносный код, который можно считать "тру ООП'шным". Но к этому нужно приложить много больше усилий. Этот код будет и читаемым, и чистым, и, вероятно, даже поддерживаемым в будущем, по крайней мере до некоторого момента. Но это не панацея.

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

Чаще всего, следование MVVM, как и следование MVC, MVP, и другим архитектурным паттернам, позволяет управлять сложностью кодовой базы (хотя бывают исключения, когда за дело берётся пока ещё не опытный инженер ). Мы можем добавлять новый функционал, тестировать наши Model/VM части без View, иметь достаточно прозрачные связи модулей, и предоставлять интерфейс для View, который будет независим от неё, что может положительно сыграть при реализации моделей, которые будут использоваться в других типах приложений. Но не нужно это всё пихать в проекты, на подобии студенческих лабораторных. Обычно здравомыслящий человек доходит до этого в момент, когда глядя на код, ты понимаешь что придётся перелопатить весь проект, чтобы просто добавить условный новый пункт меню.
4
18 / 18 / 1
Регистрация: 18.01.2021
Сообщений: 183
Записей в блоге: 8
23.01.2021, 23:25
129
Цитата Сообщение от Дмитрий_1982 Посмотреть сообщение
Идея интересная...
В соответствии с этой идеей попытался построить программное обеспечение (ПО) компьютерной информационной системы (КИС).
Весь функционал ПО КИС реализуется прикладными приложениями (реализуюся в средах Delphi, C#-WF, C#-WPF,...). Приложения:
а) могут разрабатываться в разных конторах на АРХИТЕКТУРАХ
б) не должны инсталлироваться
в) должны принимать параметры запуска (args[])
Приложения хранятся на сервере. По требованию переносятся на клиентский компьютер (возможно берутся из локального кеша) и запускаются. По завершению удаляются из памяти клиентского компьютера.
Мне не приятно, когда частное (вариант) возводится в абсолют и безальтернативно навязывается. И измы, измы...
0
46 / 128 / 11
Регистрация: 24.04.2019
Сообщений: 941
24.01.2021, 11:04
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы понятия не имеете об архитектуре (шаблоне, паттерне) приложений ООП
На самом деле Burlak1951 использует паттерн, сам того не подозревая. Называется "интеллектуальный интерфейс". Но этот паттерн считается анти паттерном.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
24.01.2021, 12:54  [ТС]
Цитата Сообщение от Bespridelschic Посмотреть сообщение
Правила ООП можно трактовать по разному. Внутри CB мы можем писать вполне сносный код, который можно считать "тру ООП'шным".
Давайте рассмотрим пару принципов ООП:
АБСТРАКЦИЯ для выделения в моделируемом предмете важного для решения конкретной задачи по предмету, в конечном счёте — контекстное понимание предмета, формализуемое в виде класса;

ИНКАПСУЛЯЦИЯ для быстрой и безопасной организации собственно иерархической управляемости: чтобы было достаточно простой команды «что делать», без одновременного уточнения как именно делать, так как это уже другой уровень управления;
И из SOLID:
Принцип единственной ответственности (single responsibility principle)
Для каждого класса должно быть определено единственное назначение. Все ресурсы, необходимые для его осуществления, должны быть инкапсулированы в этот класс и подчинены только этой задаче.

Принцип инверсии зависимостей (dependency inversion principle)
«Зависимость на Абстракциях. Нет зависимости на что-то конкретное»[9].
Какой код в CB UI элемента (в том числе Окна и UserControl) допустим?
Функция 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) - это очень низкокачественный код.

Цитата Сообщение от Дмитрий_1982 Посмотреть сообщение
На самом деле Burlak1951 использует паттерн, сам того не подозревая. Называется "интеллектуальный интерфейс". Но этот паттерн считается анти паттерном.
C# - это язык ООП и, соответственно, приложение на нём должны так же реализовываться по паттернам ООП для архитектуры приложений.
То есть в данном случае, он хоть формально и использует C#, но по сути он пользуется только его синтаксисом.
И для удобного ему стиля скорее всего лучше подойдёт другой ЯП не так строго заточенный по ОПП как C#.
0
46 / 128 / 11
Регистрация: 24.04.2019
Сообщений: 941
24.01.2021, 13:07
Цитата Сообщение от Элд Хасп Посмотреть сообщение
приложение на нём должны так же реализовываться по паттернам ООП
"Интеллектуальный пользовательский интерфейс" это паттерн ООП. Использовался в ASP.NET Forms на заре его развития. Впоследствии заменен на паттерн MVC. Я бы не стал так категорично его отметать. Да, приложение, написанное с использованием этого паттерна трудно расширять, поддерживать и тестировать, но он идеально подходит, когда программисту с низкой квалификацией нужно создать простое приложение.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
24.01.2021, 13:26  [ТС]
Цитата Сообщение от Bespridelschic Посмотреть сообщение
Практически всегда проще написать код в CB,
Дополню ещё рассмотрением особенностей ООП решений именно для GUI на WPF.
У 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 минут
Цитата Сообщение от Дмитрий_1982 Посмотреть сообщение
"Интеллектуальный пользовательский интерфейс" это паттерн ООП.
Возможно. Честно говоря, я даже за него не знаю.
Но дело даже не в самом паттерне.

В чём нарушение ООП используемом в стиле Burlak1951?
Это работа с данными в CB Окна и, как следствие, нарушение абстракции и инкапсуляции.
Причём никакой насущной необходимости в этом нет.
Без каких либо значительных изменений весь его код можно вынести из CB и инкапсулировать друг от друга детали GUI и БЛ.
Почему он так делает?
Нет никаких объяснений. Скорее всего просто потому, что по другому не умеет.

Если "Интеллектуальный пользовательский интерфейс" это паттерн ООП, то наверное его реализация всё же не предполагает нарушение основных принципов ООП.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
24.01.2021, 13:37  [ТС]
Цитата Сообщение от Burlak1951 Посмотреть сообщение
В соответствии с этой идеей попытался построить программное обеспечение (ПО) компьютерной информационной системы (КИС).
Давайте с взглянем с другой стороны.

Мы рассматриваем особенности реализации одних и тех же задач двумя разными способами.
Кто может аргументированно и квалифицированно ответить на такие вопросы?
Как минимум у такого человека (эксперта) должны быть знания о том как реализовывать задачи обоими способами и опыт реализации одних и тех же задач обоими способами.

Все в этой теме (кроме вас) кто рассуждает об этом имеют такие знания и опыт.

А теперь вопрос к вам.
Достаточно ли (по вашему мнению) у вас знаний для реализации ВСЕХ ваших задач без использование Code Behind?
Можете ли вы показать ваш опыт реализации одной и той же задачи обоими способами?
Вот туже КИС вы реализовали в CB, а покажите как вы её реализовали без использования оного.

Если же у вас нет нужных знаний и опыта, то все ваши аргументы это аналог совкового "Не читал, но осуждаю!".
0
46 / 128 / 11
Регистрация: 24.04.2019
Сообщений: 941
24.01.2021, 13:43
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если "Интеллектуальный пользовательский интерфейс" это паттерн ООП, то наверное его реализация всё же не предполагает нарушение основных принципов ООП.
Конечно. Реализация предполагает использование других паттернов, таких как репозиторий, одиночка и т. д. У Burlak1951 этого нет.
1
18 / 18 / 1
Регистрация: 18.01.2021
Сообщений: 183
Записей в блоге: 8
24.01.2021, 14:03
135
Цитата Сообщение от Элд Хасп Посмотреть сообщение
И для C# (не только для WPF) - это очень низкокачественный код.
Может быть. Рассмотрим конкретный пример взаимодействия UserControl. Ваш вариант здесь.
У меня для получения данных из базы функционалу панели (UserControl) необходимо выполнить запрос (SELECT) к хранимой процедуре:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    //-- SELECT 
    //====================================================================================
    public void ЗапросДанных() {
      if (!bl_Разрешение) return;
      try {
        wspErr = null; bl_Разрешение = false;
        string _str = str_ОтделПФ.Trim();
 
        //-- выполнение хранимой процедуры
        wsp.sp_Параметры(2);            //-- Построение параметров хранимой процедуры
        wsp.sp_Параметр("str_Отдел", (string.IsNullOrEmpty(_str)) ? DBNull.Value : (object)(_str + "%"));
        wsp.sp_Параметр("int_Limit", гп.max_Выборка);
        xrow = null; lst_Entity = null; lst_Entity = new List<row_Entity>();
        wsp.Entity_SP("au_Отделы_sel", wsp.sp_Sel, RowToEntity); if ((wspErr = wsp.wspErr) != null) return;
 
        dgv_Entity.ItemsSource = null;
        if (lst_Entity != null) {
          //-- Флаг размера выборки
          lbl_ФРВ.Visibility = (lst_Entity.Count >= гп.max_Выборка) ? Visibility.Visible : Visibility.Hidden;
          oc_Entity = new ObservableCollection<row_Entity>(lst_Entity); lst_Entity = null;
          dgv_Entity.ItemsSource = oc_Entity; if (oc_Entity.Count != 0) dgv_Entity.SelectedIndex = 0;
        }
      }
      catch (Exception ex) { wspErr = ex.Message; }
      finally {
        if (wspErr != null) { MessageBox.Show(wspErr, caption_Entity, MessageBoxButton.OK); }
        wspErr = null; bl_Разрешение = true;     //-- Разрешение выполнения функционала компонент
      }
    }
Для запроса необходим текстовый фрагмент фильтра (для LIKE) - str_Отдел. Параметры фильтра задаются в UserControl фильтра (для фильтра Отделы в uc_Отделы_Фильтр). Нажимая кнопку Фильтр в панели Отделы дозагружаем в Окно (MainWindow) панель фильтра:
C#
1
2
3
4
5
    //-- ФИЛЬТР
    //=========
    private void btc_Фильтр_Click(object sender, RoutedEventArgs e) {
      if (!bl_Разрешение) return; при.uc_ДобавитьФ("uc_Отделы_Фильтр", this);
    }
Панель uc_Отделы_Фильтр содержит поле txb_ОтделПФ.Text. Пользователь вводит необходимый фрагмент и нажимает кнопку Выбор:
C#
1
2
3
4
5
6
7
8
9
10
11
namespace ns_Решение {
  public partial class uc_Отделы_Фильтр : UserControl, I_Плитка {
    IMainWindow при;  //-- интерфейс MainWindow
    Object зак;
    string caption_Entity = "Работа с фильтром Отделы";
    . . .
    private void btc_Выбор_Click(object sender, RoutedEventArgs e) {
      (зак as I_Плитка).uc_Подстановка("uc_Отделы_Фильтр", this);
      при.uc_Удалить();         //-- Удалить верхнюю (активную) панель
    }
. . .
Метод данной панели вызывает метод интерфейса uc_Подстановка панели uc_Отделы. В этом и заключается реализация взаимодействия двух панелей - вызов метода интерфейса.
C#
1
2
3
4
5
6
7
    //-- ПОДСТАНОВКА
    //================
    public void uc_Подстановка(string name, Object obj) {
      if (name == "uc_Отделы_Фильтр") {
        str_ОтделПФ = (obj as uc_Отделы_Фильтр).txb_ОтделПФ.Text; bl_Разрешение = true;  ЗапросДанных();
      }
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.01.2021, 14:03

В каких случаях использовать обращение self::, а в каких $this. В чём разница между ними?
Привет! Сейчас пишу регистрацию в стиле ооп. Пишу функцию __construct в классе Registration class Registration{ protected $Name; ...

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

В каких случаях нужно создавать динамические переменные, а в каких статические?
такой же вопрос и по массивам ! Объясните пожалуйста !

В каких случаях нужно использовать подключаемый уровень, а в каких автономный
Добрый день. Изучаю материал по работе с ADO.NET и у меня возник такой вопрос: 1.- В каких случаях нужно использовать подключаемый...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
140
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
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 и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru