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

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

17.01.2021, 13:04. Показов 13440. Ответов 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
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
24.01.2021, 14:18  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Может быть. Рассмотрим конкретный пример взаимодействия UserControl. Ваш вариант здесь.
Это учебный пример для разъяснения механизма событий Net используемого в MVVM.

Добавлено через 4 минуты
Цитата Сообщение от Burlak1951 Посмотреть сообщение
У меня для получения данных из базы функционалу панели (UserControl) необходимо выполнить запрос (SELECT) к хранимой процедуре:
Главный вопрос, для чего вы всё это излагаете?

Вы хотите обоснованность, что ваш код работает? В этом никто не сомневается.

Речь же совсем об ином о создании КАЧЕСТВЕННОГО C# кода приложения с WPF GUI.
Какое отношение к этому имеют все ваши аргументы?

Вы даже не хотите соблюдать официальные для Net Правила Именования.
Без их соблюдения код не может считаться КАЧЕСТВЕННЫМ.
То есть вас не заботит качество вашего кода.

Так зачем все эти ваши разъяснения?

Добавлено через 3 минуты
Цитата Сообщение от Burlak1951 Посмотреть сообщение
У меня для получения данных из базы функционалу панели (UserControl) необходимо выполнить запрос (SELECT) к хранимой процедуре:
НЕТ!
UI элементу (а UC это такой же UI элемент как все остальные) НЕ МОЖЕТ требоваться "выполнить запрос...".
UI элементы в WPF получают нужные им для представления образы данных по ПРИВЯЗКАМ (Binding).
Покажите хоть ОДНУ ПРИВЯЗКУ в вашем коде.

Добавлено через 2 минуты
Весь WPF с точки зрения данных был создан ТОЛЬКО ДЛЯ ИСПОЛЬЗОВАНИЯ ПРИВЯЗОК.
Это единственная добавленная в DependencyObject функция.
Все остальные "вертятся" вокруг неё и построены на её использовании.

Добавлено через 2 минуты
Просто перевод на русский DependencyObject - "Объект зависимости".
Зависимости задаются ПРИВЯЗКАМИ.
0
18 / 18 / 1
Регистрация: 18.01.2021
Сообщений: 183
Записей в блоге: 8
24.01.2021, 14:42
139
Цитата Сообщение от Дмитрий_1982 Посмотреть сообщение
Конечно. Реализация предполагает использование других паттернов, таких как репозиторий, одиночка и т. д. У Burlak1951 этого нет.
Реализация не предполагает использование ни-ка-ких паттернов (1, 2).
На мой взгляд паттерн MVVM нарушает фундаментальный принцип бритвы Оккама «Не следует множить сущее без необходимости».
MVVM создаёт кучу (часто ненужного), а потом героически с эти курятником разбирается. Я предпочитаю заранее распихать свё по своим местам.
Что получается? Сравните два кода взаимодействия панелей.

Добавлено через 15 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Покажите хоть ОДНУ ПРИВЯЗКУ в вашем коде.
XML
1
2
3
4
      <DataGrid.Columns>
        <DataGridCheckBoxColumn x:Name="chb_Entity" Binding="{Binding Path=chb_Entity,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="М" IsThreeState="True"/>
        <DataGridTextColumn x:Name="str_Отдел" Binding="{Binding Path=str_Отдел,Mode=TwoWay, UpdateSourceTrigger=LostFocus}" Header="Отделы" FontWeight="Bold" Width="201"/>
      </DataGrid.Columns>
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
24.01.2021, 14:59  [ТС]
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Реализация не предполагает использование ни-ка-ких паттернов (1, 2).
По первой ссылке Общие сведения о WPF - это именно ОБЩИЕ то есть НАЧАЛЬНЫЕ сведения о самом WPF как инструменте построения GUI.
Но ни как не как о инструменте построения ПРИЛОЖЕНИЯ.

В этой же статье есть единственный пункт касающийся не только GUI, а приложения в целом привязка данных:
Чтобы упростить разработку приложений, платформа WPF предоставляет механизм привязки данных для автоматического выполнения этих действий. Основной элемент механизма привязки данных — класс Binding , задачей которого является привязка элемента управления (целевого объекта привязки) к объекту данных (источнику привязки).
В примере показан код с использование Контекста Данных.
Покажите где в вашем коде вы используете Контекст Данных и Привязки (Binding) к нему.

По второй ссылке METANIT.COM | Руководство по WPF, в основном описывается так же архитектура GUI.
Но не только. Прочитайте главы:
Глава 5. DependencyObject и свойства зависимостей
Глава 6. Модель событий в WPF
Глава 7. Команды
Глава 10. Привязка
Глава 13. Шаблоны элементов управления
Глава 14. Работа с данными
Глава 21. Паттерн MVVM
Глава 22. SQLite в WPF | MVVM и SQLite

Добавлено через 2 минуты
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Покажите хоть ОДНУ ПРИВЯЗКУ в вашем коде.
Это привязки итемов к элементам коллекции.
Я просил показать привязку самих UI элементов, а не их вложенных итемов.
Где вот эта привязка?
XML
1
    <DataGrid ItemsSource="{Binding ....}"...>
Добавлено через 8 минут
Burlak1951, ещё раз повторяю вопрос:
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Главный вопрос, для чего вы всё это излагаете?
Вы хотите обоснованность, что ваш код работает? В этом никто не сомневается.
Речь же совсем об ином о создании КАЧЕСТВЕННОГО C# кода приложения с WPF GUI.
Какое отношение к этому имеют все ваши аргументы?
Вы даже не хотите соблюдать официальные для Net Правила Именования.
Без их соблюдения код не может считаться КАЧЕСТВЕННЫМ.
То есть вас не заботит качество вашего кода.
Так зачем все эти ваши разъяснения?
0
18 / 18 / 1
Регистрация: 18.01.2021
Сообщений: 183
Записей в блоге: 8
24.01.2021, 15:49
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Где вот эта привязка?
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_Ent ity); lst_Entity = null;
dgv_Entity.ItemsSource = oc_Entity; if (oc_Entity.Count != 0) dgv_Entity.SelectedIndex = 0;
}

Добавлено через 5 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
...для чего вы всё это излагаете?
есть другой мир.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но не только. Прочитайте главы:
И где там написано, что я ОБЯЗАН использовать Ваш подход? Вы чаем не преподаватель?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
24.01.2021, 16:29  [ТС]
Цитата Сообщение от Burlak1951 Посмотреть сообщение
dgv_Entity.ItemsSource = null;
Привязка - это не КРАСИВОЕ СЛОВО.
Это экземпляр объекта (или класса) Binding.
Покажите где вы задаёте Контекст Данных, то есть значение свойству DataContext и где у вас Привязка (Binding) к нему.

Цитата Сообщение от Burlak1951 Посмотреть сообщение
И где там написано, что я ОБЯЗАН использовать Ваш подход? Вы чаем не преподаватель?
Я нигде не пишу, что вы ОБЯЗАННЫ соблюдать какие-либо правила.
Напротив, я несколько раз писал, что что вы можете делать как вам заблогарусудится.

Речь идёт только об оценке качестве кода.
Качество вашего кода - ниже плинтуса.
Даже не в концепции WPF, а просто для C#.
Но вас ваш код устраивает - ну, и слава богу!

Я только не пойму зачем вы здесь, в этой теме что-то пишите, если вопросы КАЧЕСТВА кода вас не интересуют?

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Главный вопрос, для чего вы всё это излагаете?

Вы хотите обоснованность, что ваш код работает? В этом никто не сомневается.

Речь же совсем об ином о создании КАЧЕСТВЕННОГО C# кода приложения с WPF GUI.
Какое отношение к этому имеют все ваши аргументы?

Вы даже не хотите соблюдать официальные для Net Правила Именования.
Без их соблюдения код не может считаться КАЧЕСТВЕННЫМ.
То есть вас не заботит качество вашего кода.

Так зачем все эти ваши разъяснения?
0
18 / 18 / 1
Регистрация: 18.01.2021
Сообщений: 183
Записей в блоге: 8
24.01.2021, 17:10
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Покажите где вы задаёте Контекст Данных, то есть значение свойству DataContext и где у вас Привязка (Binding) к нему.
Он мне не нужен. Вспомните бритву Оккама.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
24.01.2021, 17:23  [ТС]
Цитата Сообщение от Bespridelschic Посмотреть сообщение
По моему опыту, я чаще всего встречаюсь с самодокументирующимся кодом.
Забыл уточнить: А что такое "самодокументирующийся код"?

Пример документирования моего кода: Простые реализации: Базовый класс для ViewModel - BaseInpc

Добавлено через 4 минуты
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Он мне не нужен. Вспомните бритву Оккама.
А вспомните для чего создавался DependecyObject.
Бриву Окаму оставьте ему самому - Умные слова смысл которых до вас самого не дошёл.
В данном случае, все ваши аргументы вызваны только желанием оправдать отсутствие у вас базовых знаний.
Вы просто не знаете азов и пытаетесь при этом "скорчить хорошую мину": "А оно мне и не надо!".

Если это не так, то покажите, что вы УМЕЕТЕ реализовать туже самую задачу без использования CB.
И только потом вы сможете аргументировать сравнив два этих варианта, почему конкретно для этой задачи вариант с CB лучше.

Добавлено через 6 минут
Цитата Сообщение от Burlak1951 Посмотреть сообщение
бритву Оккама.
Бритва Оккама:
Однако важно помнить, что бритва Оккама не аксиома, а презумпция, то есть она не запрещает более сложные объяснения в принципе, а лишь рекомендует порядок рассмотрения гипотез, который в большинстве случаев является наилучшим.
В полном соответствии с этим принципом: Покажите два варианта сделанные вами лично и обоснуйте на этих реализациях их преимущества и недостатки.
1
Wanna be serious
 Аватар для Bespridelschic
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
24.01.2021, 17:54
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Забыл уточнить: А что такое "самодокументирующийся код"?
Код, читая который, понимаешь что происходит, и для чего он нужен. По сути всё сводится к грамотному наименованию методов, полей и других конструкций, и прозрачной логике.
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
24.01.2021, 18:07  [ТС]
Цитата Сообщение от Bespridelschic Посмотреть сообщение
Код, читая который, понимаешь что происходит, и для чего он нужен.
Ок! Понял.
Но это скорее для "внутреннего потребления".
Для публичного, тех же Net пакетов, нужно явное документирование.
0
18 / 18 / 1
Регистрация: 18.01.2021
Сообщений: 183
Записей в блоге: 8
24.01.2021, 18:54
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В полном соответствии с этим принципом: Покажите два варианта сделанные вами лично и обоснуйте на этих реализациях их преимущества и недостатки.
Обмен данными между панелями:
а) Используем дополнительный объект класс
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
30
31
32
33
34
35
36
37
  public class cls_Документ {
    public cls_Документ(Guid pk_Документ, DateTime dt_Док, string str_НаимДок) {
      this.pk_Документ = pk_Документ;
      this.dt_Док = dt_Док;
      this.str_НаимДок = str_НаимДок;
    }
    public cls_Документ() { }
    public Guid pk_Документ { get; set; }
    public DateTime dt_Док { get; set; }
    public string str_НаимДок { get; set; }
  }
  //-- Обработка нажатия кнопки выбора параметров из справочника 
  //------------------------------------------------------------
  private void btc_Выбор_Click(object sender, RoutedEventArgs e) {
    if (!bl_Разрешение) return; //-- Запрет обработки нажатия
    if (dgv_Entity.SelectedIndex == -1) return; //-- Нет выбора
    //-- Получим элемент Datagrid
    xrow = (row_Entity)dgv_Entity.SelectedItem;
    iRow = oc_Entity.IndexOf(xrow);
 
    bl_Разрешение = false;     //-- Запрет выполнения функционала компонент
    зак.uc_Подстановка("cls_Документ", new cls_Документ(xrow.pk_Entity, xrow.dt_Док, xrow.str_НаимДок));
    при.uc_Удалить();          //-- Удалив верхнюю (активную) панель
    bl_Разрешение = true;      //-- Разрешение выполнения функционала компонент
  }
   //-- Прием данных справочников
   public void uc_Подстановка(string name, object obj) {
     if (name == "cls_Документ") {
       xrow.fk_Документ = (obj as cls_Документ).pk_Документ;
       xrow.dt_Док      = (obj as cls_Документ).dt_Док;
       xrow.str_НаимДок = (obj as cls_Документ).str_НаимДок;
       xrow.chb_Entity = true;
       oc_Entity.RemoveAt(iRow);
       oc_Entity.Insert(iRow, xrow);
       dgv_Entity.SelectedIndex = iRow;
     }
   }
б) крайний вариант
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
30
31
32
33
34
35
36
    //-- Обработка нажатия кнопки выбора параметров из справочника 
    //------------------------------------------------------------
    private void btc_Выбор_Click(object sender, RoutedEventArgs e) {
      if (!bl_Разрешение) return; //-- Запрет обработки нажатия
      if (dgv_Entity.SelectedIndex == -1) return; //-- Нет выбора
      //-- Получим элемент Datagrid
      xrow = (row_Entity)dgv_Entity.SelectedItem;
      iRow = oc_Entity.IndexOf(xrow);
 
      (зак as I_Плитка).uc_Подстановка("uc_Документы", this);
      при.uc_Удалить();          //-- Удалив верхнюю (активную) панель
    }
    //-- Прием данных из других панелей
    //-----------------------------
    public void uc_Подстановка(string name, object obj) {
      if (name == "uc_Статус") { при.uc_Статус((зак as I_Плитка).uc_Статус()); bl_Разрешение = true; return; }
      if (name == "uc_ДокВиз_Фильтр") {
        uc_ДокВиз_Фильтр пф = obj as uc_ДокВиз_Фильтр;
        str_НаимДокПФ = пф.txb_НаимДокПФ.Text;
        dt_НачалоПФ = (DateTime)пф.dpr_НачалоПФ.SelectedDate;
        dt_КонецПФ = (DateTime)пф.dpr_КонецПФ.SelectedDate;
        bl_Разрешение = true;
        ЗапросДанных();
        return;
      }
      if (name == "uc_Документы") {
        uc_Документы пф  = obj as uc_Документы;
        xrow.fk_Документ = пф.xrow.pk_Entity;
        xrow.dt_Док      = пф.xrow.dt_Док;
        xrow.str_НаимДок = пф.xrow.str_НаимДок;
        xrow.chb_Entity  = true;
        oc_Entity.RemoveAt(iRow);
        oc_Entity.Insert(iRow, xrow);
        dgv_Entity.SelectedIndex = iRow;
      }
    }
Нет не нужного класса, нет не нужного объекта
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
24.01.2021, 19:06  [ТС]
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Обмен данными между панелями:
Покажите ВАШУ реализацию без использования CB.
И потом обосновывайте чем она хуже по сравнению с вариантом в CB.

Пока все ваши аргументы это только подтверждение ВАШИХ НИЗКИХ ЗНАНИЙ и неумения сделать по иному.
0
18 / 18 / 1
Регистрация: 18.01.2021
Сообщений: 183
Записей в блоге: 8
24.01.2021, 23:05
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Покажите ВАШУ реализацию без использования CB.
Зачем?
Здесь Вы показали свою реализацию.
Это моя
C#
1
2
3
4
5
6
7
8
    private void btc_Выбор_Click(object sender, RoutedEventArgs e) {
      (зак as I_Плитка).uc_Подстановка("uc_Отделы_Фильтр", this);
      при.uc_Удалить();         //-- Удалить верхнюю (активную) панель
    }
    public void uc_Подстановка(string name, Object obj) {
      if (name == "uc_Отделы_Фильтр") {
        str_ОтделПФ = (obj as uc_Отделы_Фильтр).txb_ОтделПФ.Text; bl_Разрешение = true;  ЗапросДанных();
      }
Зацените.
У меня есть дополнение к MVVM (а-ля бритва Оккама) - Не нужное должно быть уничтожено.
Покажите Вашу реализацию. Вот моя, удаляет не нужную панель Фильтра.
при.uc_Удалить(); //-- Удалить верхнюю (активную) панель
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
24.01.2021, 23:41  [ТС]
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Зачем?
Здесь Вы показали свою реализацию.
Я вам ещё раз пишу, для того чтобы ваши аргументы воспринимали не как словесную шелуху, то покажите, что у вас достаточная квалификация.
Для этого покажите ВАШУ реализацию РЕАЛЬНОЙ задачи с ПРАВИЛЬНЫМ кодом, то есть без CB и соблюдением правил ОПП и Net.
А потом на этих двух ВАШИХ реализациях приведите аргументы по какой причине для вашей задачи лучше подходит реализация через жопу по правилам "как левая нога захочет".
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
25.01.2021, 07:58
Цитата Сообщение от Дмитрий_1982 Посмотреть сообщение
Unit-тестирование подходит не для всех. Об этом прямо говорят известные и уважаемые авторы популярных книг по программированию.
Давайте пруф в студию!!! Все книги, которые читал, во всех упоминается о тестировании, кроме того, есть даже техника - TDD (я же говорю - выйдите из чулана). Сам я тоже мало где использую в своих пет-проектах тестирование, но взгляните на требования в вакансиях (это нужно знать, но не обязательно использовать)
Цитата Сообщение от Дмитрий_1982 Посмотреть сообщение
Где в обучающих уроках слова о том, что WPF без MVVM это гора костылей.
Эти курсы для начинающих кнопкодавов, хорошие разрабы сами доходят до этого - мыслить абстракциями. Тем более, что там уроки аля "Привет Мир!".
Цитата Сообщение от Дмитрий_1982 Посмотреть сообщение
Как начинающий программист узнает что такое MVVM, если в обучающих уроках от самой Microsoft нет о нем ни слова.
Да не нужно это начинающему, который даже синтаксис толком не осилил. Архитектурные шаблоны - это уже не для новичков.
Цитата Сообщение от Дмитрий_1982 Посмотреть сообщение
И тут пришел на этот форум... И вы буквально сломали все мои шаблоны... Оказывается и писал я неправильно и обучение в институтах у нас ужасное.
Программа обучения в институте очень отстает от реалий, поэтому - да, ужасное. Взять тот же пых, его никто не преподает в институтах, в основном - Паскаль, Плюсы, Шарп (базовые знания).
Цитата Сообщение от Дмитрий_1982 Посмотреть сообщение
То есть надо знать, что искать. Большинство начинающих до этого не додумаются.
Потому что не вся информация полезна начинающим. Парул лет назад любой паттерн вгонял меня в ступор, но потихоньку, понимая принцип инверсии зависимостей, пришло понимание, почему это сделано именно так.
Цитата Сообщение от Burlak1951 Посмотреть сообщение
введите в Яндексе c# WPF
Не пользуйтесь яндексом, если вы ищите техническую информацию, яндекс - для домохозяек.
Цитата Сообщение от Burlak1951 Посмотреть сообщение
На мой взгляд паттерн MVVM нарушает фундаментальный принцип бритвы Оккама «Не следует множить сущее без необходимости».
Да с чего вы взяли что нарушает ? Нарушает он только для тех, для кого паттерн MVVM кажется сложным.
Цитата Сообщение от Burlak1951 Посмотреть сообщение
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_Ent ity); lst_Entity = null;
dgv_Entity.ItemsSource = oc_Entity; if (oc_Entity.Count != 0) dgv_Entity.SelectedIndex = 0;
}
Простите меня, но я должен разобраться вот в этом коде только ради того, чтобы понять, в каком случае должен отображаться некий элемент ????? Вы серьезно ????? Это как миниму ДИКАЯ ДИЧЬ, в том числе и названия переменных!
Цитата Сообщение от Burlak1951 Посмотреть сообщение
есть другой мир
Ага, полный невежества.
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Он мне не нужен. Вспомните бритву Оккама.
Почитайте Эрика Эванса лучше, для начала.
Цитата Сообщение от Burlak1951 Посмотреть сообщение
У меня есть дополнение к MVVM (а-ля бритва Оккама) - Не нужное должно быть уничтожено.
Мляяяя. Этот принцип (бритва Оккама), вообще про архитектуру, а не про код. Код - это уже конечный этап создания приложения. На первом месте - архитектура!!!!!!!!!
0
18 / 18 / 1
Регистрация: 18.01.2021
Сообщений: 183
Записей в блоге: 8
25.01.2021, 14:03
Цитата Сообщение от Почтальон Посмотреть сообщение
На первом месте - архитектура!!!!!!!!!
На первом месте ТЗ.
Цитата Сообщение от Почтальон Посмотреть сообщение
Ага, полный невежества.
Это всё бла-бла-бла. Сравни коды взаимодействия UserControl. Не доходит?
Покажи реализацию "Не нужное должно быть уничтожено" в рамках MVVM. UserControl завершил свою работу и может (должен) быть уничтожен.Но когда нибуть потом может заработать повторно.

Давайте сравним моё невежество и ваше супер просвящённость на примере кодов реализации достаточно простого примера - есть сущность справочника Отделы. В базе даных сущности предсталены записями в таблице. Функции взаимодействия клиент-приложение стандартные - "SELECT, INSERT, UPDATE, DELETE".
У меня сей функционал реализован UserControl.
Визуально выглядит так, как на слайде
Код своей реализации готов представить немедленно.
Миниатюры
Использование Code Behind Окна: допустимо и, если да, то в каких случаях?  
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,768
Записей в блоге: 4
25.01.2021, 14:24
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Функции взаимодействия клиент-приложение стандартные - "SELECT, INSERT, UPDATE, DELETE".
Model - Data
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
30
31
32
33
34
35
36
37
namespace MDBDAL.Model
{
    public partial class GenPlan : BaseModel
    {
        private int _idGenPlan;
        private string _kks;
        private string _gpName;
 
        public int IDGenPlan
        {
            get { return _idGenPlan; }
            set
            {
                _idGenPlan = value;
                OnPropertyChanged("IDGenPlan");
            }
        }
        public string KKS
        {
            get { return _kks; }
            set
            {
                _kks = value;
                OnPropertyChanged("KKS");
            }
        }
        public string GPName
        {
            get { return _gpName; }
            set
            {
                _gpName = value;
                OnPropertyChanged("GPName");
            }
        }
    }
}
Model - DataAccess
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
using MDBDAL.Model;
 
namespace MDBDAL.DataAccess
{
    public class GenPlanDA
    {
        private static readonly string _connectionString = ConfigurationManager.ConnectionStrings["SQLConnect"].ConnectionString;
 
        public static ObservableCollection<GenPlan> GetAll()
        {
            ObservableCollection<GenPlan> genPlans = new ObservableCollection<GenPlan>();
            string sqlText = "SELECT ID_GenPlan, KKS, GPName FROM dbo.tblGenPlan ORDER BY KKS";
 
            using (SqlConnection connection = new SqlConnection(_connectionString))
            {
                try
                {
                    connection.Open();
 
                    SqlCommand sqlCommand = new SqlCommand(sqlText, connection)
                    {
                        CommandType = CommandType.Text
                    };
 
                    using (SqlDataReader dataReader = sqlCommand.ExecuteReader())
                    {
                        while (dataReader.Read())
                        {
                            genPlans.Add(new GenPlan
                            {
                                IDGenPlan = (int)dataReader["ID_GenPlan"],
                                KKS = dataReader["KKS"] as string ?? "",
                                GPName = dataReader["GPName"] as string ?? ""
                            });
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            return genPlans;
        }
        public static GenPlan GetByID(int gpID)
        {
            GenPlan genPlan = new GenPlan();
            string sqlText = "SELECT ID_GenPlan, KKS, GPName FROM dbo.tblGenPlan WHERE ID_GenPlan = @gpID";
 
            using (SqlConnection connection = new SqlConnection(_connectionString))
            {
                try
                {
                    connection.Open();
 
                    SqlCommand sqlCommand = new SqlCommand(sqlText, connection)
                    {
                        CommandType = CommandType.Text
                    };
                    SqlParameter param = new SqlParameter
                    {
                        ParameterName = "@gpID",
                        Value = gpID,
                        SqlDbType = SqlDbType.Int,
                        Direction = ParameterDirection.Input
                    };
                    sqlCommand.Parameters.Add(param);
 
                    using (SqlDataReader dataReader = sqlCommand.ExecuteReader())
                    {
                        while (dataReader.Read())
                        {
                            genPlan.IDGenPlan = (int)dataReader["ID_GenPlan"];
                            genPlan.KKS = dataReader["KKS"] as string ?? "";
                            genPlan.GPName = dataReader["GPName"] as string ?? "";
                        }
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            return genPlan;
        }
        public static GenPlan InsertPosition(string kks, string gpName)
        {
            GenPlan genPlan = new GenPlan();
            string sqlText = "INSERT INTO dbo.tblGenPlan (KKS, GPName) " +
                "VALUES (@kks, @gpName); SELECT @newID = SCOPE_IDENTITY();";
 
            using (SqlConnection connection = new SqlConnection(_connectionString))
            {
                try
                {
                    connection.Open();
 
                    SqlCommand sqlCommand = new SqlCommand(sqlText, connection)
                    {
                        CommandType = CommandType.Text
                    };
                    SqlParameter paramKks = new SqlParameter
                    {
                        ParameterName = "@kks",
                        Value = kks,
                        SqlDbType = SqlDbType.NVarChar,
                        Size = 50,
                        Direction = ParameterDirection.Input
                    };
                    sqlCommand.Parameters.Add(paramKks);
                    SqlParameter paramName = new SqlParameter
                    {
                        ParameterName = "@gpName",
                        Value = gpName,
                        SqlDbType = SqlDbType.NVarChar,
                        Size = 255,
                        Direction = ParameterDirection.Input
                    };
                    sqlCommand.Parameters.Add(paramName);
                    SqlParameter paramId = new SqlParameter
                    {
                        ParameterName = "@newID",
                        SqlDbType = SqlDbType.Int,
                        Direction = ParameterDirection.Output
                    };
                    sqlCommand.Parameters.Add(paramId);
 
                    sqlCommand.ExecuteNonQuery();
 
                    genPlan.IDGenPlan = (int)sqlCommand.Parameters["@newID"].Value;
                    genPlan.KKS = kks;
                    genPlan.GPName = gpName;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            return genPlan;
        }
        public static GenPlan UpdatePosition(GenPlan genPlan, string kks, string gpName)
        {
            string sqlText = "UPDATE dbo.tblGenPlan SET KKS = @kks, GPName = @gpName WHERE ID_GenPlan = @gpID";
 
            using (SqlConnection connection = new SqlConnection(_connectionString))
            {
                try
                {
                    connection.Open();
 
                    SqlCommand sqlCommand = new SqlCommand(sqlText, connection)
                    {
                        CommandType = CommandType.Text
                    };
                    SqlParameter paramKks = new SqlParameter
                    {
                        ParameterName = "@kks",
                        Value = kks,
                        SqlDbType = SqlDbType.NVarChar,
                        Size = 50,
                        Direction = ParameterDirection.Input
                    };
                    sqlCommand.Parameters.Add(paramKks);
                    SqlParameter paramName = new SqlParameter
                    {
                        ParameterName = "@gpName",
                        Value = gpName,
                        SqlDbType = SqlDbType.NVarChar,
                        Size = 255,
                        Direction = ParameterDirection.Input
                    };
                    sqlCommand.Parameters.Add(paramName);
                    SqlParameter paramId = new SqlParameter
                    {
                        ParameterName = "@gpID",
                        Value = genPlan.IDGenPlan,
                        SqlDbType = SqlDbType.Int,
                        Direction = ParameterDirection.Input
                    };
                    sqlCommand.Parameters.Add(paramId);
 
                    sqlCommand.ExecuteNonQuery();
 
                    genPlan.GPName = gpName;
                    genPlan.KKS = kks;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            return genPlan;
        }
        public static void DeletePosition(GenPlan genPlan, ObservableCollection<GenPlan> genPlans)
        {
            string sqlText = "DELETE dbo.tblGenPlan WHERE ID_GenPlan = @gpID";
 
            using (SqlConnection connection = new SqlConnection(_connectionString))
            {
                try
                {
                    connection.Open();
 
                    SqlCommand sqlCommand = new SqlCommand(sqlText, connection)
                    {
                        CommandType = CommandType.Text
                    };
                    SqlParameter paramId = new SqlParameter
                    {
                        ParameterName = "@gpID",
                        Value = genPlan.IDGenPlan,
                        SqlDbType = SqlDbType.Int,
                        Direction = ParameterDirection.Input
                    };
                    sqlCommand.Parameters.Add(paramId);
 
                    sqlCommand.ExecuteNonQuery();
 
                    genPlans.Remove(genPlan);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
    }
}
ViewModel - Main
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;
using System.Collections.ObjectModel;
 
using MDBDAL.DataAccess;
using MDBDAL.Model;
 
namespace VModels
{
    public partial class GenPlanVM : BaseDialogViewModel
    {
        private GenPlan _selectedGenPlan;
        private ObservableCollection<GenPlan> _genPlans;
 
        protected override void Save(object obj)
        {
            DialogResult = true;
        }
 
        public GenPlan SelectedGenPlan
        {
            get { return _selectedGenPlan; }
            set
            {
                _selectedGenPlan = value;
                OnPropertyChanged("SelectedGenPlan");
            }
        }
        public ObservableCollection<GenPlan> GenPlans
        {
            get { return _genPlans; }
            set
            {
                _genPlans = value;
                OnPropertyChanged("GenPlans");
            }
        }
        public GenPlanVM()
        {
            try
            {
                GenPlans = GenPlanDA.GetAll();
            }
            catch (Exception ex)
            {
                WindowService.ShowErrorMessage(ex.ToString(), "Ошибка загрузки");
            }
        }
    }
}
ViewModel - Commands
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    
public partial class GenPlanVM
    {
        private ICommand _deleteGPPosition;
        private ICommand _editGPPosition;
        private RelayCommand _addGPPosition;
 
        private static bool DeleteGPPositionCanExecute(GenPlan arg) => arg != null;
        private void DeleteGPPositionExecuted(GenPlan genPlan)
        {
            if (WindowService.ShowQuestionMessage(
                "Удалить данный объект?\n\rЭто действие отменить нельзя!", "Удаление данных") == MessageBoxResult.Yes)
            {
                try
                {
                    GenPlanDA.DeletePosition(genPlan, GenPlans);
                    WindowService.ShowInfoMessage("Данные удалены.", "Завершение операции");
                }
                catch (Exception ex)
                {
                    WindowService.ShowErrorMessage(ex.ToString(), "Ошибка");
                }
            }
        }
        private void EditGPPositionExecudted(GenPlan genPlan)
        {
            WindowService.ShowDialog(new GPEditDialogVM(genPlan));
        }
        private static bool EditGPPositionCanExecute(GenPlan arg) => arg != null;
        private void AddGPPositionExecuted(object obj)
        {
            var vm = new GPAddDialogVM();
            WindowService.ShowDialog(vm);
            if (vm.DialogResult == true)
            {
                GenPlans.Add(vm.GenPlanPos);
            }
        }
 
        public ICommand DeleteGPPosition => _deleteGPPosition ??
            (_deleteGPPosition = new RelayCommand<GenPlan>(DeleteGPPositionExecuted, DeleteGPPositionCanExecute));
        public ICommand EditGPPosition => _editGPPosition ??
            (_editGPPosition = new RelayCommand<GenPlan>(EditGPPositionExecudted, EditGPPositionCanExecute));
        public RelayCommand AddGPPosition => _addGPPosition ??
            (_addGPPosition = new RelayCommand(AddGPPositionExecuted));
    }
View - XAML
XML
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<Window x:Class="WpfApp1.GenPlanWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="Работа с объектами Генплана" Height="500" Width="850" ResizeMode="NoResize" 
        local:DialogCloser.DialogResult="{Binding DialogResult}">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="0.3*"/>
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Row="0" Grid.ColumnSpan="2" Text="Работа с объектами Генплана" Margin="5" Padding="2" VerticalAlignment="Center"
                   HorizontalAlignment="Left" Width="Auto" FontSize="18" FontWeight="Bold"/>
        <Border Grid.Row="1" Grid.Column="0" BorderBrush="DarkGray" BorderThickness="2" Background="Transparent" CornerRadius="2"
                Margin="2">
            <DataGrid x:Name="gpGrid" ItemsSource="{Binding GenPlans}" SelectedItem="{Binding SelectedGenPlan}" MinWidth="400"
                      AutoGenerateColumns="False" VerticalScrollBarVisibility="Visible" IsReadOnly="True"
                      RowHeaderWidth="0">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="IDGenPlan" Binding="{Binding IDGenPlan}" Visibility="Hidden"/>
                    <DataGridTextColumn Header="KKS" Binding="{Binding KKS}" MinWidth="50" Width="50*">
                        <DataGridTextColumn.ElementStyle>
                            <Style TargetType="TextBlock">
                                <Setter Property="HorizontalAlignment" Value="Center"/>
                                <Setter Property="VerticalAlignment" Value="Center"/>
                            </Style>
                        </DataGridTextColumn.ElementStyle>
                    </DataGridTextColumn>
                    <DataGridTextColumn Header="Наименование" Binding="{Binding GPName}" MinWidth="350" Width="350*">
                        <DataGridTextColumn.ElementStyle>
                            <Style TargetType="TextBlock">
                                <Setter Property="HorizontalAlignment" Value="Left"/>
                                <Setter Property="VerticalAlignment" Value="Center"/>
                                <Setter Property="TextWrapping" Value="Wrap"/>
                            </Style>
                        </DataGridTextColumn.ElementStyle>
                    </DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Border>
        <StackPanel Grid.Column="1" Grid.Row="1" Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Bottom">
            <Button x:Name="btnAdd" Content="Добавить объект" Margin="10 10 10 0" VerticalAlignment="Bottom"
                    VerticalContentAlignment="Center" MinWidth="150" MinHeight="25" Command="{Binding AddGPPosition}"/>
            <Button x:Name="btnEdit" Content="Изменить объект" Margin="10 10 10 0" VerticalAlignment="Bottom"
                    VerticalContentAlignment="Center" MinWidth="150" MinHeight="25"
                    Command="{Binding EditGPPosition}" CommandParameter="{Binding SelectedItem, ElementName=gpGrid}"/>
            <Button x:Name="btnDelete" Content="Удалить объект" Margin="10 10 10 20" VerticalAlignment="Bottom"
                    VerticalContentAlignment="Center" MinWidth="150" MinHeight="25"
                    Command="{Binding DeleteGPPosition}" CommandParameter="{Binding SelectedItem, ElementName=gpGrid}"/>
            <Button x:Name="btnClose" Content="Закрыть" Margin="10 10 10 10" VerticalAlignment="Bottom"
                    VerticalContentAlignment="Center" MinWidth="150" MinHeight="25" Command="{Binding SaveCommand}"/>
        </StackPanel>
    </Grid>
</Window>
App.xaml.cs
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
30
31
32
33
34
35
36
37
38
39
40
using System.Globalization;
using System.Threading;
using System.Windows;
using System.Windows.Markup;
 
using VModels;
using VModels.Services;
 
namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
 
            Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("RU-ru");
            Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("RU-ru");
            FrameworkElement.LanguageProperty.OverrideMetadata(
                  typeof(FrameworkElement),
                  new FrameworkPropertyMetadata(
                      XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
 
            var viewModelService = new ViewModelsService();
            viewModelService.Register<DrawDetailsReportVM, DrawDetailsReportWindow>();
            viewModelService.Register<GenPlanVM, GenPlanWindow>();
            viewModelService.Register<GPEditDialogVM, GPEditDialog>();
            viewModelService.Register<GPAddDialogVM, GPAddDialog>();
            ServiceLocator.Instance
                .Register<IWindowService>(new WindowService())
                .Register<IViewModelsService>(viewModelService);
 
            MainWindow = new MainWindow { DataContext = new GenPlanReportVM() };
            MainWindow.Show();
        }
    }
}
Опущены некоторые классы помощники. А так, все просто, понятно и прозрачно. Вот вам и MVVM.

UPD: Чета спойлеры не сработали, пришлось убрать
0
25.01.2021, 14:31  [ТС]

Не по теме:

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Чета спойлеры не сработали, пришлось убрать
Их и не надо в данном случае использовать.
Они ставятся там где несущественное для основной темы сообщения.
А на код который и является смыслом сообщения, ставить их не зачем.

0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
25.01.2021, 14:35
Цитата Сообщение от Burlak1951 Посмотреть сообщение
На первом месте ТЗ
Вот именно. Нельзя написать ТЗ с первого раза так, чтобы требования не менялись в процессе разработки.
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Давайте сравним моё невежество и ваше супер просвящённость на примере кодов реализации достаточно простого примера - есть сущность справочника Отделы. В базе даных сущности предсталены записями в таблице. Функции взаимодействия клиент-приложение стандартные - "SELECT, INSERT, UPDATE, DELETE".
Слой доступа к данным, модель, слой представления этих данных, и само представление.

Добавлено через 3 минуты
Цитата Сообщение от Burlak1951 Посмотреть сообщение
UserControl завершил свою работу и может (должен) быть уничтожен.Но когда нибуть потом может заработать повторно.
Юзер контрол - это не хранилище для данных, его задача - отобразить/передать в нижестоящий слой введенные пользовательские данные.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
25.01.2021, 14:36  [ТС]
Цитата Сообщение от Burlak1951 Посмотреть сообщение
Давайте сравним моё невежество и ваше супер просвящённость
Мы уже сравнили.
А вот вы ещё не доросли до сравнения, поскольку все ваши аргументы это только оправдания отсутствия элементарных знаний не то, что WPF, а даже C# и ООП.
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
25.01.2021, 14:54
Andrey-MSK
Пара вопросов:
1. Зачем VM регистрируются в контейнере зависимостей, если они потом всё равно создаются явным образом через 'new GPEditDialogVM(genPlan)'?
2. Зачем кнопкам в разметке явно задаются 'x:Name', тогда как далее эти имена в разметке не используются? Где-то во вспомогательных сервисах на это какая-то логика привязана?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.01.2021, 14:54

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
160
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
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. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru