Материал: 695_Poletajkin_A.N._Uchebno-metodicheskoe_posobie_Realizatsija_zhiznennogo_ch.1_

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

5.4. Рефакторинг

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

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

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

Некачественный дизайн кода определяется по ряду признаков:

жесткость – характеристика программы, выражающая затруднение внесения изменений в код;

хрупкость – свойство программы повреждаться во многих местах при внесении единственного изменения;

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

ненужная сложность – характеризуется тем, что программа содержит элементы, которые не используются в текущий момент;

ненужные повторения – состоят в повторяющихся фрагментах кода в программе;

непрозрачность, которая характеризует трудность кода для понимания.

Требования к содержанию отчета

Вразделе 1 следует рассмотреть заданный метод внутренней сортировки. Необходимо привести описание метода из источника (со ссылкой на него), опуская при этом детальный разбор алгоритма сортировки, представленный в источнике. Объем этой части 0,5 – 1 стр.

Вразделе 2 рассматривается структурная единица входных данных разрабатываемой программной системы и приводится вариант массива, состоящего из элементов этих данных длиной 5. Объем раздела 0,5 стр.

Вразделе 3 приводится алгоритм сортировки, построенный на основе описания заданного метода сортировки применительно к составленному

51

массиву. Алгоритм представляется в словесной форме. Например:

1.Если элемент №1 больше элемента №0, то поменять элементы местами.

2.Если элемент №2 больше элемента №0, то поменять элементы местами. И. т.д. Либо в форме псевдокода, например, так:

1.If M(1)>M(0) Then M(1) <=>M(0)

2.If M(2)>M(0) Then M(2) <=>M(0)

И т.д. На усмотрение студентов алгоритм может быть оформлен в виде

блок-схемы или структурной диаграммы.

Также в данном разделе рассматривается контрольный пример применения разработанного алгоритма. Пример для сортировки по возрастанию массива из 3-х элементов:

Шаг 0: 10, -5, 6. Шаг 1: -5, 10, 6. Шаг 2: -5, 10, 6. Шаг 3: -5, 6, 10.

Объем раздела 1 – 2 стр.

В разделе 4 приводится листинг программы, реализующей описанный в разделе 3 алгоритм сортировки. Выполняется описание переменных и основных операций, таких как проверки условий и перестановки элементов.

Выполняется описание синтаксических ошибок, возникших при построении приложения. Для этого приводится список ошибок из Visual Studio (меню Вид Список ошибок). Пример списка ошибок, скопированный через буфер обмена Windows:

Ошибка

1

"System.Console.Write(string)" является "метод", но

используется как "тип"

e:\my

documents\visual

studio

2010\Projects\Lab_4\Lab_4\Program.cs

 

Ошибка

2

"int" не

содержит

конструктор, который

принимает

аргументы "1"

e:\my

 

documents\visual

studio

2010\Projects\Lab_4\Lab_4\Program.cs

 

Ошибка

3

Требуется

";" или "=" (невозможно задать

аргументы

конструктора в объявлении)

e:\my

documents\visual

studio

2010\Projects\Lab_4\Lab_4\Program.cs

 

Далее для каждой ошибки приводится описание причины ее возникновения и способ устранения.

Также выполняется описание логических ошибок, возникших при запуске приложения. Например, перестановка элементов местами должна выполняться через промежуточную переменную в такой последовательности: 1) значение первого элемента пишется в промежуточную переменную, 2) значение второго элемента пишется в первый элемент, 3) значение промежуточной переменной пишется во второй элемент. Любое нарушение данной последовательности действий приведет логической ошибке, которая выражается в неправильной работе программы, что в конечном итоге отразится на результатах (они не

52

совпадут с результатом решения контрольного примера). Такая ошибка называется логической. Приводится результаты выполнения программы.

Описание ошибки и способ ее устранения производится в произвольной форме. Объем раздела 2– 4 стр.

В разделе 5 приводятся процесс и результаты оценивания сложности линейного алгоритма по критерию сложности. Приводится листинг модифицированного кода, полученного в результате проведения рефакторинга. Выполняется описание структурных операторов цикла и особенностей циклической обработки массива. Приводится оценка сложности полученного кода. Также выполняется описание синтаксических и логических ошибок модифицированного кода по аналогии с разделом 4. Приводится результаты выполнения программы. Объем раздела 1– 2 стр.

Контрольные вопросы и упражнения

1.Какие языки программирования поддерживает Microsoft Visual Studio?

2.Что такое Microsoft .NET?

3.Что такое .NET Framework?

4.Что такое CLR?

5.Как создать проект в MS Visual Studio?

6.Что такое консольное приложение?

7.Что такое пространство имен?

8.Каково назначение метода Main()?

9.Перечислить стандартные классы, задействованные в программе, а также их методы.

10.Пояснить смысл предложения C#: System.Console.WriteLine(…)

11.Как при помощи среды откомпилировать и выполнить проект?

12.Что такое рефакторинг программного кода?

13.Для чего и как проводится рефакторинг программного кода?

14.Какие факторы влияют на производительность программного обеспечения?

15.Что такое синтаксическая ошибка в коде?

16.Что такое логическая ошибка в коде?

17.Что понимается под сложностью программного кода?

18.Перечислите способы обнаружения логических ошибок в коде.

19.Составьте программу без использования циклов для сортировки одномерного массива произвольных строковых данных. Оцените сложность полученного кода.

20.Выполните процедуру рефакторинга полученного кода посредством введения в алгоритм операторов цикла. Оцените сложность полученного модифицированного кода.

53

Лабораторная работа №6

Тема: Сборка и анализ программного продукта.

Цель: Изучение на практике стадии кодирования ПО, освоение методики разработки и описания программного кода с применением заданных фрагментов кода, а также методов анализа сложности и эффективности кода.

Задание.

1.С использованием материала, изложенного в приложении В, рекомендуемой литературы и материалов сети Интернет изучить принципы и технологию программирования односвязного списка заданного вида (см. приложение А, табл. А.1).

2.Создать консольное приложение в MS Visual Studio C# и выполнить сборку программы решения типовой задачи обработки данных о сотрудниках предприятия с использованием односвязных списков. Откомпилировать и построить приложение. При обнаружении компилятором синтаксических ошибок идентифицировать их и устранить.

3.На базе созданного приложения реализовать заданную функциональность, сформулированную в техническом задании при выполнении лабораторной работы №3. Добавить в класс List методы SortData1(), SortData2(), SortData3(), который реализует задачу сортировки записей тремя заданными методами (см. приложение А, табл. А.2). Перестроить приложение. При обнаружении компилятором синтаксических ошибок идентифицировать их и устранить.

4.Произвести оценку сложности разработанных методов сортировки. В качестве критерия сложности использовать суммарное количество операторов метода.

Теоретические положения Связанные списки — это коллекции элементов данных, выровненные ряд

и способные разжиматься и сжиматься во время исполнения программы. В любом месте связанного списка пользователи могут делать вставки и удалять данные.

При программировании связанных списков широко применяется аппарат ссылок и соотносимые классы.

6.1. Самоотносимые классы

Самоотносимый класс (self-referential class) содержит справочный элемент, относящийся к объекту того же класса. Например, определение класса в листинге 3 задает тип Node. Данный тип имеет две переменные экземпляра private: целочисленную data и ссылку next класса Node. Элемент next ссылается на объект типа Node — объект описываемого типа; отсюда термин "самоотносимый класс". На элемент new ссылка делается как на связующее

54

звено (т. е. next можно использовать для "привязывания" объекта типа Node к другому объекту такого же типа). Класс Node имеет два свойства: Data для переменной datа и Next для переменной next.

Листинг 3. Самоотносимый класс Node class Node

{

private int data; private Node next;

public Node(int d)

{

// тело конструктора

}

//свойство Next public Node Next

{

get // селектор

{

return next;

}

set // модификатор

{

next = value;

}

}

//свойство Data public int Data

{

get // селектор

{

return data;

}

set // модификатор

{

data = value;

}

}

7 11

Рис. 14. Два связанных объекта самоотносимого класса.

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

На рис. 14 представлены два самоотносимых объекта, связанные между собой для формирования списка. Символ обратной косой черты (обозначающий ссылку null) помещен в элемент ссылки второго самоотносимого объекта для указания того, что ссылка не относится к другому объекту. Косая черта используется для наглядности; она не соответствует символу обратной косой черты в С#.

Ссылка null, как правило, указывает конец структуры данных.

}

Создание и сопровождение динамических структур данных требует динамического распределения памяти: способности программы получения большего объема памяти во время исполнения для, сохранения новых узлов и освобождения неиспользуемого пространства памяти. Как уже отмечалось, программы С# не освобождают динамически распределяемую память явно, а осуществляют автоматическую "сборку мусора".

55