Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Где описывать структуру данных? / 17 сообщений из 17, страница 1 из 1
03.12.2009, 09:33:53
    #36345045
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где описывать структуру данных?
У меня есть класс
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class Data
{
    RegistryFileType fileType;
    private DefaultTableModel dtm;
    private Vector columnNames;
    private Vector hiddenColumnNames;
    private Vector hiddenColumns;
    public Data(RegistryFileType fileType, Vector columnNames, Vector hiddenColumnNames){}
    public String getXML(){}
    public JTable getTable(){}
    public void setCell(Object value, int row, String columnName){}
    public Object getCell(int row, String columnName){}
}
Заполняется он в классе
Код: plaintext
1.
2.
3.
4.
public class Parser
{
    public Parser(){}
    Data parse(String string){}
}
Причём заполняется он методом public Data(RegistryFileType fileType, Vector columnNames, Vector hiddenColumnNames){}
Где второй и третий параметры передают списки столбцов, в одном то, что будет отображаться в таблице, получаемой методом public JTable getTable(){}, а в другом то, что можно получить только методом public Object getCell(int row, String columnName){}, для служебных нужд, и хранится в векторе векторов. Ну плюс это всё потом будет выдаваться в форме XML, для сохранения в файл. Так вот я думаю, где мне создавать структуру таблицы, названия столбцов то есть? В парсере? Или убрать это из конструктора нафиг, ведь RegistryFileType уже достаточно, чтобы понять, какие столбцы понадобятся, и локализовать это в Data? Или сделать Data абстрактным, и создавать его при помощи фабрики, зависимо от того, какой там будет RegistryFileType? Или вообще куда засунуть это?
...
Рейтинг: 0 / 0
04.12.2009, 07:42:10
    #36347454
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где описывать структуру данных?
Короче понял, никто тут не занимается практическим программированием Сделаю как захочеццо, еси чо, потом отрефакторю.
...
Рейтинг: 0 / 0
04.12.2009, 09:33:22
    #36347573
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где описывать структуру данных?
XDiaBLo,
злой ты ;-))
Фаулер, к примеру, рекомендует "заменять признак типа наследованием" ( как-то так, точную формулировку лень вспоминать )) ). Иными словами, это значит, что стоить "сделать Data абстрактным, и создавать его при помощи фабрики, и локализовать это в Data". Тогда и от RegistryFileType вообще можно избавиться.
...
Рейтинг: 0 / 0
04.12.2009, 09:37:45
    #36347582
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где описывать структуру данных?
egorychXDiaBLo,
злой ты ;-))
Фаулер, к примеру, рекомендует "заменять признак типа наследованием" ( как-то так, точную формулировку лень вспоминать )) ). Иными словами, это значит, что стоить "сделать Data абстрактным, и создавать его при помощи фабрики, и локализовать это в Data". Тогда и от RegistryFileType вообще можно избавиться.
Хмм, а это идея. Нечто подобное мне приходило сегодня утром на ум, но почему-то не выкристаллизовалось в конкретную идею. Спасибо, я так и сделаю. Правда есть подозрения что могут возникнуть некоторые специфические проблемы, но там уж разберусь в процессе, может я ошибаюсь просто. Кстати, есть шаблоны "абстрактная фабрика", "фабричный метод", "строитель"... Что вы имеете в виду под фабрикой конкретно сейчас? А то я позавчера взялся за книжку по шаблонам, но пока ещё не разобрался с этими шаблонами полностью.
...
Рейтинг: 0 / 0
04.12.2009, 09:52:36
    #36347613
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где описывать структуру данных?
XDiaBLoКороче понял, никто тут не занимается практическим программированием Сделаю как захочеццо, еси чо, потом отрефакторю.

Рассказать еще раз про то как доказывали, что органы слуха у тараканов на лапках ???
...
Рейтинг: 0 / 0
04.12.2009, 09:54:34
    #36347619
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где описывать структуру данных?
Gluk (Kazan)XDiaBLoКороче понял, никто тут не занимается практическим программированием Сделаю как захочеццо, еси чо, потом отрефакторю.

Рассказать еще раз про то как доказывали, что органы слуха у тараканов на лапках ???
Нет, спасибо. Мне Егорыч уже помог направить мысль в нужном направлении.
...
Рейтинг: 0 / 0
04.12.2009, 09:59:49
    #36347630
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где описывать структуру данных?
XDiaBLo,

Мне кажется тут нужен шаблон стратегия.
В яве я не буль-буль, но попробую написать пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
 class  Data {
     private  Vector columnNames;
     private  Vector hiddenColumnNames;
     private  Vector hiddenColumns;
};

// класс, который будет заниматься заполнением данными в класс Data
 abstract   class  DataTransfer {
   abstract   void  LoadData(Data dat);
};

 class  MyDataTransfer1   extends  DataTransfer {
  void  LoadData(Data dat)
 {
 }
};

 class  MyDataTransfer2   extends  DataTransfer {
  void  LoadData(Data dat)
 {
 }
};


Пример использования:
Код: plaintext
1.
2.
3.
  Data d =  new  Data();
  MyDataTransfer f =  new  MyDataTransfer1();
  f.LoadData(d);
...
Рейтинг: 0 / 0
04.12.2009, 10:04:43
    #36347641
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где описывать структуру данных?
MAYAKOV_SV,
А парсер на что? Там такой метод я указывал:
Data parse(String string){}
Правда string надо переименовать в filename, а то непонятно становится.
...
Рейтинг: 0 / 0
04.12.2009, 10:07:36
    #36347648
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где описывать структуру данных?
MAYAKOV_SV,
Но впрочем насчёт стратегии я подумаю. Хотя по-моему это не совсем подходит. Всё равно спасибо.
...
Рейтинг: 0 / 0
04.12.2009, 10:17:22
    #36347676
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где описывать структуру данных?
XDiaBLoMAYAKOV_SV,
А парсер на что? Там такой метод я указывал:
Data parse(String string){}
Правда string надо переименовать в filename, а то непонятно становится.

Может быть я немного не то написал, давно ООП не занимался.
Есть вариант Parser сделать абстрактным с виртуальной функцией parse.
А в классе Data сделать функции для того чтобы парсер мог туда запихивать данные.
Т.е. Data занимается хранением данных и предоставляет возможность ими манипулировать.
А Parser запихивает туда данные в зависимости от стратегии.

Мой пример можно скорректировать, переименовав наименования так:
DataTransfer -> Parser
LoadData -> parse
...
Рейтинг: 0 / 0
04.12.2009, 10:23:00
    #36347691
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где описывать структуру данных?
MAYAKOV_SV,
Дак ведь тип данных то я в парсере и определяю. Форматов файлов штук пять как минимум. Думаю нужен третий класс, в который стратегию вынести, хмм, подумаю ещё.
...
Рейтинг: 0 / 0
04.12.2009, 10:33:04
    #36347725
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где описывать структуру данных?
XDiaBLoMAYAKOV_SV,
Дак ведь тип данных то я в парсере и определяю. Форматов файлов штук пять как минимум. Думаю нужен третий класс, в который стратегию вынести, хмм, подумаю ещё.

Ну еще разок напишу и больше не буду

Можно в качестве третьего класса добавить "строитель",
который в зависимости от типа файла будет возвращать
стратегию для заполнения данных.
Пишу в продолжение к своему примеру:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
   class  Parser {
    public  Data parse(String filename)
   {
     StrategyBuilder b =  new  StrategyBuilder();
     MyDataTransfer dt = b.Build(filename);
     Data d =  new  Data();
     dt.LoadData(d);
      return  d;
   }
  }
...
Рейтинг: 0 / 0
04.12.2009, 10:35:37
    #36347737
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где описывать структуру данных?
MAYAKOV_SVXDiaBLoMAYAKOV_SV,
Дак ведь тип данных то я в парсере и определяю. Форматов файлов штук пять как минимум. Думаю нужен третий класс, в который стратегию вынести, хмм, подумаю ещё.

Ну еще разок напишу и больше не буду

Можно в качестве третьего класса добавить "строитель",
который в зависимости от типа файла будет возвращать
стратегию для заполнения данных.
Пишу в продолжение к своему примеру:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
   class  Parser {
    public  Data parse(String filename)
   {
     StrategyBuilder b =  new  StrategyBuilder();
     MyDataTransfer dt = b.Build(filename);
     Data d =  new  Data();
     dt.LoadData(d);
      return  d;
   }
  }

Шикарно :) Обмозгую, как разгребу всякую фигню. Это просто не основная задача, делаю по мере появления свободного времени.
...
Рейтинг: 0 / 0
07.12.2009, 15:13:40
    #36352182
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где описывать структуру данных?
Почитал "библию", то есть GoF, и заподозрил что тут ещё Абстрактная фабрика может помочь. Почитаю дальше, может я и неправ.
...
Рейтинг: 0 / 0
07.12.2009, 15:44:10
    #36352266
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где описывать структуру данных?
Да, кажется стратегия не очень отображает то, что обработка этих данных тоже будет несколько отличаться, в зависимости от того, какой тип файла загружен. Я посмотрел, в старой версии программы, 7 типов входного файла. Из них пять обрабатываются одним образом, два немного другим. Причём раньше это было две немного разных программы, первые 5 форматов обрабатывались в одной, вторые 2 формата в другой. То есть получается либо две конкретных фабрики, либо всё таки семь, что впрочем несколько ужасает. Лучше бы их было две Кстати форматы добавляются регулярно. Хотя начальство обещало разобраться с филиалами, и оставить 2 формата. Не думаю что это произойдёт. Поэтому очень важна именно эта часть, возможность добавлять форматы. По-моему Абстрактная фабрика помочь должна, но возможно где-то тут и стратегия нужна, например раз фабрики я вижу 2, значит 7 форматов файлов, между стратегиями можно раскидать. Мне важно не шаблонов напихать побольше, а сделать гибкую систему, т.к. данный продукт часто расширяется и дополняется, и в нём уже целая помойка. Я думаю что проще переписать, предусмотрев будущие изменения и дополнения, чем и дальше по каждой мелочи, шерстить всю программу, и искать взаимозависимости. Тогда и на поддержку и внесение изменений уходить будет меньше времени, и коллегу не стыдно будет привлечь, а то пока я один поддерживаю, а другому программисту, который тут недавно, эту программу даже показать страшно, запутается вконец, и только багов добавит.
...
Рейтинг: 0 / 0
23.12.2009, 08:39:00
    #36381295
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где описывать структуру данных?
XDiaBLo,
1. Если кружить по моему примеру, то можно еще сказать:
Добавление нового типа файла состоит следующих действий
(1) добавление нового производного класса для новой стратегии (если нужна новая)
(2) корректировка функции Build
(3) если старая стратегия формирует новый тип файла и возможно нужно еще код ее поправить.

В принципе если видно две стратегии из 7, то нужно и делать две, вот пример Build:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  class  StrategyBuilder
 {
     DataTransfer Buld(filename)
     {
         ...
         // если новый тип файла, а стратегия уже написана, добавляем в условия
         // для различения типов фалов, передаем строку ext в конструктор если надо.
          if  (ext == "txt" || ext = "dat" || ext == "bat")  return   new  MyDataTransfer1(ext);
          if  (ext == "doc")  return  MyDataTransfer2();
          return   null ; // неизвестный тип файла
     }
 }
2. Меня не очень улыбнули еще такие вещи:
a) сам класс Data - вроде по названию он сущностный, а там сидит функция Data для загрузки данный, да еще по ветвящему алгоритму, т.е. два в одном...
Я считаю что классы должны выполнять свои обязанности: кто данные хранит, кто алгоритмы выполняет. Объединять стоит, если классы маленькие получаются и нет смысла в разбиении.
б) И сама фунция Data:
Это:
Код: plaintext
1.
2.
3.
     private  Vector columnNames;
     private  Vector hiddenColumnNames;
     private  Vector hiddenColumns;
    
+ это:
Код: plaintext
1.
     public Data(RegistryFileType fileType, Vector columnNames, Vector hiddenColumnNames){}
    
Весьма странная комбинация, как-то не по ООП-ному. Попытка через функцию передать массивы.
Тут тоже нужно пошерстить. Похоже код написан вообще по процедурному мышлению.

То что я привел может и не подойти или подойти частично, а вообще можно много разных вариантов предложить, все упирается в конкретную задачу, которую автор сообщения описал в начале размыто и туманно, поэтому и ответов мало...
И еще добавлю: сам не владею сильно-то шаблонами, т.к. ООП нет практики сейчас, но скажу что прочитав недавно книгу не стоит сразу пытаться выбрать шаблоны для рефакторинга своих прог. Я тоже, изучив их, сразу ринулся применять шаблоны, как результат - переделывал по нескольку раз, и еще доводил до слез пользователей, т.к. после переделки не совсем хорошо тестировал. Тут лучше поднабраться опыта и применять их для новых программ.
Вообще еще помимо GoF, обязательно почитайте про шаблоны GRASP - очень важные принципы, которые помогут правилно мыслить при проектировании ООП систем.
...
Рейтинг: 0 / 0
23.12.2009, 08:53:39
    #36381317
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где описывать структуру данных?
XDiaBLo,

По GRASP книга:
ПРИМЕНЕНИЕ UML И ШАБЛОНОВ ПРОЕКТИРОВАНИЯ. Введение в объектно-ориентированный анализ и проектирование. Крэг Ларман.
Супер книга, которую я в свое время купил супер поздно
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Где описывать структуру данных? / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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