Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Технологии программирования. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
15.08.2026
Размер:
1 Мб
Скачать

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

Рисунок 2.3. Окно «Инкапсулировать поле»

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

21

Для выделения основных методов в интерфейс используется операция рефакторинга «Извлечь интерфейс». Данная операция позволяет извлечь интерфейс, используя любое количество методов в классе. Прежде для этого приходилось копировать весь метод в новый файл и удалять его содержимое, оставляя лишь заглушку интерфейса. При выполнении этой операции открывается диалоговое окно, показанное на рисунке 2.4, в котором предлагается выбрать метод, который необходимо включить в интерфейс. Выбранные методы добавляются в новый интерфейс, который создается в новом файле. Класс, из которого был извлечен интерфейс, наследуется от этого интерфейса.

Рисунок 2.4. Окно «Извлечь интерфейс»

В следующем примере продемонстрировано извлечение в отдельный интерфейс первого метода:

class Class1

{

22

public void ShouldBeInInterface(float d) { /* ... */ }

public void NormalMethod_1(int a, int b) { /* ... */ }

public void NormalMethod_2(int c) { /* ... */ }

}

В новом файле формируется новый интерфейс:

interface IClass1

{

void ShouldBeInInterface(float d);

}

А исходный файл обновляется следующим образом:

class Class1 : IClass1

{

public void ShouldBeInInterface(float d) { /* ... */ }

public void NormalMethod_1(int a, int b) { /* ... */ }

public void NormalMethod_2(int c) { /* ... */ }

}

Для переупорядочивания параметров используется операция «Reorder Parametersdialog», которая позволяет переставлять параметры в списке в соответствии с требуемым порядком. Эта операция может помочь повысить читабельность кода, а иногда является необходимой при реализации интерфейсов.

При выполнении этой операции открывается диалоговое окно, показанное на рисунке. 2.5.

23

Рисунок 2.5. Окно «Reorder Parametersdialog»

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

Удаление параметра из метода с помощью операции «Удалить параметры» значительно сокращает объем поиска ошибок компиляции, которые могут при этом возникнуть. Кроме того, эта операция очень полезна при многочисленных перегрузках метода, при которых удаление параметра не может порождать ошибки компиляции. В этом случае ошибка во время выполнения программы может возникнуть только по семантической, а не по синтаксической причине.

На рисунке 2.6 показано диалоговое окно «Удалить параметры», которое используется для удаления параметров из списка параметров. Если параметр был удален случайно, его легко восстановить. Как указывает предупреждение, размещенное в этом диалоговом окне, удаление параметров часто приводит к неожиданным функциональным ошибкам, поэтому важно контролировать внесенные изменения. Для того чтобы оценить

24

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

Рисунок 2.6. Окно «Удалить параметры»

Операция Rename обеспечивает переименование переменных, методов и классов. Диалоговое окно «Rename» для языка C# приведено на рисунке 2.7.

Рисунок 2.7. Окно «Rename»

Операция «GenerateMethodStub» используется, когда нужен вызов метода, который еще не написан. Следующий пример

25

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

public void MethodA()

{

string InputA; double InputB;

int OutputC = New MethodIJustThoughtOf(InputA, InputB);

}

Рисунок 2.8. Генерация заглушки метода

Этот код порождает ошибку при сборке, поскольку вызываемый метод еще не определен. Используя операцию рефакторинга «GenerateMethodStub» (доступную с помощью интеллектуального указателя в самом коде), можно сгенерировать заглушку метода рисунок 2.8. Как видно из следующего примера, заглушка метода содержит входные параметры и тип возвращаемого значения.

public void MethodA()

{

26

string InputA; double InputB;

int OutputC = NewMethodIJustThoughtOf(InputA, InputB);

}

private int NewMethodIJustThoughtOf(string InputA, double InputB)

{

throw new NotImplementedException();

}

Очень полезно поддерживать упорядоченный список директив using в каждом файле (на языке C#) и ссылаться только на те пространства имен, которые действительно необходимы в данном файле. Операция «Organize Usings», доступная в контекстном меню рисунок 2.9, которое открывается после щелчка пользователем правой кнопкой мыши в окне редактора кода, поможет в обоих этих случаях.

Рисунок 2.9. Операция «Organize Usings»

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

27

кнопкой мыши в окне редактора кода, выбрать команду «Organize Usings» и далее «Remove Unused Usings». Неиспользуемые директивы using, их альтернативные имена и внешние альтернативные имена сборок из исходного файла будут удалены.

Очень полезно упорядочивать директивы using в алфавитном порядке, чтобы легко управлять пространствами имен, на которые они ссылаются. Для того чтобы не делать это вручную, нужно щелкнуть правой кнопкой мыши в окне редактора кода, выбрать команду «Organize Usings» и далее «Sort Usings».

Если для пространства имен задано альтернативное имя, то оно переносится в конец списка, а если в проекте используются альтернативные имена внешних сборок (с помощью ключевого слова extern в языке C#), то они перемещаются в начало списка.

Для того чтобы одновременно упорядочить директивы using и удалить неиспользуемые, достаточно щелкнуть правой кнопкой мыши в окне редактора кода, выбрать команду «Organize Usings» и

далее «Remove» и «Sort».

Вопросы к главе:

1.Перечислите методы рефакторинга.

2.Зачем нужно проводить рефакторинг?

3.Когда следует проводить рефакторинг?

4.Почему рефакторинг приносит положительные результаты?

5.Как рефакторинг связан с проектированием?

28

ГЛАВА 3. ПАТТЕРНЫ ПРОЕКТИРОВАНИЯ ПРОГРАММНЫХ СИСТЕМ

Шаблон проектирования, или паттерн (англ. design pattern), в разработке программного обеспечения ‒ это повторно использующаяся архитектурная конструкция, представляющая собой решение проблемы проектирования в рамках некоторого часто возникающего контекста.

3.1. Классификация паттернов

Паттерны проектирования программных систем делятся на следующие категории:

-Архитектурные паттерны;

-Паттерны проектирования;

-Идиомы.

Архитектурные паттерны, являются наиболее высокоуровневыми паттернами и описывают структурную схему программной системы в целом. В данной схеме указываются отдельные функциональные составляющие системы, называемые подсистемами, а также взаимоотношения между ними. Примером архитектурного паттерна является хорошо известная программная парадигма «модель-представление-контроллер» (model-view- controller - MVC).

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

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

29

идиомы для разных языков программирования выглядят по-разному или не имеют смысла вовсе.

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

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

3.2. Каталог паттернов проектирования

Внастоящее время наиболее популярными паттернами являются паттерны проектирования. Одной из распространенных классификаций таких паттернов является классификация по степени детализации и уровню абстракции рассматриваемых систем.

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

Применение паттернов стало считаться хорошей практикой программирования. При написании программ мы можем формализовать проблему в виде классов, объектов и связей между ними. И применить один из существующих паттернов для ее решения. В итоге нам не надо ничего придумывать. У нас уже есть готовый шаблон, и нам только надо его применить в конкретной программе.

По своему действию паттерны можно объединить в ряд групп.

Воснове классификации основных паттернов положена цель или задачи, которые определенный паттерн выполняет.

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]