Чтение онлайн

на главную - закладки

Жанры

Программирование мобильных устройств на платформе .NET Compact Framework

Салмре Иво

Шрифт:

Рис. 5.3. Конечный автомат, предназначенный для управления выполнением фонового алгоритма нахождения простых чисел

Стиль программирования: использование операторов goto и полных путей доступа в пространствах имен

Следует дать некоторые пояснения относительно двух аспектов стиля программирования, принятого во всех примерах кодов, приводимых в данной книге. 

Использование операторов goto

Вопрос о том, следует ли считать использование операторов goto в программах допустимым или же его необходимо рассматривать как признак плохого стиля программирования, является в определенной мере дискуссионным. Применимость операторов goto выступает предметом споров постольку, поскольку осуществляемая с их помощью передача управления противоречит принципам, лежащим в основе использования операторов условного перехода (if/then) и операторов циклов.

Лично я принадлежу к лагерю тех, кто считает использование операторов goto в программах вполне допустимым при условии выполнения следующих требований:

1) Им соответствует передача управления только в прямом направлении.

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

Использование полных путей доступа в пространствах имен

Возможны два способа указания типов переменных в программах:

1) В теле программы можно указывать полный путь доступа. Например, оператор System.Threading.Thread newThread; объявляет переменную newThread типа System.Threading.Thread. Достоинством таких подробных объявлений является простота их применения.

2) В начале файла с текстом программы можно задавать использование определенного пространства имен, применяя для этого ключевое слово using языка C# или ключевое слово Imports языка Visual Basic .NET. Например, если в начале файла с программой на языке C# содержится оператор using SystemThreading;, то переменная System.Threading.Thread может быть объявлена просто как Thread newThread; без указания ее полного имени.

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

На заметку! Прежде чем вы сможете использовать те или иные классы и типы в своей программе, вы должны указать, к каким сборкам (assembly), они относятся. Очень важно, чтобы вы понимали, что ключевые слова using и Imports являются всего лишь удобным синтаксическим средством и не отменяют необходимости включения ссылки на сборку. Чтобы компилятору стали известны типы, содержащиеся в сборке, вы должны явно включить соответствующую ссылку в свою программу. В Visual Studio .NET список сборок можно просмотреть с помощью элемента управления TreeView в окне проводника решений Solution Explorer. Как правило, предварительно сконфигурированные часто используемые ссылки автоматически включаются во вновь создаваемые проекты.

Листинг 5.4. Код программы нахождения простых чисел, предназначенный для выполнения фоновым потоком 

using System;

public class FindNextPrimeNumber
{

 //Определить возможные состояния

 public enum ProcessingState {

notYetStarted,

waitingToStartAsync,

lookingForPrime,

foundPrime,

requestAbort,

aborted

 }

 int m_startTickCount;

 int m_endTickCount;

 long m_startPoint;

 long m NextHighestPrime;

 ProcessingState m_processingState;

 //---------------------------

 //Простейший конечный автомат

 //---------------------------

 public void setProcessingState(ProcessingState nextState) {

//-----------------------------------------------------

// Простейший защитный код, гарантирующий невозможность

// перехода в другое состояние в случае успешного

// завершения задачи или успешной отмены ее выполнения

//-----------------------------------------------------

if ((m_processingState == ProcessingState.aborted) || (m_processingState == ProcessingState.foundPrime)) {

return;

}

//Разрешить изменение состояния

lock(this) {

m_processingState = nextState;

}

 }

 public ProcessingState getProcessingState {

ProcessingState currentState; //Безопасное выполнение потока

lock(this) {

currentState = m_processingState;

}

return currentState;

 }

 public int getTickCountDelta {

if (getProcessingState == ProcessingState.lookingForPrime) {

throw new Exception("Продолжается поиск простого числа! Окончательное время еще не вычислено");

}

return m_endTickCount - m_startTickCount;

 }

 //-------------------------

 // Возвращает простое число

 //-------------------------

 public long getPrime {

if (getProcessingState != ProcessingState.foundPrime) {

throw new Exception("простое число еще не найдено!");

}

return m_NextHighestPrime;

 }

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

 public FindNextPrimeNumber(long startPoint) {

setProcessingState(ProcessingState.notYetStarted);

m_startPoint = startPoint;

 }

 //------------------------------------------------------------

 // Создает новый рабочий поток, который будет вызывать функцию

 // "findNextHighestPrime"

 //------------------------------------------------------------

 public void findNextHighestPrime_Async {

System.Threading.ThreadStart threadStart;

threadStart = new System.Threading.ThreadStart(findNextHighestPrime);

System.Threading.Thread newThread;

newThread = new System.Threading.Thread(threadStart);

//Состояние должно отвечать, что поиск продолжается

setProcessingState(ProcessingState.waitingToStartAsync);

newThread.Start;

//-----------------------------------------------------------------

// Основной рабочий поток. Этот поток запускает поиск очередного

// простого числа и выполняется до тех пор, пока не произойдет

// одно из следующих двух событий:

// (а) найдено очередное простое число

// (b) от внешнего (по отношению к данному) потока поступила команда

// прекратить выполнение

//------------------------------------------------------------------

 public void findNextHighestPrime {

//Если поступила команда прекратить выполнение, то поиск

Поделиться:
Популярные книги

Старый, но крепкий 3

Крынов Макс
3. Культивация без насилия
Фантастика:
рпг
уся
фэнтези
5.00
рейтинг книги
Старый, но крепкий 3

Древесный маг Орловского княжества 3

Павлов Игорь Васильевич
3. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Древесный маг Орловского княжества 3

Князь Целитель 5

Ткачев Андрей Юрьевич
5. Князь Целитель
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Князь Целитель 5

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Товарищ "Чума"

lanpirot
1. Товарищ "Чума"
Фантастика:
попаданцы
альтернативная история
4.00
рейтинг книги
Товарищ Чума

Кодекс Охотника. Книга XXXII

Винокуров Юрий
32. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXII

Евреи России. Времена и события. История евреев Российской империи

Кандель Феликс Соломонович
Научно-образовательная:
история
5.00
рейтинг книги
Евреи России. Времена и события. История евреев Российской империи

Герой

Бубела Олег Николаевич
4. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Герой

Инженер Петра Великого

Гросов Виктор
1. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Инженер Петра Великого

Эммануэль

Арсан Эммануэль
1. Эммануэль
Любовные романы:
эро литература
7.38
рейтинг книги
Эммануэль

На границе империй. Том 6

INDIGO
6. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.31
рейтинг книги
На границе империй. Том 6

Последний Паладин. Том 5

Саваровский Роман
5. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 5

Телохранитель Генсека. Том 4

Алмазный Петр
4. Медведев
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Телохранитель Генсека. Том 4

Снайпер

Поселягин Владимир Геннадьевич
3. Жнец
Фантастика:
боевая фантастика
попаданцы
5.60
рейтинг книги
Снайпер