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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Индексаторы, правильно ли я понял? 
:(
    Опции темы
kuller
Дата 13.12.2009, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Здравствуйте!!!

Вобщем вопрос вот в чем: в курсовой работе по ООП нам сказали использовать ИНДЕКСАТОР. Я немного погуглил, отовсюду немного почитал и вот сделал для себя примерный вывод:

Код

namespace winBD
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.CenterToScreen();
            Indeksator I = new Indeksator();
            I.CreateIndeksator(10);
            Spravochnik S = new Spravochnik(1, "Серега", DateTime.Now, "BMW");
            I[0] = S;
            label1.Text = Convert.ToString(I[0].ID);
            label2.Text = I[0].Name;
            label3.Text = Convert.ToString(I[0].data);
            label4.Text = I[0].auto;
            Spravochnik S1 = new Spravochnik(2, "Игорь", DateTime.Now, "Peugeot");
            I[1] = S1;
            label5.Text = Convert.ToString(I[1].ID);
            label6.Text = I[1].Name;
            label7.Text = Convert.ToString(I[1].data);
            label8.Text = I[1].auto;
        }
    }
    public class Indeksator
    {
        private Spravochnik[] indeksator;
        public void CreateIndeksator(int n)
        {
            indeksator = new Spravochnik[n];
        }
        public Spravochnik this[int index]
        {
            get
            {
                return indeksator[index];
            }
            set
            {
                indeksator[index] = value;
            }
        }
    }

    public class Spravochnik
    {
        public int ID;
        public string Name;
        public DateTime data;
        public string auto;

        public Spravochnik(){}
        public Spravochnik(int a, string b, DateTime c, string d)
        {
            this.ID = a;
            this.Name = b;
            this.data = c;
            this.auto = d;
        }
    }
}


Кто разбирается в этом, подскажите правильное ли применение и использование ИНДЕКСАТОРА???
PM MAIL   Вверх
tol05
Дата 13.12.2009, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



два замечания:
- где проверка на IndexOutOfRange в самом индексаторе? И обработка ошибок?
- зачем CreateIndeksator? Это ведь не такой уж паттерн )) Просто при вызове конструктора класса Indeksator инициализируйте внутренний массив. 
Ведь от момента вызова конструктора Indeksator до момента вызова метода CreateIndeksator ценность этого объекта равна -1 (пользы ноль, а память он уже покушал)  )

да и использование не оптимально. 
Зачем столько лишних обращений к таблицам памяти?
Код

label5.Text = Convert.ToString(I[1].ID);
label6.Text = I[1].Name;
label7.Text = Convert.ToString(I[1].data);
label8.Text = I[1].auto;

насколько обращений меньше будет здесь?
Код

Spravochnik spr = I[1];
label5.Text = Convert.ToString(spr.ID);
label6.Text = spr.Name;
label7.Text = Convert.ToString(spr.data);
label8.Text = spr.auto;



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
kuller
Дата 14.12.2009, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



tol05, Спасибо за замечания! 

Цитата

где проверка на IndexOutOfRange в самом индексаторе? И обработка ошибок?


я тут как бы на это не обращал внимания, тут судь в том, что я хотел понять правильно как бы я применил этот ИНДЕКСАТОР или нет.

Цитата

зачем CreateIndeksator? Это ведь не такой уж паттерн )) Просто при вызове конструктора класса Indeksator инициализируйте внутренний массив. 


Это, как я понял ЭФФЕКТИВНЕЙ сделать вот так:

Код

public Form1()
        {
            Indeksator I = new Indeksator(10);
.....................................
        }

public class Indeksator
    {
        private Spravochnik[] indeksator;
        public Indeksator(int n)
        {
            indeksator = new Spravochnik[n];
        }
....................................
    }


Это сообщение отредактировал(а) kuller - 14.12.2009, 00:16
PM MAIL   Вверх
tol05
Дата 14.12.2009, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(kuller @  13.12.2009,  23:10 Найти цитируемый пост)
я тут как бы на это не обращал внимания, тут судь в том, что я хотел понять правильно как бы я применил этот ИНДЕКСАТОР или нет.

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

Цитата(kuller @  13.12.2009,  23:10 Найти цитируемый пост)

Это, как я понял ЭФФЕКТИВНЕЙ сделать вот так:

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


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
kuller
Дата 14.12.2009, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



tol05, Спасибо за объяснение! 

Тут я просто вот подумал, что если сказано использовать в курсовой этот ИНДЕКСАТОР, то наверное я сделаю так:

- как только начинает работать программа считаю количество записей в таблице
- потом создаю индексатор
- помещаю в него все записи 
- потом делаю по индексатору поиск, удаление, редактирование
- а потом каким то образом, правда еще не предумал каким, изменения с этого индексатора переношу в БД
PM MAIL   Вверх
tol05
Дата 14.12.2009, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Да, можно. Только нужно избежать усложнения работы клиента (кода) с таким индексатором
Индексатор используется, чтобы упростить доступ к структурированным данным: структуру данных прячут в объект, а доступ к каким-либо конкретным данным осуществляют через индексатор. Прячьте в массив строки.

Я бы сделал класс-индексатор с двумя открытыми методами взаимодействия с БД: ReadFromDB(...) и SaveToDB() - последний - без параметров
Т.е. использовал бы "UnitOfWork", но только очень простой - кол-во элементов внутреннего массива задавать равным кол-ву строк, тогда если какой-то элемент массива окажется равным null - значит строка была удалена, иначе .... апдейтать все строки независимо от того, были ли они изменены или нет. В конце-концов, задача действительно не в том, чтобы отложенные изменения реализовывать...

1. вызов Read...
2. работа с данными через индексатор
3. вызов Save (строки null из БД удалить, остальные - проапдейтать).

Добавлять просто так не получится. Сделать конечно можно, но это будет хлопотно для "просто примера индексатора"
)



Это сообщение отредактировал(а) tol05 - 14.12.2009, 01:22


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
ДобренькийПапаша
Дата 14.12.2009, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

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



Есть вопросы. Никогда не встречал такого кода. Что он делает?

Код

 public Spravochnik this[int index]          //что значит this[int index]?
        {
            get
            {
                return indeksator[index];
            }
            set
            {
                indeksator[index] = value;
            }
        }


Да и хотел заметить, что мне не нравится ручная инициализация Id (может так положено при индексаторе, я просто не знаю):
Код

Spravochnik S = new Spravochnik(1, "Серега", DateTime.Now, "BMW");   //Не нравится мне здесь задание ID... 


Как-то убого это выглядит, мне кажется. Можно этого избежать?


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
kuller
Дата 14.12.2009, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



tol05, ну да я так впринципе и думал

Цитата

1. вызов Read...
2. работа с данными через индексатор
3. вызов Save (строки null из БД удалить, остальные - проапдейтать).

Добавлять просто так не получится. Сделать конечно можно, но это будет хлопотно для "просто примера индексатора"


1. делаю SQL-запрос на получение количества записей в таблице БД
2. создаю индексатор такой размерности
3. SQL-запросом с БД считываю данные и заполняю индексатор ими
4. делаю по этому индексатору: поиск, удаление, изменение
5. обновляю БД по состоянию индексатора

да а вот насчет добавления данных тут подумал наверное сильно ТРУДОЕМКО будет это реализовать с индексатором, плюс к томуже после каждого изменения записи или удаления её эти изменения придеться фиксировать в БД и опять же пересоздавать и перезаполнять этот индексатор?? так выходит???
PM MAIL   Вверх
tol05
Дата 14.12.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



можно сделать проще, считывать все данные во внутреннюю DataTable (или DataSet) и через свой индексатор отбращаться к индексатору DataTable\DataSet.
Тогда и добавление новых строк будет возложено на DataTable\DataSet

Думаю, что все проблемы можно решить так
Код


private List<Spravochnik> indeksator; //вместо массива, чтобы он мог расширятья при добавлении новых данных
private DataTable myTable;
...
считывание таблицы из базы
...
//где-нибудь вначале работы вызвать
indeksator = FillInnerList(myTable); //private metod, для каждой строки таблицы создает объект Spravochnik и добавляет в список
...
public Spravochnik this[int index]
        {
            get
            {
                return indeksator[index];
            }
//я бы убрал сеттер потому как для создания нового объекта применяют метод, а не свойство, 
//к тому же индексатор создает впечатление массива конечного размера, а не бесконечного
            //set
            //{
            //    indeksator[index] = value;
            //}
        }

public void AddNewSpravochnik (Spravochnik spr) //new Spravochnik сюда передавать
{
     indeksator.Add(spr);
}

public void RemoveSpravochnik (Spravochnik spr) 
{
     indeksator[indeksator.IndexOf(spr)] = null;
}

public void Update()
{
//для каждого объекта из внутреннего списка indeksator найти его Row в myTable и проапдейтать значения
//если в myTable нет таких Row - создать (был добавлен новый индексатор)
//если какой-то из членов indeksator равен null - удалить соотв. строку из таблицы

//вызвать Update для таблицы myTable
}



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
ДобренькийПапаша
Дата 14.12.2009, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

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



Может кто-нибудь удостоит вниманием мой пост выше?)))

угу, ну вот сделав List, один из поставленных мной вопросов решился)))
Я вообще-то сразу хотел предложить сделать List, но подумал, вдруг Индексатор это что-то страшное, в чём я чего-то не понимаю)))

Это сообщение отредактировал(а) ДобренькийПапаша - 14.12.2009, 13:59


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
Heinzz
Дата 14.12.2009, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



К индексатору имхо хорошо и стэк деяний присобачить, чтобы можно было отменять какие-то действия.


--------------------
user posted image
PM MAIL   Вверх
ДобренькийПапаша
Дата 14.12.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

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



Если стэк деяний собачить, то дело идёт к паттернам по полной программе, по-моему)))


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
tol05
Дата 14.12.2009, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ИМХО это не его задача )

индексатор делает удобным доступ к состоянию объекта. и не более

А состоянием объекта должен управлять он сам. А еще лучше - клиент. Итак уже responsibilities у объекта больше чем нужно  )


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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