Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Давайте создадим ещё один форум, по рефакторингу 
:(
    Опции темы
altarasjuk
Дата 19.7.2003, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Господа Админы smile.gif

Давайте создадим форум по вопросам рефакторинга. А то как-то мне кажется, что многие об этом не знают sad.gif , а хорошо было бы, чтобы узнали. Как ни как, а очень важный раздел программирования.


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
HalkaR
Дата 19.7.2003, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пуфыстый назгул
****


Профиль
Группа: Экс. модератор
Сообщений: 2132
Регистрация: 8.12.2002
Где: В Москве

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



А что это?
PM MAIL   Вверх
altarasjuk
Дата 20.7.2003, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Рефакторинг - это процес улучшения существующего кода ("наведения порядка в коде").
Оновние задачи рефакторинга:

1. Оптимизация (не по скорости, а по понятности) кода для более лёгкого дальнейшего расширения.
2. Повторное использование кода.
3. Инкапсуляция особого поведения классов в подклассы.
4. Саме главное - отделение визуальной части от функциональности. т.е. всё что есть на форме - создано ТОЛЬКО для того, чтобы "на него сотреть" и не должно нести за собой НИКАКОЙ функциональности.

и т.п.

самый простейший например (с вашего позволения буду использовать синтаксис Java):
Начальный файл
Код

public class MovieCostPrinter{

 public static void main(String[] args) {
   MovieCostPrinter costPrinter = new MovieCostPrinter();
   
   Movie movie1 = new Movie(Movie.NEW);
   Movie movie2 = new Movie(Movie.OLD);
   Movie movie3 = new Movie(Movie.REGULAR);
   
   costPrinter.printMovieCost(movie1);
   costPrinter.printMovieCost(movie2);
   costPrinter.printMovieCost(movie3);
 }
 
 public void printMovieCost(Movie movie) {

   double cost = 0;

   switch (movie.getMovieType()) {
     case Movie.REGULAR:
       cost = movie.getCost();
       break;
     case Movie.NEW:
       cost = movie.getCost()*1.1; //так прийдётся делать каждый раз
       break;
     case Movie.OLD:
       cost = movie.getCost()*0.65;
   } //Не сильно удачное решение.

   System.out.println(cost);
 }

}

class Movie {
 public static final int REGULAR = 1;
 public static final int NEW = 2;
 public static final int OLD = 3;

 private int movieType;
 private final double cost = 20;

 Movie(int movieType) {
   this.movieType = movieType;
 }

 public int getMovieType() {
   return movieType;
 }

 public double getCost() {
   return cost;
 }
}


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

1. Переместим вычисление стоимости в подклассы (создадим их) и заменяем конструктор фабрчным методом:
Код

public class MovieCostPrinter {

 public static void main(String[] args) {
   MovieCostPrinter costPrinter = new MovieCostPrinter();

   Movie movie1 = Movie.createMovie(Movie.NEW);
   Movie movie2 = Movie.createMovie(Movie.OLD);
   Movie movie3 = Movie.createMovie(Movie.REGULAR);

   costPrinter.printMovieCost(movie1);
   costPrinter.printMovieCost(movie2);
   costPrinter.printMovieCost(movie3);
 }

 public void printMovieCost(Movie movie) {
   System.out.println(movie.getCost()); //Просто вызываем метод абстрактного класса.
 }

}

abstract class Movie {
 public static final int REGULAR = 1;
 public static final int NEW = 2;
 public static final int OLD = 3;

 protected final double cost = 20;

 public abstract double getCost();

 static Movie createMovie(int movieType) { // Заменяем конструктор фабричным методом
   switch (movieType) {
     case REGULAR:
       return new RegularMovie();
     case NEW:
       return new NewMovie();
     case OLD
       return new OldMovie();
     default:
       throw new RuntimeException("Invalid movie type"); //Вызываем Exception если чё не то.
   }
 }
}

class RegularMovie extends Movie {

 public double getCost() {
   return cost; //перенос особого поведения в наследника
 }

}

class NewMovie extends Movie {

 public double getCost() {
   return cost * 1.1;  //перенос особого поведения в наследника
 }

}

class OldMovie extends Movie {

 public double getCost() {
   return cost *0.65; //перенос особого поведения в наследника
 }

}


Вроде как ничего в поведении не поменялось. Однако есть некоторые преймущества перед старым кодом:
1. Если нам понадобится где-то ещё вычислить стоимость, то не потребуется switch.
2. На всю работу с классами Movie у нас всего один switch. А это уж поверь - очень большой плюс.
3. Всё особое поведение инкапсулировано в отдельные подклассы, следовательно если добавиться ещё один тип, то надо изменить всего один switch и написать соответсвующий подкласс.

На самом деле это очень простой пример, на котором не возможно понять выгоды проделанного. Для того чтобы понять выгоду, нужно разобрать очень большой пример. И рефакторинги, которые при этом осущиствляются - очень сложные. Этот пример просто не может отразить полной сути.
В принципе, полиморфизм - общеизвестный факт. Тут нет ничего нового. Важно научиться его правильно использовать. К примеру у кого не разу не было такого, чтобы свой объект наследовался от како-го либо другого, при этом он использовалось всего несколько методов родительского объёкта. Для этого надо выполнять замену наследования делегирование. И ситуации наоборот, что свой объект представляет собой только делегирующие методы, тогда нужно выполнять обратную операцию.
Вооооообщем всё так не опишешь, можно только запутать....

Ну я думаю все смысл поймали.

По этому поводу я могу посоветовать книгу (это не реклама, просто книга действительно очень хорошая smile.gif ) Рефакторинг, Мартин Фаулер. В ней методы рефакторинга очень хорошо описаны.

Ещё в тему есть понятие шаблонов проектирования. Тоже близкое по своему назначению.

Это сообщение отредактировал(а) altarasjuk - 20.7.2003, 14:00


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
Step
Дата 21.7.2003, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

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



это излишне....


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


Опытный
**


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

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



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


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
Step
Дата 21.7.2003, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

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



altarasjuk да я не имею не чего против, но просто подумай как много людей будут заходить в этот раздел, он просто вымрет....


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Wowa
Дата 21.7.2003, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

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



Step прав..... Хотя идея бесспорно очень интересна!

Возможно имело бы смысл сделать что-типа какой-то рубрики в нашей рассылки или может регулярно писать статьи на эту тему и публиковать на форуме.
PM WWW   Вверх
altarasjuk
Дата 22.7.2003, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Admin, ну на счёт вымрет - не вымрет, не знаю, но то что о рефакторинге и вообще о правилах написания программ никто не знает (сужу по разделу Delphi). Уж в самой Делфе так повелось, что.... ну не умеют люди отделить интерфейс от реализации sad.gif. А всё почему? да потому что каждая книга по Delphi начинается с "Создадим форму. Поцепим на неё кнопку. И УРААА!!!! мы изучили программирование!!!!", один только подход чего стоит?


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
DENNN
Дата 22.7.2003, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Идея очень интересная, мне нравиться. Но вот чем заполнять такой раздел я совершенно не представляю.
Публиковать большие объемы кода (иначе какой рефакторинг?), а потом вместе обсуждать что получиться: боюсь у нас опять будет на флейм похоже.
Может сделать иначе: тема рефакторинг и грамотное написание кода, но по смыслу создание OpenSource? Скажем разрабатывается несколько проектов, постоянно висит последняя редакция кода, каждый может взглянуть, обсудить и предложить что-то свое (или преслать новый кусок кода). А админы и ответственные товарищи хороший кусок кода добавляют в разрабатываемый проект. Заодно и проблемы написания переносимого кода обсудим.
Этакая технология написания Linux - каждый может сделать то, что у него хорошо получается.

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

Как такая идея?
PM ICQ   Вверх
DENNN
Дата 22.7.2003, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А раздел "статьи" уже работает?
PM ICQ   Вверх
podval
Дата 22.7.2003, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

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



altarasjuk
Можешь начать постить о рефакторинге в раздел "Технологии и алгоритмы", ибо считаю, что рефакторинг - технология, достойная того, чтобы о ней знали. Если тебе много есть, чего сказать, то сделаем тему, куда ты будешь постить свои мысли, а обсуждение можно забить в соседнюю тему.
PM WWW ICQ   Вверх
Step
Дата 22.7.2003, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

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



Цитата
Уж в самой Делфе так повелось, что.... ну
это точно....


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
altarasjuk
Дата 22.7.2003, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
Если тебе много есть, чего сказать
podval, ну тук как сказать, допустим я просто физически не потяну вести такую тему один (работы просто валйом), но допустим переодически какие-то мысли, напутствия, а может даже статейки, буду кидать с удовольствием. Хорохо если все кто в этом разбираются что-то дополняли, что-то своё вносили.... Ну я думаю мысль уловил..... smile.gif

Это сообщение отредактировал(а) altarasjuk - 22.7.2003, 23:44


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
podval
Дата 23.7.2003, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

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



altarasjuk
Тогда тебе прямой путь в "Технологии и алгоритмы". Прежде чем открывать новый форум, твою тему надо бы обкатать. Поэтому периодически там публикуй. При надобности тему закрепим сверху.
PM WWW ICQ   Вверх
altarasjuk
Дата 23.7.2003, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
Правда - изобретение маньяков: колет глаза и режет уши.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Обсуждение форума | Следующая тема »


 




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


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

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