Главная » C# » Создание приложения перевода в Visual C# (Sharp)

0

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

ПРИМЕЧАНИЕ

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

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

Создание класса Translator

При  работе  с  Visual  С#  Express или  каким-либо другим  продуктом  Visual  Studio в результате применение стандартных шаблонов для  создания библиотеки класса создается файл Classl.cs. Хорошо, что для библиотеки класса создается файл по умолчанию, но идентификатор Classl .cs не говорит нам о многом. Поэтому удалите этот файл из проекта, а вместо него создайте класс Translator следующим образом:

1. Щелкните  правой   кнопкой  мыши  по  названию  проекта  LanguageTranslator

в Solution Explorer.

2. Выберите команды Add | New Item.

3. Выберите опцию Class.

4. Переименуйте файл на Translator.cs.

5.  Щелкните кнопку Add, чтобы создать файл и добавить его в проект.

Заметьте, как с помощью среды разработки Visual Studio мы быстро создали класс в С#. Легкость, с которой мы можем создавать файлы классов, позволяет нам коентрироваться на написании кода этого класса. Но не заблуждайтесь, что, создав некое количество файлов класса, вы автоматически получите работающее приление.  Для  этого  вам  еще  нужно  поразмыслить,  какие  файлы,  проекты,  классы и тесты нужно создать.

Перевод слова "hello"

Первым делом в нашем приложении перевода мы реализуем возможность перевода слова "hello". Так как это английское слово, то сначала мы переведем его с англикого на немецкий. Скопируйте следующий код и вставьте в файл Translator.cs проекта LanguageTranslator.

public class Translator {

public static string TranslateHello(string input) { if (input.CompareTo("hello") ==0 ) {

return "hallo";

}

else if (input.CompareTo("alio") == 0) { return "hallo";

}

return "";

}

}

Класс Translator является основным классом, который предоставляется другим компонентам или фрагментам исходного кода приложения. Его можно рассматрать как идентификатор "черного ящика". Этот черный ящик  имеет  всего  лишь один метод: TranslateHello (), который переводит французское "alio"  и  англикое "hello" в немецкое "hallo". В качестве входного параметра метод принимает строковую переменную ссылочного объектного типа.

В реализации метода TranslateHello () мы используем метод CompareTo (), чтобы сравнить содержимое буфера ввода с параметром "hello". Если строки одинакые,  то  метод  возвращает  значение  0.  Как  будет  рассмотрено  более  подробно в разд. "Исследование строкового типа" далее в этой главе, строка является обктом, а объекты имеют методы. Одним из методов строкового типа является мод CompareTo (). Компонент, вызывающий наш метод TranslateHello (), не знает, каким образом мы переводим слово с одного языка на другой. Более того, этот аект ему абсолютно безразличен; единственное, что его волнует, — чтобы этот мод работал, как от него ожидается.

С абстрактной точки зрения, целью метода TranslateHello() является принятие определенного текста, и, если этот текст совпадает с заданным образцом, возврение немецкого слова "hallo".

Создание тестового приложения

Не задаваясь вопросами об абстрактном замысле, нам необходимо протестировать его  реализацию  в  исходном  коде.  Для  этого  вставьте  следующий  тестовый  код В тестовое   Приложение,   которое   ЯВЛЯеТСЯ Проектом   TestLanguageTranslator, а именно в файл Program.cs.

static void TestTranslateHello() { string verifyValue;

verifyValue = LanguageTranslator.Translator.TranslateHello("hello"); if (verifyValue.CompareTo("hallo") != 0) {

Console.WriteLine("Test failed of hello to hallo");

}

verifyValue  =  LanguageTranslator.Translator.TranslateHello("alio"); if (verifyValue.CompareTo("hallo") != 0) {

Console.WriteLine("Test failed of alio to hallo");

}

verifyValue = LanguageTranslator.Translator.TranslateHello("allosss"); if (verifyValue.CompareTo("") != 0) {

Console.WriteLine("Test to verify nontranslated word failed");

}

verifyValue = LanguageTranslator.Translator.TranslateHello(" alio"); if (verifyValue.CompareTo("hallo") != 0) {

Console.WriteLineC’Test failed of extra whitespaces alio to hallo");

}

}

Данный тест в действительности состоит из четырех  отдельных тестов.  Каждый  из этих   тестов   вызывает   метод   TranslateHello О,   передавая   ему   входные   данные и получая от него результаты. Тестирование происходит, когда возвращаемый модом результат сверяется с  ожидаемым  результатом.  Тестирование  на  правилость  перевода выполняется  с помощью метода CompareTo ().

Обратите  внимание  на третий  тест:

verifyValue = LanguageTranslator.Translator.TranslateHello("allosss"); if (verifyValue.CompareTo("") != 0) {

Console.WriteLineC’Test to verify nontranslated word failed");

}

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

Все эти тесты находятся в методе, который нужно вызывать из метода Main(), как показано  в  следующем  примере:

static void Main(string!] args)

{

TestTranslateHello();

}

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

Вопрос разумного использования приложения перевода

Проблема  с  пробельными  символами  является  интересной.  Вызывающий  компент явно вставил в  переданные данные  дополнительные  пробелы,  но  как должны эти пробелы рассматриваться?  Как  ошибка  или  как  неправильно  переданные  мету  данные?

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

когда вы ехали на нем самым нормальным образом в самых нормальных условиях. Срок гарантии  еще  не  истек,  и  ремонт автомобиля  будет  выполнен  по  гарантии, т. е. без расходов с вашей стороны. А теперь представьте себе, что, заполучив свой давно желаемый автомобиль, вы решили попробовать некоторые из тех каскадеких трюков, которые вы видели в кино. Например, попробовать выполнить на нем прыжок с разгона. Возможно, вам и удастся поднять машину в воздух, и те  нколько мгновений полета вызовут у вас непередаваемые ощущения, но каждый полет заканчивается приземлением. Так что машина приземлятся, подвеска вся иорежена,  двигатель  сорван  с  креплений  и  т.д .  Но  вы  не  очень  переживаете — у вас гарантия. Но когда вы пытаетесь воспользоваться этой гарантией, то слышите в ответ смешок механика станции техобслуживания. Иными словами— ваша гантия распространяется только на поломки, случившиеся при нормальной эклуатации в нормальных условиях. Каскадерство сюда не входит.

Возвращаясь к нашему компоненту для перевода, можно сказать, что он предостаяет метод TranslateHello () и имеет определенные ответственности. А от компента, вызывающего метод TransiateHeiio (), ожидаются разумные тесты с данни для перевода. Таким образом, является ли разумным со стороны вызывающего компонента посылать компоненту перевода пробельные символы?

Если наличие пробельных символов во входных данных является нормальным отоятельством, то тогда неуспешное тестирование является ошибкой в компоненте перевода. В противном же случае, т. е. когда наличие пробельных символов во входных данных не является нормальным, поведение вызывающего компонента не является разумным, и его необходимо исправить. Ответ на ранее поставленный врос состоит в том, что вызывающий компонент ведет себя разумным образом, а проблема связана с вызываемым компонентом, который не обрабатывает передаые ему данные должным образом. Это ошибка в компоненте перевода, которую необходимо исправить. Откуда я знаю, что вызывающий компонент ведет себя румным образом? Я так решил, потому что я хочу, чтобы контракт между вызающим и вызываемым компонентами был реализован именно таким образом. Хошее определение контракта является ключевым аспектом.

Ошибка в компоненте перевода связана со способом перевода слова. Для перевода применяется метод compareToO, который сравнивает по одному символу во ввенном слове и шаблоне. Тест завершился неудачей потому, что вызывающий коонент передал компоненту перевода строку, содержащую пробельные символы, которых последний не ожидал. Эта ошибка не является чем-то необычным,  т. к. люди игнорируют пробельные символы, но компьютеры не могут этого делать.

Но прежде чем объяснять, каким образом исправить эту ошибку, нам необходимо получить дополнительную информацию о строках и о том, что они могут делать.

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии