m_vocabularyWords_All = New System.Collections.ArrayList
m_vocabularyWords_Nouns = New System.Collections.ArrayList
m_vocabularyWords_Verbs = New System.Collections.ArrayList
m_vocabularyWords_Adjectives = _
New System.Collections.ArrayList
m_vocabularyWords Adverbs = _
New System.Collections.ArrayList
m_vocabularyWords_Prepositions = _
New System.Collections.ArrayList
Dim dataReader As System.Data.IDataReader
dataReader = DatabaseAccess.GetListOfWords()
Dim newWord As VocabularyWord
'Обойти все записи
While (dataReader.Read())
Dim thisword_gender As VocabularyWord.WordGender
Dim thisword_function As VocabularyWord.WordFunction
thisword_gender = CType(dataReader.GetInt32( _
DatabaseAccess.DS_WORDS_COLUMNINDEX_GERMANGENDER), _
VocabularyWord.WordGender)
thisword_function = CType(dataReader.GetInt32( _
DatabaseAccess.DS_WORDS_COLUMNINDEX_WORDFUNCTION), _
VocabularyWord.WordFunction)
'Поместить данные для только что считанного слова в класс
newWord = New VocabularyWord(dataReader.GetString( _
DatabaseAccess.DS_WORDS_COLUMNINDEX_ENGLISHWORD), dataReader.GetString( _
DatabaseAccess.DS_WORDS_COLUMNINDEX_GERMANWORD), _
thisword_gender, thisword_function)
'Добавить новое слово в массив списков
m_vocabularyWords_All.Add(newWord)
'Слова могут принадлежать нескольким группам, поэтому
'необходимо выполнить проверку с использованием операции логического И
'для проверки того, что слово относится к данной категории
If ((newWord.getWordFunction And _
VocabularyWord.WordFunction.Noun) <> 0) Then
m_vocabularyWords_Nouns.Add(newWord)
End If
If ((newWord.getWordFunction And _
VocabularyWord.WordFunction.Verb) <> 0)
Then m_vocabularyWords_Verbs.Add(newWord)
End If
If ((newWord.getWordFunction And _
VocabularyWord.WordFunction.Adjective) <> 0) Then
m_vocabularyWords_Adjectives.Add(newWord)
End If
If ((newWord.getWordFunction And _
VocabularyWord.WordFunction.Adverb) <> 0) Then
m_vocabularyWords_Adverbs.Add(newWord)
End If
If ((newWord.getWordFunction And _
VocabularyWord.WordFunction.Preposition) <> 0) Then
m_vocabularyWords_Prepositions.Add(newWord)
End If
End While
'Закрыть объект DataReader
dataReader.Close()
End Sub
End Class
Листинг 14.8. Пример кода управления данными для VocabularyWord.cs
Option Strict On
Imports System
'------------------------------
'Хранит данные слова из словаря
'------------------------------
Friend Class VocabularyWord
<System.FlagsAttribute()> _
Public Enum WordFunction
Noun = 1
Verb = 2
Pronoun = 4
Adverb = 8
Adjective = 16
Preposition = 32
Phrase = 64
End Enum
Public Enum WordGender
notApplicable = 0
Masculine = 1
Feminine = 2
Neuter = 3
End Enum
Private m_englishWord As String
Private m_germanWord As String
Private m_germanGender As VocabularyWord.WordGender
Private m_wordFunction As VocabularyWord.WordFunction
Public ReadOnly Property EnglishWord() As String
Get
Return m_englishWord
End Get
End Property
Public ReadOnly Property GermanWord() As String
Get
Return m_germanWord
End Get
End Property
Public ReadOnly Property getWordFunction() As WordFunction
Get
Return m_wordFunction
End Get
End Property
Public ReadOnly Property getWordGender() As WordGender
Get
Return m_germanGender
End Get
End Property
'-----------------------------------------------------------------
'Возвращает слово на немецком языке, которому предшествует артикль
'(например, 'der', 'die', 'das'), если он существует
'-----------------------------------------------------------------
Public ReadOnly Property GermanWordWithArticleIfExists() As String
Get
If (m_germanGender = WordGender.notApplicable) Then
Return Me.GermanWord
End If
Return Me.GenderArticle + " " + Me.GermanWord
End Get
End Property
Public ReadOnly Property GenderArticle() As String
Get
Select Case (m_germanGender)
Case WordGender.Masculine
Return "der"
Case WordGender.Feminine
Return "die"
Case WordGender.Neuter
Return "das"
End Select
Return ""
End Get
End Property
Public Sub New(ByVal enlgishWord As String, ByVal germanWord _
As String, ByVal germanGender As WordGender, _
ByVal wordFunction As WordFunction)
m_englishWord = enlgishWord
m_germanWord = germanWord
m_germanGender = germanGender
m_wordFunction = wordFunction
End Sub
End Class
Примеры к главе 15 (передача данных)
Листинг 15.1. Простой код файлового ввода-вывода, иллюстрирующий различия между локальной и удаленной передачей данных
Этот код представляет собой всего лишь последовательность вызовов функций. Программистам на VB будет несложно написать его, используя в качестве образца код на C#.
Листинг 15.2. Имитация сбоев при передаче данных для тестирования приложения
'Флаги условной компиляции для нашего инструментированного кода
#Const DEBUG_SIMULATE_FAILURES = 1 'Имитировать сбои
'#Const DEBUG_SIMULATE_FAILURES = 0 'Не имитировать сбои
'-----------------------------------------------------------------
'Глобальная переменная, которую мы хотим использовать для указания
'необходимости генерации исключений в процессе передачи данных
'-----------------------------------------------------------------
#If DEBUG_SIMULATE_FAILURES <> 0 Then
'Переменная для хранения информация о следующем сбое
Shared g_failureCode As SimulatedFailures = _
SimulatedFailures.noFailurePending
'Список сбоев, которые мы хотим имитировать
public enum SimulatedFailures
noFailurePending 'No test failures pending
'Имитируемые сбои:
failInNextWriteSocketCode
failInNextWebServiceCall
failInNextFileIODuringFileOpen
failInNextFileIODuringFileRead
'и так далее
End Enum
#End If 'DEBUG_SIMULATE_FAILURES
'---------------------------------------------------
'Функция, которую мы используем для передачи данных.
'---------------------------------------------------
Private Sub writeDataToSocket( _
ByVal mySocket As System.Net.Sockets.Socket, _
ByVal dataToSend() As Byte)
'------------------------------------------------------------------
'Этот код следует компилировать лишь при тестировании сетевых сбоев
'------------------------------------------------------------------
#If DEBUG_SIMULATE_FAILURES <> 0 Then
'Если это сбой, который мы хотим тестировать, генерировать исключение
If (g_failureCode = _
SimulatedFailures.failInNextWriteSocketCode) Then
'Сбросить этот сбой, чтобы он не возник
'при следующем вызове этой функции
g_failureCode = SimulatedFailures.noFailurePending
Throw New Exception("Test communications failure: " + _
g_failureCode.ToString())
End If
#End If
'Передать данные обычным образом.
mySocket.Send(dataToSend)
End Sub
Листинг 15.3. Тестовый код, который необходимо поместить в класс формы для тестирования передачи и приема данных посредством механизма IrDA
'Имя, которое мы хотим присвоить сокету IrDA
Const myIrDASocketName As String = "IrDaTestFileTransmit"
Private Sub buttonTestFileSend_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles buttonTestFileSend.Click
'Создать простой текстовый файл, который мы хотим передать
Const fileName As String = "myTestSendFile.txt"
Dim textFileStream As System.IO.StreamWriter
textFileStream = System.IO.File.CreateText(fileName)
textFileStream.WriteLine("Today...")
textFileStream.WriteLine("is а nice day")
textFileStream.WriteLine("to go swim")
textFileStream.WriteLine("in the lake")
textFileStream.Close()
Dim irdaFileSender As IrDAFileSend
irdaFileSender = New IrDAFileSend(fileName, myIrDASocketName)
'Имеется 2 режима: 1 - Sync (синхронный), 2 — Async (асинхронный)
'1. Вызвать функцию в синхронном режиме
'и блокировать поток выполнения до тех пор,
'пока файл не будет передан
'1a. Информировать пользователя о том, что мы пытаемся передать данные
Me.Text = "Trying to send..."
'Подождать, пока клиент не будет найден, а затем передать файл
irdaFileSender.LoopAndAttemptIRSend()
'1c. Информировать пользователя о том, что файл передан
MsgBox("File sent!")
Me.Text = "IrDA: Sent!"
'2. Вызвать функцию в асинхронном режиме и поручить
'передачу файла фоновому потоку