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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рефакторинг с использованием паттернов, сделать рефакторинг кода программы  
:(
    Опции темы
myendlessness
Дата 17.1.2011, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



          У меня есть конкретная программа по компрессии и декомпрессии картинок формата tif. Изначально, данная программа была ”сделана в лоб”, то есть содержит не оптимальный код, некоторые части переделывались по несколько раз, некоторые писались “на ходу”. Всё было сделано методом проб и ошибок без определённого тех задания. На данный момент я решил освоить паттерны проектирования и привести весь код в человеческий вид. Прошу Вашей помощи, так как только начал осваивать паттерны, и их практическая реализация для меня ещё остаётся загадкой. Давайте вместе сделаем это от начала до конца, и это будет примером для других, как делать рефакторинг, хотелось бы сделать живую и горячо обсуждаемую ветку. 

Вот список методов, которые содержатся в моей программе: 

Код

//Initialization of the main form
public Form1()
private void Form1_Load(object sender, EventArgs e)

//Opening the settings form
private void toolStripMenuItem3_Click(object sender, EventArgs e)

//Opening the "about programm" form
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)

//Opening the downloading form
private void downloadingToolStripMenuItem_Click(object sender, EventArgs e)

//The open window
 private void openToolStripMenuItem_Click(object sender, EventArgs e)

//The save window
private void saveToolStripMenuItem_Click(object sender, EventArgs e)

//The exit window
private void exitToolStripMenuItem_Click(object sender, EventArgs e)

//Estimate of the time of processing
public string TimeOfProcess(Stopwatch sw)

// ReturMassive method transforms file length 
public uint ReturnMassive(string file_path)
public char[] uintToByte(uint j)
public byte[] CharToByte(char[] mas)
public uint ByteTouint(char[] mas, int number)

// Находим насколько смещены ”данные картинки”, находятся ли они вначале файла или в конце                                                                          
public char[] dataProcessing(byte[] mas, char[] pix_mas, uint number, uint k)

public string FindFile(string text)

// Информация о файле ширина, длина, глубина
public uint[] Information(byte[] pixels)
public uint[] Information(FileStream fileStream, uint number, int method)

// Return the length of a field 
public uint FieldTypes(uint types)

// Compress the massive (include Library) 
unsafe public byte[] Encode(byte[] massive, uint[] massiveOfParameters, double[] additionalMassive, uint sizeMassive)

// Decompress the massive (include Library) 
unsafe public byte[] Decode(byte[] massive, uint[] massiveOfParameters, double[] additionalMassive, uint sizeMassive)

//The encode button
private void button1_Click(object sender, EventArgs e)

//The decode button
private void button2_Click(object sender, EventArgs e)

//Далее идёт обработка tif файла в зависимости от того где в нём хранятся данные в самом начале контейнера или в конце

public void EncodeEnd(FileStream Text, uint sum, byte[] pixels1, uint sizeMassive)

public void EncodeEnd(FileStream Text,FileStream Tiff, uint sum)

public void EncodeBegin(FileStream Text, byte[] pixels1, uint sizeMassive)

public void EncodeBegin(FileStream Text, FileStream Tiff, uint numberOfDirectoryEntries)

unsafe public byte[] Encode(byte[] buffer,uint[] pixels, uint size)

public FileStream DecodeEnd(byte[] pixels_d1,FileStream Tiff)

public FileStream DecodeBegin(byte[] pixels_d1, FileStream Tiff)

unsafe public byte[] Decode(byte[] massive, uint[] massiveOfParameters,uint PAGE_SIZE)



Сразу возникают вопросы:
- как сделать программу более универсальной, чтобы проще было обрабатывать разные форматы tif?                                                                                                                                                                                      
-  можно ли заложить некий интерфейс, чтобы в будущем можно было обрабатывать не только tif? 
-  на данный момент один пиксель равен 256 бит, а если в дальнейшем необходимо будет увеличить глубину как это реализовать?                                                                                                               
- есть ли смысл что-то скинуть в библиотеку?                                                                                                      
- на какие паттерны проектирования стоит обратить внимания, и какие здесь наиболее применимы? 

PM MAIL   Вверх
Kaerus
Дата 17.1.2011, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WPF'er
*


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

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



Можно с начало поинтересоваться о мотивации - зачем было изобретать велосипед и зачем его дальше улучшать (будет ли эта библиотека где нибудь использоваться)?

А по теме, прочитай Рефакторинг с использованием шаблонов. Так же можешь пройтись по коду ReSharper и StyleCop

Это сообщение отредактировал(а) Kaerus - 17.1.2011, 13:28
PM MAIL ICQ   Вверх
myendlessness
Дата 17.1.2011, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Kaerus @ 17.1.2011,  12:36)
Можно с начало поинтересоваться о мотивации - зачем было изобретать велосипед и зачем его дальше улучшать (будет ли эта библиотека где нибудь использоваться)?

А по теме, прочитай Рефакторинг с использованием шаблонов. Так же можешь пройтись по коду ReSharper и StyleCop

Да, в дальнейшем эта программа будет использоваться. Мотивация простая - попробовать на конкретном примере, что такое паттерн проектирование, книги я читал, но теория одно, а практика другое. Пока не реализуешь что-то конкретное своими руками не почувствуешь, что к чему. 
PM MAIL   Вверх
Экскалупатор
Дата 17.1.2011, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



myendlessness, так в чем конкретно у тебя проблема? ты не знаешь как разделить прогу на слои? функционал можно закладывать почти любой, главное четко представлять что конкретно нужно заложить.

PM MAIL ICQ   Вверх
myendlessness
Дата 18.1.2011, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Экскалупатор @ 17.1.2011,  23:18)
myendlessness, так в чем конкретно у тебя проблема? ты не знаешь как разделить прогу на слои? функционал можно закладывать почти любой, главное четко представлять что конкретно нужно заложить.

Если честно, то не знаю с какой стороны подойти, с чего начать и как разделить на слои тоже не понимаю. Какой функционал должен быть знаю так как прога уже работает, но код там ужасный! 
PM MAIL   Вверх
Экскалупатор
Дата 18.1.2011, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



myendlessness, ну в общем должно получаться что обработка данных это бизнеслогика, отображение(взаимодействие с пользователем) тоже в отдельный слой. отображение не должно знать как работает бизнес логика.
PM MAIL ICQ   Вверх
Kaerus
Дата 18.1.2011, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WPF'er
*


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

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



Да начать можно с паттерна MVC, на вики http://ru.wikipedia.org/wiki/Model-View-Controller есть ссылки на русские статьи по теме
PM MAIL ICQ   Вверх
Экскалупатор
Дата 18.1.2011, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



myendlessness, если ты не понимаешь какие методы конкретно куда распихивать, то надо смотреть что у тебя за методы. опиши конкретнее и что не знаешь куда поместить.
PM MAIL ICQ   Вверх
myendlessness
Дата 19.1.2011, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Экскалупатор @ 18.1.2011,  21:25)
myendlessness, если ты не понимаешь какие методы конкретно куда распихивать, то надо смотреть что у тебя за методы. опиши конкретнее и что не знаешь куда поместить.

Так, попробуем разделить все методы на логические составляющие: 

Загрузка формы: 
Код

public Form1()
private void Form1_Load(object sender, EventArgs e)


Методы, отвечающие за меню, находящемся на форме:

Код

//Открывается стандартное окно выбора файла
 private void openToolStripMenuItem_Click(object sender, EventArgs e)

//  Открывается стандартное окно сохранения файла
private void saveToolStripMenuItem_Click(object sender, EventArgs e)

//Стандартная кнопка закрытия программы
private void exitToolStripMenuItem_Click(object sender, EventArgs e)

//Открывается форма где можно производить настройки программы
private void toolStripMenuItem3_Click(object sender, EventArgs e)

// Методы достающие и отображающие информацию  о файле - ширина, длина, глубина
public uint[] Information(byte[] pixels)
public uint[] Information(FileStream fileStream, uint number, int method)


Видимо всё вышеперечисленное можно отнести к отображению? Именно эти методы отвечают за взаимодействие с пользователем. 

Код

//Оценка времени компрессии-декомпрессии файла
public string TimeOfProcess(Stopwatch sw)

// Методы конвертации из двоичного представления “1011..” в другие форматы   

public char[] uintToByte(uint j)
public byte[] CharToByte(char[] mas)
public uint ByteTouint(char[] mas, int number)


Эти 4 метода куда лучше запихнуть, может в библиотеку?

Далее идут методы непосредственной обработки файла, то есть его компресиии-декомпрессии, видимо, это и является бизнес логикой 

Код

//Обработка события – нажатие кнопки кодировать
private void encode_Click(object sender, EventArgs e)

//Обработка события – нажатие кнопки декодировать
private void decode_Click(object sender, EventArgs e)


Далее начинается непосредственная обработка картинки, вначале мы ищем где конкретно в tif-контейнере зашиты данные о картинке и данные картинки, они могут быть либо вначале, либо в конце, соответственно: 

Код

// Находим насколько смещены ”данные картинки”, находятся ли они вначале файла или в конце                                                                          
public char[] dataProcessing(byte[] mas, char[] pix_mas, uint number, uint k)


Далее идёт обработка tif файла в зависимости от того где в нём хранятся данные в самом начале контейнера или в конце

Код

//данные в конце файла
public void EncodeEnd(FileStream Text, uint sum, byte[] pixels1, uint sizeMassive)


// данные в начале файла 
public void EncodeBegin(FileStream Text, byte[] pixels1, uint sizeMassive)



И, в конечном итоге, все необходимые и подготовленные данные передаются непосредственно в библиотеку сжатия:
  

Код

// Библиотека, которая сжимает файл
unsafe public byte[] Encode(byte[] massive, uint[] massiveOfParameters, double[] additionalMassive, uint sizeMassive)



Аналогичным образом при декомпрессии, определяем где в сжатом файле находились данные вначале или в конце затем отправляем на один из двух декодеров

Код

public FileStream DecodeEnd(byte[] pixels_d1,FileStream Tiff)
public FileStream DecodeBegin(byte[] pixels_d1, FileStream Tiff)


и в конечном итоге в библиотеку декодирования 

Код

unsafe public byte[] Decode(byte[] massive, uint[] massiveOfParameters, double[] additionalMassive, uint sizeMassive)


Добавлено через 2 минуты и 23 секунды
Цитата(Kaerus @ 18.1.2011,  18:44)
Да начать можно с паттерна MVC, на вики http://ru.wikipedia.org/wiki/Model-View-Controller есть ссылки на русские статьи по теме

Спасибо за ссылку, я посмотрел, теоретически всё понятно, а как встаёт вопрос, как именно практически всё это применить, то не хватает, видимо, программерского опыта или "чувства абстракции". В любом случае буду ещё изучать и думать! 

СПАСИБО ВСЕМ КТО ПОМОГАЕТ!  
PM MAIL   Вверх
Экскалупатор
Дата 19.1.2011, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



а почему 
"// Методы достающие и отображающие информацию  о файле - ширина, длина, глубина"
находятся в отображении? отображение вообще не должно ничего знать о файле(по крайней мере оно не должно знать откуда брать инфу), бизнес логика должна говорить отображению что отобразить.

для начала тебе нужно понять что чтение/сохранение файла это один уровень. обработка каких то данных это второй уровень. отображение это третий уровень.

и у меня сложилось такое впечатление что ты хочешь что бы "библиотека" была еще одним уровнем. что лишено смысла в принципе.
PM MAIL ICQ   Вверх
myendlessness
Дата 20.1.2011, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Экскалупатор @  19.1.2011,  22:38 Найти цитируемый пост)
а почему 
"// Методы достающие и отображающие информацию  о файле - ширина, длина, глубина"
находятся в отображении? отображение вообще не должно ничего знать о файле(по крайней мере оно не должно знать откуда брать инфу), бизнес логика должна говорить отображению что отобразить.


Тогда получается, что отображение это будут некие абстрактные классы? Что это значит? У нас есть интерфейс пользователя, за каждой кнопкой, грубо говоря, стоит событие и как тогда отделить события от кнопок и прочих тулзов? 


Цитата(Экскалупатор @  19.1.2011,  22:38 Найти цитируемый пост)

и у меня сложилось такое впечатление что ты хочешь что бы "библиотека" была еще одним уровнем. что лишено смысла в принципе. 


С библиотекой, к сожалению, не всё так просто, она просто огромная, там куча математики, написана на другом языке и поэтому я пошёл по самому простому решению - сделал всё это в виде библиотеки и подключить её к моей программе. 

PM MAIL   Вверх
Экскалупатор
Дата 20.1.2011, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



myendlessness, отображение это то что показывает пользователю в каком состоянии находится твоя прога и принимает от пользователя какие то "сигналы"(нажал кнопку, прокрутил скролом и пр.) при этом форма по сути должна сообщать бизнеслогике что с ней что то произошло. а бизнес логика уже должна решать что дальше делать.


Цитата(myendlessness @  20.1.2011,  11:11 Найти цитируемый пост)
Тогда получается, что отображение это будут некие абстрактные классы?

почему абстрактные? вполне конкретные классы форм, контролов и пр.

Цитата(myendlessness @  20.1.2011,  11:11 Найти цитируемый пост)
С библиотекой, к сожалению, не всё так просто, она просто огромная, там куча математики, написана на другом языке и поэтому я пошёл по самому простому решению - сделал всё это в виде библиотеки и подключить её к моей программе. 

с какой целью делать из всего этого отдельную библиотеку? это бы имело смысл если бы этой  библиотекой должны были пользоваться разные приложения, или если планируется что то менять в библиотеке(не меняя интерфейсов) и что бы не перекомпилировать весь проект можно просто подключать библиотеку. а если это просто для отделения математики то думаю гемора будет больше.
PM MAIL ICQ   Вверх
myendlessness
Дата 21.1.2011, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Экскалупатор @  20.1.2011,  16:20 Найти цитируемый пост)
отображение это то что показывает пользователю в каком состоянии находится твоя прога и принимает от пользователя какие то "сигналы"(нажал кнопку, прокрутил скролом и пр.) при этом форма по сути должна сообщать бизнеслогике что с ней что то произошло. а бизнес логика уже должна решать что дальше делать.


А можно какой-нибудь маленький, но наглядный пример? Фактически когда я "вписываю код" обработки события тем самым я стыкую отображение с безнеслогикой! По крайней мере, я себе так это представляю! 
 
Цитата(Экскалупатор @  20.1.2011,  16:20 Найти цитируемый пост)

почему абстрактные? вполне конкретные классы форм, контролов и пр.


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

 
Цитата(Экскалупатор @  20.1.2011,  16:20 Найти цитируемый пост)
с какой целью делать из всего этого отдельную библиотеку? это бы имело смысл если бы этой  библиотекой должны были пользоваться разные приложения, или если планируется что то менять в библиотеке(не меняя интерфейсов) и что бы не перекомпилировать весь проект можно просто подключать библиотеку. а если это просто для отделения математики то думаю гемора будет больше. 


Да в библиотеке постоянно что-то меняется, вносятся коррективы, новые свежие мысли и поэтому она отделена! 
PM MAIL   Вверх
Экскалупатор
Дата 21.1.2011, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(myendlessness @  21.1.2011,  12:05 Найти цитируемый пост)
Фактически когда я "вписываю код" обработки события тем самым я стыкую отображение с безнеслогикой!

фактически да, но ты просто вызываешь какой то метод бизнеслогики. к примеру, форма должна показать размер файла, но эти данные ей должна сообщить бизнеслогика, которая в свою очередь определяет где ей взять этот размер(спросить у файла, посмотреть где то, может в базе и пр.) и бизнеслогика возвращает эти данные форме. при этом форма, грубо говоря, остается в неведении откуда эти данные взялись, она просто их показывает и все.
PM MAIL ICQ   Вверх
myendlessness
Дата 24.1.2011, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



2 Экскалупатор

  Хорошо, допустим, я отделю методы бизнеслогики от отображения. Как действовать дальше? Как определить какие паттерны можно эффективно применить к этой задаче? И как их вообще применить, как подступиться? 
PM MAIL   Вверх
Экскалупатор
Дата 24.1.2011, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(myendlessness @  24.1.2011,  16:07 Найти цитируемый пост)
Как действовать дальше? Как определить какие паттерны можно эффективно применить к этой задаче? И как их вообще применить, как подступиться? 

это все  smile  smile  smile 

совершенного алгоритма действий не существует. все приходит с опытом. надо исходить из задачи. начни с MVC. Посмотри паттерн mediator.
вообще не раз сталкивался с ситуацией когда пытаешься сделать максимально удобно(но и максимально по принципам ООП) и в итоге приходишь к какому то паттерну. (как с тем же mvc, логично и удобно отделить обработку данных от кода который получает и сохраняет данные).
PM MAIL ICQ   Вверх
myendlessness
Дата 25.1.2011, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Экскалупатор @  24.1.2011,  18:57 Найти цитируемый пост)
совершенного алгоритма действий не существует. все приходит с опытом. надо исходить из задачи. начни с MVC.


Почитав литературу и полазив по сайтам, я составил вот такой классификатор:

Запрос на вывод интерфейса программы по умолчанию: пользователь  → контроллер → представление
Отображение интерфейса программы: представление → пользователь 
Ввод данных: пользователь  → контроллер
Проверка данных: контроллер
Передача данных на вычисление: контроллер → модель
Возврат результатов вычисления: модель → контроллер
Отображение результатов: контроллер → представление  
 

Вот такие вопросы появились при разборке паттерна MVC для моей задачи:

Нужно ли создавать отдельные классы для Модели, Представления и Контроллера? 

Если с компонентом Модель всё более или менее понятно, то процесс разделение Контроллера и Представления не ясен?  Кто что об этом думает?

PM MAIL   Вверх
Экскалупатор
Дата 25.1.2011, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(myendlessness @  25.1.2011,  15:10 Найти цитируемый пост)
Проверка данных: контроллерПередача данных на вычисление: контроллер → модельВозврат результатов вычисления: модель → контроллер

чем по сути отличается проверка данных от вычислений? на мой взгляд это все должен делать контроллер, ни представление ни модель про эти операции слышать ничего не должны. если у тебя конечно выполняются запросы к базе и там что то считает то это другое дело. но в общем случае модель должна предоставить данные и сохранить данные, что с этими данными происходит она(модель) знать не должна. (другой вопрос если приложение клиент-сервер и обработку выполняет сервер, там немного по другому все.)
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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