maran program engineering (830029), страница 24
Текст из файла (страница 24)
РефакторингПод рефакторингом понимают изменение кода программы с целью повышения его качества без изменения ее функционала. Не рекомендуют одновременно менять функциональные возможности и проводить рефакторинг, потому что тогда «ситуация может выходить из-под контроля». Вопросы рефакторинга подробно рассмотрены в [11], более сжатое изложение можно найтив [4].Цели проведения рефакторинга:1. Облегчение понимания программного комплекса в целом. В ходе разработки придется внести различные изменения и усовершенствования, в результате которых может теряться стройность системы в целом. рефакторинг позволяет исправить ситуацию.2. Рефакторинг позволяет делать текст программы более понятным.3. Рефакторинг способствует нахождению ошибок в результате повышениякачества кода.Рефакторинг является существенной составной частью при разработкепрограмм по технологии экстремального программирования.Для успешного рефакторинга необходимо:1.
Применять автоматизированное тестирование для проверки программпосле каждого изменения.2. Сохранить текст программы без изменений в первоначальном виде, вслучае неудачи можно к нему вернуться.3. Применять итерационную разработку.4. Регулярно проводить рефакторинг.145Рассмотрим средства рефакторинга в среде Microsoft Visual Studio. Тампредусмотрено следующее:• переименование;• упорядочение параметров;• удаление параметра;• инкапсуляция поля;• создание интерфейса;• извлечение метода.Рассмотрим их по очереди.Переименование. Можно переименовать все введенные программистомимена, независимо от того, что они обозначают (переменные, массивы, функции).
Для этого выделим имя, которое необходимо менять, активизируем контекстное меню, далее пункт «Рефакторинг» и «Менять имя». В ответ предлагают ввести новое имя и спросят, надо ли менять это имя в комментариях и строках. Далее откроется диалоговое окно, где будет показано, где именно имя будет изменено, с помощью кнопок выбора можно часть переименований отменить. Естественно, это допустимо только для комментариев и строк, иначе одини тот же объект будет в разных частях программы назван по-разному.
При подтверждении переименования старое имя везде в своей области действия, включая классы-наследники, будет заменено на новое. Пусть имеется следующийкласс:class clb{double[] mas;double x, y;public clb(int m25){mas = new double[m25];x = 3.5;}public void inpt(){for (int i = 0; i < mas.Length; i++){// Ввод массива masConsole.Write("mas["+i+"]=");mas[i] = Convert.ToDouble(Console.ReadLine());}}public int KolC(double n, int m){return mas.Where(p => p > n).Count();}146public void otpt(){Console.WriteLine("x=" + x);}}Проведем по очереди два переименования: заменим имя переменной x наx25 и имя массива mas на arr.
В каком месте мы выделим переменную для переименования, не имеет значения. Обратите внимание, что оба имени присутствуют кроме текста программы в комментариях и символьных строках. Результат приведен ниже:class clb{double[] arr;double x25, y;public clb(int m25){arr = new double[m25];x25 = 3.5;}public void inpt(){for (int i = 0; i < arr.Length; i++){// Ввод массива arrConsole.Write("arr["+i+"]=");arr[i] = Convert.ToDouble(Console.ReadLine());}}public int KolC(double n, int m){return arr.Where(p => p > n).Count();}public void otpt(){Console.WriteLine("x25=" + x25);}Упорядочение параметров.
При желании изменить очередность параметров функции можно выделить их в самой функции или в любом месте еевызова и через контекстное меню выбрать «Рефакторинг» и «Очередность параметров». В открывшем диалоговом окне с помощью стрелок можно определить новую очередность параметров, после утверждения их очередность будетизменена везде, где эта функция встречается.147Удаление параметра. Выделим список параметров функции в самойфункции или в любом месте ее вызова, откроем описанным выше способомдиалоговое окно, где будут показаны все параметры.
Выберем из них нужный иудалим его. Удаление будет автоматически распространено.Инкапсуляция поля. Под этим термином понимается создание свойства,представляющее переменную и/или массив. При инкапсуляции по очереди переменной у и массива arr будут созданы следующие свойства:public double[] Arr//имя свойства по умолчанию{get { return arr; }set { arr = value; }}public double PropY{//имя свойства выбрано программистомget { return y; }set { y = value; }}Создание интерфейса. Для создания интерфейса выделим компоненткласса, активизируем контекстное меню, дойдем до пункта контекстного меню«Создать интерфейс».
Откроется диалоговое окно, в котором мы должны выбрать включаемые в создаваемый интерфейс компоненты класса и выбрать емуимя, если не устраивает имя по умолчанию. Будет создан интерфейс и класс, изкоторого он создавался, станет его наследником. В нашем случае может бытьсоздан следующий интерфейс:namespace Refactor1{interface Iclb{double[] Arr { get; set; }void inpt();void otpt();}}class clb : Refactor1.Iclb{ …. }Извлечение метода.
Пусть в нашем классе имеется функция:public void fun1(double c1,outdouble res){res = 0;for (int i = 0; i < mas.Length; i++)if (mas[i] > c1){148res += mas[i];mas[i] += 2.4;}}elsemas[i] -= 2.4;Выделим целиком цикл и выберем рефакторинг «Извлечение функции».Результат приведен ниже:public void fun1(double c1,outdouble res){res = 0;res = NewMethod(c1, res);}private double NewMethod(double c1, double res){ //Имя выбрано по умолчанию, его можно было изменить.for (int i = 0; i < mas.Length; i++)if (mas[i] > c1){res += mas[i];mas[i] += 2.4;}elsemas[i] -= 2.4;return res;}Рассмотрим некоторые другие методы рефакторинга, не реализованные вVisual Studio.Подъем и/или спуск метода по иерархии классов.
Если одинаковыйметод используется в нескольких классах-наследниках, то может оказаться целесообразным его перенос в класс-предок. Наоборот, если метод класса-предкаприменяется только в одном классе-наследнике, то, скорее всего, следует еготуда перенести.Введение дополнительного класса-предка, куда собраны общие части(как данные, так и методы) классов-наследников. Введение дополнительногокласса, куда собраны из исходного образующие единое целое данные и методыих обработки.Замена условного оператора полиморфизмом. Вместо условного оператора в классе-предке иметь реализованные виртуальными функциями в классах-наследниках отдельные ветви этого условного оператора.1495.10.
Работа в WPFWPF (Windows Presentation Foundation) — это новая технология разработки пользовательского интерфейса. При разработке по технологии WindowsForms размеры форм строго заданы во время проектирования, и, хотя во времяработы приложения мы можем их изменить, это ничего не даст, мы лишь увеличиваем пустое пространство формы. WPF использует усовершенствованнуюграфику, что позволяет плавно менять размеры окон во время работы с пропорциональным изменением расположения нанесенных на нее компонентов интерфейса. Кроме того, набор средств создания интерфейсов пользователя вWPF и их свойств существенно шире.
При создании многооконных приложений в WPF туда можно включить и классические формы. Уточним терминологию: при разработке по WPF мы говорим об окнах (а не о формах, как раньшепри обсуждении технологии Windows Form). Подробно WPF рассмотрено в[12]. Создание нового проекта WPF ничем не отличается от ранее рассмотренного, только выберем нужный тип.При создания проекта WPF, кроме знакомых нам частей, появится новый:описание интерфейса на языке XAML.
Это дает возможность определить свойства компонентов тремя способами:• через окно свойств;• программным путем;• в XAML.При создании нового проекта его XAML имеет следующий вид:<Window x:Class="WpfSimple.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow" Height="350" Width="525"><Grid></Grid></Window>Первые 3 строки содержат служебную информацию, мы их рассматриватьне будем.
Четвертая строка содержит заголовок окна (Title="MainWindow") иего размеры, их можно здесь и менять. Приложение — это окно, содержащеепока одну клетку (Grid). Обратите внимание на структуру описания интерфейса, она полностью соответствует требованиям языка XML от открывающейскобки <…> до закрывающей </…>, их пересечение недопустимо.
Язык XAMLчувствителен к регистру, допущенные ошибки среда обрабатывает аналогичнолюбым синтаксическим ошибкам в программе.Заложенная в WPF возможность изменения размеров окна с пропорциональным изменением расположения компонентов достигается лишь при условии, что наша пока единственная клетка будет разделена горизонтально и вертикально на «мини-клетки», они видны только во время проектирования.
Дляих создания делаем щелчок мышью на нашем окне, убедимся, что в окне пока150заны свойства Grid и определим значения его свойств ColumnDefinitions иRowDefinitions. Окно свойств содержит полосу поиска, что существенно облегчает их нахождение. Введем туда col…, и нужные нам свойства появятся. Ониимеют собственные диалоговые окна, через которые добавим 4 столбца и 3строки.5.10.1.