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

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

Жанры

Программирование мобильных устройств на платформе .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 {

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

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

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки

Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Корнев Павел Николаевич
Фантастика:
фэнтези
героическая фантастика
5.50
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Сумеречный стрелок 7

Карелин Сергей Витальевич
7. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок 7

Жизнь под чужим солнцем

Михалкова Елена Ивановна
Детективы:
прочие детективы
9.10
рейтинг книги
Жизнь под чужим солнцем

Красноармеец

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