powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как назвать такой странный код от Microsoft ?
18 сообщений из 18, страница 1 из 1
Как назвать такой странный код от Microsoft ?
    #39761608
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется некий базовый класс DBConnection. У него есть метод CreateCommand, возвращающий DbCommand.
https://referencesource.microsoft.com/#System.Data/System/Data/Common/DBConnection.cs,130

Он основывается на некоем интерфейсе:

Код: c#
1.
2.
3.
4.
public interface IDbConnection : IDisposable
{
  IDbCommand CreateCommand();
}



Метод реализован странно:

Код: c#
1.
2.
3.
4.
5.
6.
7.
public abstract class DbConnection : Component, IDbConnection
{
  public DbCommand CreateCommand() {
              return CreateDbCommand();
  }
  abstract protected DbCommand CreateDbCommand();
}




И есть класс SqlConnection, реализующий свой метод CreateCommand:
https://referencesource.microsoft.com/#System.Data/System/Data/SqlClient/SqlConnection.cs,1145

Код: c#
1.
2.
3.
4.
5.
6.
public sealed partial class SqlConnection: DbConnection, ICloneable
{
   new public SqlCommand CreateCommand() {
            return new SqlCommand(null, this);
        }
}



Понятно, что если бы метод CreateCommand был виртуальным, это бы вынудило SqlConnection в точности переопределять прототип метода.
Метод DbCommand CreateCommand не является абстрактным и чтобы обойти необходимость реализовывать метод, обходит это через создание абстрактного CreateDbCommand, которые не реализуется ни самим DbConnection, ни SqlConnection. И все для того, чтобы SqlConnection мог "переопределить" этот метод через new у себя. Но зачем, если он не наследует интерфейс родителя ?

Для чего все это было сделано ? Не является ли это нарушением целой кучи принципов и паттернов программирования. Как например, несоответствие класса предка интерфейсу класса родителя и создание параллельной, теневой иерархии. Нарушен ли тут, к примеру, "принцип подстановки Барбары Лисков" или нет ?

Другой пример параллельной иерархии. Хотя SqlCommand наследуется от DbCommand, но также не наследует его интерфейс, и также закрывает методы предка своими:

https://referencesource.microsoft.com/#System.Data/System/Data/Common/DBCommand.cs,174

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public abstract class DbCommand : Component, IDbCommand
{
  public DbParameter CreateParameter(){
            return CreateDbParameter();
        }
  abstract protected DbParameter CreateDbParameter();
}

public sealed class SqlCommand : DbCommand, ICloneable {

new public SqlParameter CreateParameter() {
            return new SqlParameter();
        }

/* тут родительский метод все таки переопределяется (в отличие от метода CreateDbCommand в классе SqlConnection). 
Не понятно только почему тут да, а там нет. */
override protected DbParameter CreateDbParameter() {
            return CreateParameter();
        }
}



Что это, элегантный код, или наоборот пример кода студента ? Какая задумка подо всем этим ?
...
Рейтинг: 0 / 0
Как назвать такой странный код от Microsoft ?
    #39761616
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PS. Скорее всего метод CreateDbCommand в SqlConnection, все таки, переопределен, просто находится в другом классе, т.к. сам класс является partial. Его реализацию я не нашел, но это тоже лишь добавляет странности всему решению.
...
Рейтинг: 0 / 0
Как назвать такой странный код от Microsoft ?
    #39761629
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему нельзя было обойтись таким решением ?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public abstract class DbConnection<TDbCommand>
        where TDbCommand: DbCommand
{        
   public abstract TDbCommand CreateCommand ();
}	

public class SqlConnection<SqlCommand>
{
  public override SqlCommand CreateCommand ()
 {...}
}
...
Рейтинг: 0 / 0
Как назвать такой странный код от Microsoft ?
    #39761705
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
WaspNewCore,
чему Вы удивляетесь? Разные команды индусов шли к успеху разными путями. Потом кто-то умный скрестил ежа и ужа. Хрясь-хрясь и в продакшен!
Уже хорошо, что договорились, что все называется CreateDbParameter, а не DbCreateParameter, ParameterDbCreate или MakeParameterDb. Еще вариант - MadeInMSSql
...
Рейтинг: 0 / 0
Как назвать такой странный код от Microsoft ?
    #39761781
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore,

да всё можно было сделать как Вам хочется... правда с релизом пришлось бы подождать 17 лет :)
...
Рейтинг: 0 / 0
Как назвать такой странный код от Microsoft ?
    #39761804
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCore,
Пробуйте другие библиотеки. Что вы уперлись в один класс?)).
Вот если и в других так, тогда мы поможем вам не уйти в запой из за несовершенства мира4)) LOL
...
Рейтинг: 0 / 0
Как назвать такой странный код от Microsoft ?
    #39761807
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreЕго реализацию я не нашел
плохо искал, исходники доступны
...
Рейтинг: 0 / 0
Как назвать такой странный код от Microsoft ?
    #39761833
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123мы поможем вам не уйти в запой из за несовершенства мирамы поможем вам не уйти в запой из за несовершенства мира
...
Рейтинг: 0 / 0
Как назвать такой странный код от Microsoft ?
    #39762481
WaspNewCore
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем подумал. Могу предположить, что все это было сделано из-за того, что классы DbConnection и SqlConnection поддерживают фреймворк 1.1, согласно МСДН. А дженерики появились только начиная с 2 версии фреймворка.

Без дженериков такой способ наверное единственный дать возможность классам предкам предоставлять удобный интерфейс вида
Код: c#
1.
2.
3.
4.
class SqlConnection
{
  SqlConnection CreateConnection ()
}


вместо
Код: c#
1.
2.
3.
4.
5.
6.
class SqlConnection
{
  DbConnection CreateConnection ()
}

SqlConnection con = (SqlConnection) new SqlConnection.CreateConnection();




Что обидно. Вот выпустили они новый Net.Core. Новый, с иголочки. А код все тот же...
https://github.com/dotnet/corefx/blob/a10890f4ffe0fadf090c922578ba0e606ebdd16c/src/System.Data.SqlClient/src/System/Data/SqlClient/SqlCommand.cs
https://github.com/dotnet/corefx/blob/a10890f4ffe0fadf090c922578ba0e606ebdd16c/src/System.Data.SqlClient/src/System/Data/SqlClient/SqlConnection.cs


Вот к чему может привести поддержка доисторических фреймворков.
Глядишь человечество (или тот искусственный интеллект, который заменит людей) в космос начнет летать, покорит Андромеду, а на космических кораблях в 25 тысячном году все также будет использоваться не эффективный код, из-за необходимости поддерживать тот самый, первый фреймворк.
...
Рейтинг: 0 / 0
Как назвать такой странный код от Microsoft ?
    #39762498
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreNet.Core. Новый, с иголочки.он новый и без совместимости для веб.
А для десктоп еще не делали).
...
Рейтинг: 0 / 0
Как назвать такой странный код от Microsoft ?
    #39762597
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreЧто обидно. Вот выпустили они новый Net.Core. Новый, с иголочки. А код все тот же...
https://github.com/dotnet/corefx/blob/a10890f4ffe0fadf090c922578ba0e606ebdd16c/src/System.Data.SqlClient/src/System/Data/SqlClient/SqlCommand.cs
https://github.com/dotnet/corefx/blob/a10890f4ffe0fadf090c922578ba0e606ebdd16c/src/System.Data.SqlClient/src/System/Data/SqlClient/SqlConnection.cs

Новый Core не означает отсутствие необходимости поддерживать существующий код.
Конечно, плохих решений в стандартной библиотеке выше крыши.
...
Рейтинг: 0 / 0
Как назвать такой странный код от Microsoft ?
    #39762748
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
багов в .net довольно много, опытные программисты обычно знают о них и ни кто не правит эти баги с ранних версий 2.0
таких примеров масса и вашем случае, это даже не баг.
...
Рейтинг: 0 / 0
Как назвать такой странный код от Microsoft ?
    #39762777
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesтаких примеров масса и вашем случае, это даже не баг.
Да и про неэффективность тоже зря упомянуто. Архитектурно кривой - да. Неэффективный - вряд ли.
...
Рейтинг: 0 / 0
Как назвать такой странный код от Microsoft ?
    #39763850
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что за бред тут написан? пусть ТС приведёт пример правильного, по его мнению кода
WaspNewCoreПочему нельзя было обойтись таким решением ?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public abstract class DbConnection<TDbCommand>
        where TDbCommand: DbCommand
{        
   public abstract TDbCommand CreateCommand ();
}	

public class SqlConnection<SqlCommand>
{
  public override SqlCommand CreateCommand ()
 {...}
}



...и пусть скажет почему этот кусок кода полное дерьмо
...
Рейтинг: 0 / 0
Как назвать такой странный код от Microsoft ?
    #39763877
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WaspNewCoreабстрактного CreateDbCommand, которые не реализуется ни самим DbConnection, ни SqlConnection.
Вот тут загадка. "ни самим DbConnection" - так и должно быть, т.к. там метод и объявлен абстрактным, а вот "ни SqlConnection" загадочно, ибо наследник обязан реализовывать все абстрактные члены.
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/abstract Members marked as abstract, or included in an abstract class, must be implemented by classes that derive from the abstract class.
Пока объяснением видится "partial" (public sealed partial class SqlConnection), т.е. мы не располагаем всеми исходниками...
...
Рейтинг: 0 / 0
Как назвать такой странный код от Microsoft ?
    #39764036
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRWaspNewCoreабстрактного CreateDbCommand, которые не реализуется ни самим DbConnection, ни SqlConnection.
Вот тут загадка. "ни самим DbConnection" - так и должно быть, т.к. там метод и объявлен абстрактным, а вот "ни SqlConnection" загадочно, ибо наследник обязан реализовывать все абстрактные члены.
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/abstract Members marked as abstract, or included in an abstract class, must be implemented by classes that derive from the abstract class.
Пока объяснением видится "partial" (public sealed partial class SqlConnection), т.е. мы не располагаем всеми исходниками...
IL код после декомпиляции не содержит никаких Partial, посмотрите в ILSpy или dotnetPeek'е, что там по факту, на референс сорс исходники старые.
...
Рейтинг: 0 / 0
Как назвать такой странный код от Microsoft ?
    #39764220
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesIL код после декомпиляции не содержит никаких Partial, посмотрите в ILSpy или dotnetPeek'е, что там по факту, на референс сорс исходники старые.
Ну х.з., а есть ли смысл компилятору помещать в бинарник информацию о том что класс partial? И, главное, даже в "старых" исходниках наследник должен реализовывать абстрактный метод базового класса (поскольку этой реализации мы не находим, единственно правильный вывод - мы имеем не все исходники).
...
Рейтинг: 0 / 0
Как назвать такой странный код от Microsoft ?
    #39768471
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2WaspNewCore,
чему Вы удивляетесь? Разные команды индусов шли к успеху разными путями. Потом кто-то умный скрестил ежа и ужа. Хрясь-хрясь и в продакшен!
Уже хорошо, что договорились, что все называется CreateDbParameter, а не DbCreateParameter, ParameterDbCreate или MakeParameterDb. Еще вариант - MadeInMSSql
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как назвать такой странный код от Microsoft ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]