Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
20 / 20 / 11
Регистрация: 04.09.2009
Сообщений: 104

Практическое использование ООП

03.11.2015, 15:41. Показов 1933. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хоть по этому вопросу и есть множество информации и тем даже на этом форуме, но понимания практического применения так и не прибавилось.
Объясните пожалуйста на конкретном примере, что и как правильно использовать.
Пример. Есть три класса, которые реализуют методы, по работе с базами данных MSSQL, Oracle и Postgresql.
Все три класса практически одинаковы по коду, за исключением того, что используют разные библиотеки (System.Data.Sql, Npgsql и Oracle.DataAccess.Client) и отличаются названия классов и методов в используемых библиотеках (например SqlConnection,NpgsqlConnection,OracleCon nection). Т.е. реализация абсолютно одинакова, но используются разные объекты. Сейчас понадобилось написать приложение, которое будет взаимодействовать с двумя (а может и тремя) БД, в связи с этим возник вопрос: Можно ли каким-то образом организовать код, чтобы реализация была в одном общем классе, а инициализация подключаемых библиотек в трех других?

PS.
1. Нет перенести все на одну БД нельзя
2. Строк кода в классах не много, но хочется понять, для чего все таки нужно ООП
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.11.2015, 15:41
Ответы с готовыми решениями:

Смысл событий. Практическое их использование
Поясните пожалуйста зачем нужны события которые - Event? Просто я не могу понять. зачем нужно использовать событие если можно просто...

В какой литературе можно посмотреть практическое использование Security.Cryptography?
В какой литературе можно посмотреть практическое использование Security.Cryptography?

Использование ООП
О наболевшем.Честно говоря,мне даже стыдно писать это.. :resent: Мне до сих пор ни разу не приходилось использовать ООП в своих...

21
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
03.11.2015, 15:51
Цитата Сообщение от EvgenOrel Посмотреть сообщение
хочется понять, для чего все таки нужно ООП
Вариант 1: использование (если возможно) основных классов из System.Data.Common. Все остальные классы (Connection, Command, DataReader) наследуются от базовых.
Вариант 2: Создать свой интерфейс с прототипами методов и несколько классов (по числу провайдеров БД), его реализующих. Каждый класс инкапсулирует работу с определенным типом БД и использует для общения методы, определенные в интерфейсе. Для создания определенного типа можно использовать фабрику, к примеру.
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
03.11.2015, 16:03
Я бы сделал примерно так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public interface ISqlConnection
{
    void Open();
    void Close();
}
public class Postgresql : ISqlConnection
{
}
public class Oracle : ISqlConnection
{
}
public class SqlConnection : ISqlConnection
{
}
...
 
public class DataBaseContext
{
    ISqlConnection connection = CustomDependencyResolver.GetInstance(ISqlConnection);
}
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.11.2015, 16:14
EvgenOrel, конечно одинакова, поэтому прямая работа с БД уже лет 10 как не в моде Linq2Sql появился еще в .Net 3.5 если мне память не изменяет, потом стали все пользоваться EF, а скоро выходит аж 6(7) версия
0
20 / 20 / 11
Регистрация: 04.09.2009
Сообщений: 104
03.11.2015, 16:15  [ТС]
Я бы сделал примерно так:
Т.е нужно описать интерфейс, соответственно реализовав все методы в классах? Т.е. к тем трем классам что есть, добавляем еще интерфейс. Пока непонятно чем это проще чем просто описать три класса?
И не понял что делает:
Code
1
ISqlConnection connection = CustomDependencyResolver.GetInstance(ISqlConnection);
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.11.2015, 16:16
EvgenOrel, фактически все эти фреймворки делают то, что написали выше, только круче, производительнее, и более масштабируемо. Но написать аналог заточенный только под свою конфигурацию не очень сложно.

Добавлено через 49 секунд
Цитата Сообщение от EvgenOrel Посмотреть сообщение
И не понял что делает:
обычное ООП, полиморфизм называется.
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
03.11.2015, 16:18
C#
1
ISqlConnection connection = CustomDependencyResolver.GetInstance(ISqlConnection);
прочитайте про IoC/DI, Ninject, Automap, Unity. Это строка просто как пример.
0
20 / 20 / 11
Регистрация: 04.09.2009
Сообщений: 104
03.11.2015, 16:27  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
EvgenOrel, фактически все эти фреймворки делают то, что написали выше, только круче, производительнее, и более масштабируемо. Но написать аналог заточенный только под свою конфигурацию не очень сложно.
обычное ООП, полиморфизм называется.
У меня по ходу совсем уж туго.
Поясните на примере
в трех классах есть метод:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public static Boolean ConnectionTest(string CnnString,){
            SqlConnection connection = new SqlConnection(CnnString);
            try{
                connection.Open();
                return true;
            }
            catch (Exception e){
                return false;
            }
            finally{
                connection.Dispose();
            }
        }
В двух других все тоже самое только вместо SqlConnection - OracleConnection и NpgsqlConnection соответственно.
Можете привести пример описания для этого метода и его вызов ?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
03.11.2015, 16:40
Цитата Сообщение от EvgenOrel Посмотреть сообщение
Поясните на примере
Ну вот как-то так, если совсем просто.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication13 {
    class Program {
        static void Main(string[] args) {
            ConnectionType type = ConnectionType.ORACLE;
            ICustomConnection cnn = DbProviderFactory.CreateDbProvider(type);
            if (cnn != null) {
                try {
                    cnn.Open();
                }
                catch (Exception ex) {
                    cnn.Close();
                }
            }
        }
    }
    static class DbProviderFactory {
        public static ICustomConnection CreateDbProvider(ConnectionType type) {
            ICustomConnection cnn = null;
            switch (type) {
                case ConnectionType.ORACLE:
                    cnn = new OracleDbProvider();
                    break;
                case ConnectionType.NPG:
                    cnn = new NpgDbProvider();
                    break;
                case ConnectionType.SQL:
                    cnn = new SqlDbProvider();
                    break;
            }
            return cnn;
        }
    }
    class OracleDbProvider : ICustomConnection {
        public void Open() {
            //Implementation of method here...
        }
 
        public void Close() {
            //Implementation of method here...
        }
    }
    class SqlDbProvider : ICustomConnection {
        public void Open() {
            //Implementation of method here...
        }
 
        public void Close() {
            //Implementation of method here...
        }
    }
    class NpgDbProvider : ICustomConnection {
        public void Open() {
            //Implementation of method here...
        }
 
        public void Close() {
            //Implementation of method here...
        }
    }
    interface ICustomConnection {
        void Open();
        void Close();
    }
    enum ConnectionType {
        ORACLE,
        SQL,
        NPG
    }
}
2
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
03.11.2015, 19:19
Цитата Сообщение от EvgenOrel Посмотреть сообщение
В двух других все тоже самое только вместо SqlConnection - OracleConnection и NpgsqlConnection соответственно.
Можете привести пример описания для этого метода и его вызов ?
Касаемо конкретно вашего примера.
Его можно реализовать так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    class ConnectionTester
    {
        public bool Test<T>(string connString) where T : DbConnection, new()
        {
            var connection = new T() { ConnectionString = connString };
            try
            {
                connection.Open();
                return true;
            }
            catch (Exception e)
            {
                return false;
            }
            finally
            {
                connection.Dispose();
            }
        }
    }
(на самом деле это одна из многих возможных реализаций, можно сделать и по другому - через абстрактный класс, без дженерика и т.п.)

Обратите внимание на то, что:
1) Этот код не зависит от того, какой тип вы ему дадите. Поскольку все классы SqlConnection, OracleConnection и т.д. унаследованы от DbConnection, то мы можем разрабатывать код, который работает со всеми этими классами независимо от их конкретного типа.
2) Теперь наш функционал сосредоточен в одном месте, и нет необходимости писать один и тот же код в каждом из типов. Упрощается и правка кода, потому что правку нужно будет делать только в одном месте.

Таким образом имеем два преимущества - универсальность и переиспользование кода. Без ООП это было бы затруднительно.

pro_100_gram, insite2012, что ж вы так человека пугаете? Всякими IoC-ами и Ninject-ами. Мы же можем его потерять. Навсегда
3
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
03.11.2015, 19:33
Цитата Сообщение от Storm23 Посмотреть сообщение
insite2012, что ж вы так человека пугаете? Всякими IoC-ами и Ninject-ами.
Storm23, по правде говоря, никогда о них не слышал))) Пишу как учили (в книгах) + немного используя моск.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.11.2015, 19:39
insite2012, так и книги по ним есть. Это немного следующий уровень, после шилдта Уже чуть ближе к архитектуре.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
03.11.2015, 19:44
Цитата Сообщение от Psilon Посмотреть сообщение
Это немного следующий уровень, после шилдта
Его именно не читал. Я читал Троелсена (хорош, очень хорош), Рихтера (тоже хорош, но его использование уточненных имен типов просто убивает), сейчас читаю Кр. Нейгела и др. Ну и остальное по мелочи, Хабр, StackOverflow, CodeProject, RSDN.
1
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
03.11.2015, 20:04
insite2012, А мне в последнее время книжки лень читать, больше нравится краткое введение и использование на практике. Поэтому сейчас читаю http://webglfundamentals.org/ . Хотя сильно чувствую, что в теории начинаю отставать.
1
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
03.11.2015, 20:06
Цитата Сообщение от pro_100_gram Посмотреть сообщение
мне в последнее время книжки лень читать
pro_100_gram, я что-то WCF увлекся, отдельно по этой технологии скачал книгу и читаю. Хорошая штука, очень понравилась.
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
03.11.2015, 20:18
insite2012, Юзал предшественика WCF'a - .NetRemoting. Был под впечатлением после стандартных сокетов, но WCF учить что-то не тянет. Я уже на это неспособен видимо, читать, что-то не из стека веб технологий.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.11.2015, 21:40
pro_100_gram, дык это и есть веб. Его кроме как для веба редко используют. Когда нужно что-то покруче, чем просто webmethod дергать WCF приходит на помощь.

insite2012, хорошая тема, я даже на неё MCSD сдал Но до конца до сих пор плохо знаю. Там столько нюансов, что жуть одна.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
03.11.2015, 21:47
Цитата Сообщение от Psilon Посмотреть сообщение
Там столько нюансов, что жуть одна.
Поддерживаю. Сначала вроде ничего, я как дошел до транзакций, и постепенно моСк начал уплывать. Что будет дальше - боюсь и предполагать. Но интересно же, потому продолжаю.
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
03.11.2015, 22:30
Psilon, Веб - это лишь одна из возможностей WCF, потому он такой громоздкий.
ASP.NET(Active Server Pages) — технология создания веб-приложений и веб-сервисов от компании Майкрософт. Она является составной частью платформы Microsoft .NET и развитием более старой технологии Microsoft ASP. На данный момент последней версией этой технологии является ASP.NET 5[1].
Windows Communication Foundation (WCF) — программный фреймворк, используемый для обмена данными между приложениями, входящий в состав .NET Framework. До своего выпуска в декабре 2006 года в составе .NET Framework 3.0, WCF был известен под кодовым именем Indigo.
Добавлено через 4 минуты
insite2012, Почему не ASP.NET MVC, а WCF? Зачем вы его учите?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.11.2015, 23:15
Цитата Сообщение от pro_100_gram Посмотреть сообщение
Веб - это лишь одна из возможностей WCF, потому он такой громоздкий.
Настолько же, насколько С++ - десктопный язык. Но вот что-то веб-сайтов на нем тоже днем с огнем не сыщешь Точно также WCF - это веб. Потому что единственная альтернатива - межпроцессное взаимодействие. Но там смысла никакого в нем нет. Это по-умолчанию клиент-серверная архитектура, а как следствие, веб

Цитата Сообщение от insite2012 Посмотреть сообщение
Поддерживаю. Сначала вроде ничего, я как дошел до транзакций, и постепенно моСк начал уплывать. Что будет дальше - боюсь и предполагать. Но интересно же, потому продолжаю.
Ну например матрица выбора храналища одна чего стоит
Транзакции (это про атрибуты PerCall и прочие или другое?) не так страшно, как это
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.11.2015, 23:15
Помогаю со студенческими работами здесь

RSACryptoServiceProvider практическое использование
Заинтересовался классом RSACryptoServiceProvider Но имеются три вопроса: RSACryptoServiceProvider.Encrypt(byte rgb, bool fOAEP) если...

Свойства Qt. Практическое использование
Вот что у меня получилось: #include &lt;QtGui&gt; #include &lt;QApplication&gt; #include &lt;QLabel&gt; #include &lt;QObject&gt; class MyClass :...

Практическое использование метода экстраполяции
Ув.программисты,подскажите пожалуйста какой то пример использования метода экстраполяций для поиска в одномерном массиве.Бо перешарил инет...

Практическое использование некоторым методов TObject
Подскажите плз, где можно практический использовать такие методы TObject, как MethodName, FieldAddress и GetInterface. И, если не трудно,...

Полиморфизм в C++: практическое использование переопределния виртуальных функций
Доброго всем времени суток. Решил разобраться с полиморфизмом в C++. Но в процессе изучения натолкнулся на такую дилемму. Не понимаю...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru