Эксперт
Сергей
Сергей
Задать вопрос
Мы готовы помочь Вам.

Согласно результатам исследований 90 % рабочего времени программист занимается чтением программного кода и только 10 % уходит на
его написание. Логично сделать вывод, что такое распределение времени
весьма неэффективно с точки зрения разработки программного обеспечения, так как всего лишь десятая доля затрат связана с написанием новой
функциональности. Следовательно, необходимо менять соотношение в
пользу разработки. Одним из таких инструментов является рефакторинг.
Рефакторинг — процесс улучшения программного кода с целью
улучшения его читаемости разработчиками [1]. Именно цель отличает рефакторинг от оптимизации кода, где целью является повышение производительности алгоритмов. Повышение производительности, приводит к использованию нетривиальных численных методов и алгоритмов, что в
большинстве случаев, наоборот, приводит к еще более запутанному коду.
Рефакторинг, в свою очередь, не рассматривает понятия производительности кода, а стремится реорганизовать программный код для упрощения его
понимания.
Единственная оговорка, которую следует помнить, что в результате
выполнения рефакторинга программа может потерять в производительности, но функционально программа не должна изменяться. То есть при заданных исходных данных программа должна выдавать такой же результат,
что и до рефакторинга, если, конечно, в ходе рефакторинга не было обнаружено, что исходный код содержал ошибки.
Для того чтобы убедиться, что в ходе рефакторинга мы не изменили
правильность выполнения программы или её части, можно (и нужно) использовать юнит-тестирование. Фактически рефакторинг состоит из следующих этапов:

1. Покрытие целевого исходного кода юнит-тестами.
2. Проверка правильности выполнения тестов для исходного кода.
3. Изменение исходного кода для повышения его читаемости.
4. Проверка правильности выполнения тестов измененного кода.
5. Если тесты не пройдены, откатить изменения исходного кода или
устранить ошибку.
Где этапы 3—5 могут многократно повторяться до тех пор, пока качество кода не станет удовлетворительным. На практике, большинство
программистов пренебрегают написанием блочных тестов при рефакторинге, что довольно часто приводит к возникновению ошибок.
В результате проведения рефакторинга повышается читаемость кода,
уменьшается его сложность, архитектурно код становится более гибким,
его легче модифицировать под расширение новой функциональности. Таким образом, рефакторинг решает огромное количество проблем при разработке ПО и становится полезной практикой. Подход рефакторинга также
широко применяется программистами при разборе чужого исходного кода,
так как в процессе рефакторинга программист максимально глубоко погружается в принципы работы кода. Более подробно о рефакторинге и качестве программного кода можно почитать в книгах Мартина Фаулера
«Рефакторинг» [2] и Стивена МакКоннелла «Совершенный код» [3].
5.1 Задание на лабораторную работу
Перед проведением рефакторинга в данной лабораторной работе выполним следующее задание.
1. Добавьте на главную форму панель, аналогичную окну AddObject
или ModifyObject, которая показывает поля выбранного в таблице объекта.
В настоящий момент таблица показывает только основные, общие для всех
типов объектов поля, однако для просмотра уникальных полей каждого
объекта приходится заходить в окно ModifyObject. Такой подход может

привести к случайному изменению данных. Отображение же всех возможных полей в таблице приводит к её избыточности, так как большинство
уникальных полей для разных типов дочерних объектов будут всегда пустыми. Для решения данной проблемы добавим на главную форму панель,
которая показывает все возможные поля выбранного объекта. Таким образом, в таблице отображаются лишь общие поля, однако если пользователь
захочет просмотреть более подробную информацию, ему достаточно выбрать нужный объект в таблице, и его данные появятся на панели. При
этом панель не должна предоставлять возможности изменения данных —
для этого есть специальное окно ModifyObject.
2. Избавьтесь от дублирования кода, создав пользовательский элемент управления ObjectControl. Если вы проанализируете свой программный код, то заметите, что в нём присутствует изрядная доля дублирования.
Окна AddObject и ModifyObject, а также ранее добавленная панель имеют
одну и ту же верстку и выполняют одну и ту же функциональность. Разница между ними заключается лишь в том, что AddObject создает новый объект, ModifyObject инициализируется ранее созданным объектом, а панель
инициализируется ранее созданным объектом, но не позволяет его менять.
Такое дублирование избыточно, что в дальнейшем может привести к проблеме поддержки. Поэтому лучше вынести данную функциональность в
отдельный элемент управления, который можно было бы использовать во
всех трёх случаях.
Пользовательские элементы управления создаются аналогично формам. Для этого нажмите правой кнопкой по проекту в Обозревателе решения, выберите «Создать новый элемент», затем в появившемся окне выберите WinForms UserControl (пользовательский элемент управления
WinForms).
Как уже упоминалось, пользовательские элементы управления аналогичны формам, они также разрабатываются из уже готовых элементов

управления, например TextBox, Button, ListBox, или элементов, которые вы
создали ранее. Однако отличие заключается в том, что формы являются
самостоятельными элементами и не могут быть в составе других форм.
Для них мы можем вызвать метод Show, и форма отобразится на экране.
Пользовательский элемент управления не может быть отображен самостоятельно, он обязательно должен располагаться на форме для его отображения.
Разработайте пользовательский элемент управления ObjectControl.
Целью данного элемента является создание и отображение объектов любого дочернего типа. Таким образом, элемент должен инкапсулировать проверки правильности ввода значений соответствующих полей.
3. Добавьте элементу ObjectControl открытое свойство Object. Реализуйте свойство Object типа данных Object (где под Object подразумевается
ваш базовый класс или интерфейс в бизнес-логике). Логика работы данного свойства следующая: если в данное свойство присвоить некоторый объект (аксессор set), то все поля ввода на пользовательском элементе управления должны инициализироваться соответствующими значениями из
присвоенного объекта. Таким образом, если в вашем варианте объектом
является Person, то при присваивании объекта Person данному свойству
все поля ObjectControl должны проинициализироваться данными из присвоенного Person. Если из данного свойства запросить значение (аксессор
get), то элемент должен создать экземпляр Person и проинициализировать
его значениями из полей ввода.
Таким образом, данное свойство значительно упростит работу с данным элементом управления, позволяя либо инициализировать его значениями, либо получать готовый сформированный объект согласно введенным значениям.
4. Добавьте элементу ObjectControl открытое булево свойство
ReadOnly. Свойство должно работать следующим образом: при присвое-
72
нии в свойство значения true (аксессор set) все поля ввода на пользовательском элементе должны стать ReadOnly, т. е. только отображать данные, но
не позволять их ввод. При присвоении значения false пользовательский
элемент вновь позволит редактировать данные полей. При получении значения свойства (аксессор get) свойство просто возвращает текущее состояние ReadOnly. Данное свойство в итоге позволит использовать данный элемент управления для отображения данных, без возможности их изменения.
5. Убедитесь, что у созданного элемента управления кроме двух описанных свойств больше нет открытых членов класса. Два описанных свойства должны быть единственными способами взаимодействия с данным
элементом управления: они позволяют инициализировать поля значениями
объекта, получить созданный объект из элемента, а также управлять возможностью редактирования.
6. Переделайте пользовательский интерфейс программы с использованием созданного элемента ObjectControl. Перепишите главную форму,
формы AddObjectForm и ModifyObjectForm с использованием элемента
управления. Учтите, что формы AddObjectForm и ModifyObjectForm также
можно объединить в одну форму, и тем самым сократив количество кода.
7. Соберите установщик программы с помощью программы
InnoSetup. InnoSetup — программа, позволяющая быстро и удобно собирать установщики приложений с помощью скриптов. Изучение написания
скриптов для InnoSetup остается на самостоятельное изучение. Программа
содержит обширную документацию с реальными примерами скриптов.
ПРИМЕЧАНИЕ: для сборки установщика используйте программу,
скомпилированную под версией Release, а не Debug, так как Debug-версия
содержит лишний промежуточный код, необходимый при отладке. Такая
версия будет менее производительной по сравнению с Release-версией.
После компиляции проекта все необходимые файлы программы можно бу-
73
дет взять в папке bin\release компилирующегося проекта. Не забудьте удалить лишние файлы и оставить только dll и exe.
*8. Реализуйте возможность запуска файлов проекта по двойному
клику в файловой системе. Ваша программа может сохранять базу данных
в отдельный файл. Для пользователя было бы гораздо удобнее, если программу можно было бы запускать по двойному клику файла базы данных
непосредственно из файловой системы.
Чтобы сделать данную функциональность необходимо:
1. Изменить установочный скрипт InnoSetup. При установке установщик должен добавить в реестр Windows записи о вашем собственном
формате файлов и о том, какая программа по умолчанию должна открывать данный тип файлов. В вашем случае, программой по умолчанию является ваша программа. Реализация подобного скрипта представлена в обучающих примерах программы InnoSetup.
2. Изменить конструктор главной формы и метод Main для возможности принятия переменных из командной строки.
5.2 Список использованных источников
1. Калентьев А. А. Новые технологии в программировании : учеб.
пособие / А. А. Калентьев, Д. В. Гарайс, А. Е. Горяинов. — Томск : Эль
Контент, 2014. — 176 с.
2. Фаулер М. Рефакторинг. Улучшение существующего кода [Текст] /
М. Фаулер. — М. : Символ, 2008. — 432 с.
3. Макконнелл С. Совершенный код. Мастер-класс / С. Макконнелл. —
М. : Русская редакция, 2013. — 896 с.

Была ли полезна данная статья?
Да
61.04%
Нет
38.96%
Проголосовало: 1101

или напишите нам прямо сейчас:

⚠️ Пожалуйста, пишите в MAX или заполните форму выше.
В России Telegram и WhatsApp блокируют - сообщения могут не дойти.
Написать в MAXНаписать в TelegramНаписать в WhatsApp