Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реализация Exception 
:(
    Опции темы
Exai1e
Дата 7.7.2010, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: 3
Всего: 30



Здравствуйте, возник такой вопрос, по архитектуре классов работающих с бд:
К примеру, работа с базой данных.
(все эти классы будут в сборке (Class Library)
Есть класс, описывающий таблицу в БД (таких классов будет несколько, (таблиц не много))
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DataAccess.DataObject
{
    public class Operator
    {
        public int ID { set; get; }
        public string Name { set; get; }
        public string Surname { set; get; }
        public string Lastname { set; get; }
        public string Password { set; get; }
        public string About { set; get; }

        public Operator() { }

        public Operator(int pID, string pName, string pSurname, string pLastname, string pPassword, string pAbout)
        {
            this.ID = pID;
            this.Name = pName;
            this.Surname = pSurname;
            this.Lastname = pLastname;
            this.Password = pPassword;
            this.About = pAbout;
        }

        public Operator(string pName, string pSurname, string pLastname, string pPassword, string pAbout)
        {
            this.Name = pName;
            this.Surname = pSurname;
            this.Lastname = pLastname;
            this.Password = pPassword;
            this.About = pAbout;
        }

    }
}


Класс реализующий работу с данными в таблице (каждый класс <Table name>Manager реализует работу с определенной таблицей)
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataAccess.DataObject;

namespace DataAccess.DataManagers
{
    public static class ParamsNotCorrectException : Exception
    {
        public ParamsNotCorrectException()
            : base("не корректные параметры бла бла бла") { }
    }

    public class OperatorManager
    {
        public void AddOperator(Operator pOperator)
        {
                //работа с БД, создание подключения, добавление данных с помощью SQL запроса и т.д.
        }
              //.......
    }
}


Основной класс доступа к данным, к нему будут обращаться из ГУИ приложения

Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DataAccess
{
    public class DataManager
    {
         public void AddOperator(переданные данные { id, имя, фамилия, прочее...}   )
        {
            try
            {
                    //проверяем валидность данных
                   //если данные в норме то
                            //создаем класс Operator, заполняем его данными
                            //вызываем OperatorManager.AddOperator(сформированный класс)
                  //если данные не валидны то выкидываем исключение ParamsNotCorrectException 
            }
            catch (Exception ex)
            {
                 //исключение при работе с БД
                throw ex;
            }

        }
    }
}


В дальнейшем класс DataManager будет использован ГУИ App.
к примеру
Код

DataManager dm = new DataManager();
public void ...buttonClick...
{
    string _name = textBoxOperatorName.Text;
    ....

try
{
    dm.AddOperator(_name, ...)
}
catch (ParamsNotCorrectException  ex)
{
    MessageBox.(ex.Message); //к примеру
}
catch (Exception someEx)
{
    //ошибка при работе с бд
    MessageBox.Show(someEx.Message);  //к примеру
}
}

такой подход (что выше) изобилует catch'ами, это нормально ? или к примеру стоит проверять данные (на пустые поля) на уровне граф интерфейса, и не делать лишнего ParamsNotCorrectException  ? 

Класс OperatorManager сделан как прослойка (Data Access Layout), для того, что бы к примеру при смене базы данных ( с FireBird на, например MS SQL) не были затронуты методы доступные гуи апп (из класса DataManager). Сторона "Приложения" нечего и не узнает о изменившейся бд
этакая, мини реализация Hibernate

Как бы вы реализовали подобный случай более "красиво" и правильно ?
можно реализовать метод AddOperator на уровне DataManager, так что бы он возвращал false в случаи не удачи (не возможности добавить данные в бд) то тогда это не о чем не будет говорить стороне - клиента (гуи арр), будет ток понятно что "данные не удалось добавить", тоже вроде не очень красиво

Надеюсь, более менее понятно изложил
Спасибо

Это сообщение отредактировал(а) Exai1e - 7.7.2010, 13:43


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
Mephisto
Дата 7.7.2010, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 2
Всего: 34



Я бы так и делал. На уровне гуев тоже можно проверить некоторую адекватность, но имхо сейчас правильное решение выбрал. 
Через некоторое время у тебя к добавлению операторов может быть прикручен другой гуй, так что проверка адекватности внутри тебе пригодится.
К такому коду проще написать автоматические тесты.
PM   Вверх
N1ko
Дата 8.7.2010, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

Репутация: нет
Всего: нет



Цитата(Exai1e @ 7.7.2010,  13:33)
Здравствуйте, возник такой вопрос, по архитектуре классов работающих с бд:
К примеру, работа с базой данных.

Как мне кажется Ваш подход изначально не совсем корректен. Предположем Вам захочется добавить ещё одну новую таблицу. Вы будете писать новый класс под неё, создавая новые поля,свойства, отвечающие за структруру таблицы?  ИМХО это лишня трата усилий и времени. Я бы реализовал классы DBObject,DBTable,DBField и ещё дополнительные, которые позволят производить разные опреации над объектами БД. Например класс, который будет отвечать за выполнение процедур, либо вставки данных и тд. В таких случаях я обращаюсь к ДАО паттерну, дабы реализовать такую вот штуку.

 В результате что бы добавить новую таблицу, я просто вызову метод 
Код

SomeDBObject.AddTable(string FieldNameCollection)//через запятую

Но это только моё мнение, которое не претендует на что то большее.


Это сообщение отредактировал(а) N1ko - 8.7.2010, 13:54
PM MAIL ICQ   Вверх
Mephisto
Дата 8.7.2010, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 2
Всего: 34



N1ko, Ваш код сложно тестировать(имею в виду автоматическое тестирование).
Вообще имеет право на жизнь, но все-же лучше иметь некоторую прослойку между отображением данных и средством хранения данных. Это дороже и больше писать. Но если дальше предполагается расширение, возможно смена метода хранения, то прослойка будет неоценима, упростит жизнь и сделает продукт дешевле и прозрачней.
PM   Вверх
N1ko
Дата 8.7.2010, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 383
Регистрация: 30.12.2007
Где: Киев

Репутация: нет
Всего: нет



Я не совсем понимаю, что значит прослойка. Не могли бы ли вы объяснить, что под этим подразумевается?
PM MAIL ICQ   Вверх
Mephisto
Дата 8.7.2010, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 2
Всего: 34



Я всегда стараюсь следовать этому шаблону проектирования. 
В данном случае роль сохранения данных в базу данных может выполнять сама модель, но я, как правило, делегирую сохранение другому объекту который на основании данных модели сохраняет их в базу. Это позволяет поддерживать несколько форматов. если следует сохранить в базу, то подключится один объект, если в XML, то другой, если забрать откуда еще, то третий.
PM   Вверх
Exai1e
Дата 8.7.2010, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: 3
Всего: 30



раньше я делал так, как в моем примере
*из старого проекта*
user posted image

Цитата(N1ko @  8.7.2010,  13:53 Найти цитируемый пост)
Предположем Вам захочется добавить ещё одну новую таблицу. Вы будете писать новый класс под неё, создавая новые поля,свойства, отвечающие за структруру таблицы? 

да, так и планировалось - если придется добавить новую таблицу, то буду делать новый класс

Mephisto, А можно общий пример на основе моего ? Использующий MVC, хотя бы на "вскидку" с использованием псевдокода
Спасибо


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
Mephisto
Дата 8.7.2010, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Волкъ
***


Профиль
Группа: Завсегдатай
Сообщений: 1818
Регистрация: 27.8.2003
Где: Питер

Репутация: 2
Всего: 34



Цитата(Exai1e @  8.7.2010,  17:51 Найти цитируемый пост)
Mephisto, А можно общий пример на основе моего ? Использующий MVC, хотя бы на "вскидку" с использованием псевдокода
Спасибо 

Дык зачем писать, гугл дает много хороших, толковых примеров на запрос "пример MVC"
пример 1
Пример 2
оба неплохи, это из первых что посмотрел.
Тут уже более сложно, но очень подробно в статье.
PM   Вверх
Exai1e
Дата 8.7.2010, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: 3
Всего: 30



Mephisto, Спасибо


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
jonie
Дата 8.7.2010, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Я бы лично наследовался не от Exception, а сделал бы базовый для вашей ORM (если так можно сказать) и наследовался бы от него.... тут и catch-ей можно поуменьшить (где надо)...

тема где я призываю вас пообсуждать достоинства и недостатки ORM


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0499 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.