Рішення проблеми пробільних символів додатки перекладу в Visual C # (Sharp)

Проблему пробільних символів можна вирішити кількома способами Який з них вибрати, залежить від ваших вимог Розглянемо кілька рішень, щоб зясувати, яке з них підходить найкраще для нашої програми перекладу

Видалення пробільних символів

Першим способом для видалення пробільних символів, який ми розглянемо, буде метод, спеціально призначений для цієї мети Проблема пробільних символів не є чимось незвичайним, вона добре відома Строковий тип має метод для видалення пробільних символів з буфера З його допомогою можна видаляти пробільні символи на початку, кінці або з обох сторін буфера

Незважаючи на те, як заманливо може виглядати зміна первісної реалаціі методу TranslateHellof), робити це не слід, т к наші виправлення мут внести інші проблеми Проблеми, що виникають в процесі розробки коду, зазвичай можна вирішити кількома способами Але якщо ви станете по черзі випробовувати ці способи на первісному вихідному коді, до того часу, коли ви дійдете до третього або четвертого способу, первісний вихідний код може опинитися в цілковитому безладді Ваші спроби виправити першоосновою помилку можуть внести в код інші помилки, і повернення вихідного коду

в його початковий стан може виявитися досить проблематичним, а то й зовсім не можливим

ПРИМІТКА

Для управління вихідним кодом слід використовувати керування версіями Але де застосовуючи управління версіями, при видаленні старого коду губляться ідеї, реалованние в ньому Тому ваш вихідний код може бути впорядкованим і аккураим, але ви не повинні нічого забувати з того, що робили лише кілька годин тому Повірте мені, таке трапляється, т к розробка вихідного коду яяется інтенсивним процесом мислення

Тому переважним підходом до виправлення помилки буде створення вставки, яка викликає метод TranslateHello (), і виправлення помилки в цій вставці Код вставки, яка є тимчасовим рішенням проблеми прогалин символів, виглядає таким чином:

public static string TrimmingWhitespace(string buffer) { string trimmed = bufferTrim()

return  LanguageTranslatorTranslatorTranslateHello(trimmed)

}

Тимчасовий метод TrimmingWhitespace () видаляє пробільні символи з рядка, яку потрібно перекласти У ньому застосовується метод buffer Trim (), який проставляє нову функціональність попередньої обробки буфера Після цього методу викликається первісний метод TranslateHello О, щоб випоїти переклад

Звичайно ж, новий метод необхідно протестувати, щоб переконатися в тому, що він належним чином видаляє пробільні символи з рядків, які потрібно Переста Відповідний код буде таким: •

verifyValue = TrimmingWhitespace(&quotalio&quot) if (verifyValueCompareTo(&quothallo&quot) = 0) {

ConsoleWriteLineCTest failed of extra white spaces alio to hallo&quot)

}

Код тестування викликає робочий метод TrimmingWhitespace (), щоб Прово, що все працює належним чином Код власне верифікації не змінюється

Щоб отримати передбачувані результати, не забудьте викликати вставку, а не пеоначальний метод Виконавши тестовий код, ви побачите, що вставка працює, тім чином, будучи вирішенням проблеми пробільних символів

Виявлення підрядка

Іншим способом вирішення проблеми пробільних символів є пошук опреленного підрядка в буфері Цей підхід можна розглядати як пошукове рішення, де метод в циклі послідовно порівнює елементи буфера з Звертаючись тексту Робочий код для цього способу показаний на рис 38

Рис 38 Рішення проблеми пробільних символів способом нахохеденія підрядка

Код тестування для цього методу не наводиться, т к він схожий на код тестіровія для попереднього рішення, з однією тільки різницею, що тестується інший метод

Яке рішення найкраще

Подумайте хвилинку, яке з представлених рішень найкраще: видалення пробілів символів або знаходження підрядка Прямої відповіді на це питання немає, т к кожне рішення має свої проблеми При розробці програмного забезпечення така ситуація є досить звичайною Ви думаєте, що прорахували всі воожние варіанти, коли несподівано виявляється ще один, який опрокивает всі ваші розрахунки

Що я хочу цим сказати Необхідно створити додаткові тести, щоб Вісла, які сценарії можуть викликати проблеми у вашій програмі Рішення, що складається у видаленні пробільних символів, не є ідеальним і в опреденних ситуаціях не працює, як доводиться наступним тестовим кодом Скільки б ви не намагалися виправити рішення, щоб воно успішно пройшло цей тест, зробити це вам не вдасться

verifyValue = TrimmingWhitespace (&quota alio&quot) if (verifyValueCompareTo(&quothallo&quot) = 0) {

ConsoleWriteLine(&quotTest failed: cannot parse multiple words&quot)

}

У даному тесті початкова буква а вважається законним символом і не видаляється, а що йдуть за нею прогалини вже не стоять на початку рядка Верифікація буде неус-

пешню, т к метод CompareTo () збиває з пантелику зміщення буфера, викликане нальної буквою а.

Але друге рішення, знаходження підрядка, успішно проходить випробування новим тестом, який знаходить слово alio. Оскільки перше рішення не витримує ний тест, то можна сказати, що дане рішення є неприйнятним У той же самий час успішне проходження другим рішенням другого тесту на додачу до першого пишащей нашу довіру цьому рішенню Але не варто поспішати робити висновок щодо його надійності, тому що воно не витримує випробування наступних тестів кодом:

verifyValue = FindSubstring(&quotallodium&quot) if (verifyValueCompareTo(&quothallo&quot) = 0) {

ConsoleWriteLineCTest failed: cannot parse multiple words&quot)

}

Проверяемое слово, allodium, містить символи alio. Верифікація буде уешной, коли вона не повинна бути такою, що є прикладом ложноположельного результату

ПРИМІТКА

Важливо мати велику кількість тестів, щоб можна було перевірити якомога більше можливих сценаріїв Ці тести повинні містити такі, які повинні викликати успішне виконання, і такі, які повинні викликати невдале хвилювання

Кінцевий висновок такий, що жодне з рішень не працює належним чином Піддавши обидва рішення розширеного тестування, ми виявили сценарії, що викликають неуспішне виконання кожного з них Таким чином, нам необхімо знайти нове вирішення проблеми пробільних символів

Самокатування ПРИ РОЗРОБЦІ

З першого погляду може здатися, що створення рішень, следуемое створенням тестів, які зводять нанівець ці рішення, є вправою в самокатуванні Ще б пак – ви навмисно намагаєтеся завалити код, в створення якого вклали стільки зусиль Але ви повинні усвідомлювати, що цей процес є частиною загального процесу розробки програмного забезпечення, і зобовязані ставитися до нього з усією серйозністю Деякі програмісти не піклуються про створення тестів для свого коду, але це ті програмісти, які створюють професії розробника прраммного забезпечення погану славу

Ви повинні прагнути бути розробником, якому можна довіряти, а для цього необхідно тестувати свій код Я працював, а моя дружина і зараз працює, рукодітелем проектів з розробки прогрвммного забезпечення У її словах: Я можу терпіти повільних розробників, але я не виношу розробників, яким я не можу довіряти в написанні стабільного і надійного коду Проблема з ненадійністю розробниками полягає в тому, що я не можу дозволити їм відправити код в промисловий випуск, і мені завжди потрібно мати кого-небудь, щоб прісматрать за їх роботою .

Пишемо тест, перш ніж писати код

Попередні рішення були невдалими, тому що кожне з них було свого роду колінним рефлексом У програмуванні колінний рефлекс – це створю рішення, спрямованого на виправлення виявленої помилки, і не більше того Замість цього підходу слід обчислити, про що говорить нам дана помилка Первісна проблема з провідними пробільними символом не полягала лише в наявності пробільних символів, а була свого роду питанням: А що, якщо текст не вирівняний або є частиною пропозиції і т п?”

Щоб виправити помилку, ми не пишемо код, але продумуємо всі тести, які наш код повинен витримати Необхідно розподілити відповідальність і визна контексти успішного і невдалого виконання коду У прикладі з перекладом, правильним підходом до реалізації цього додатка було б створення тестів до створення коду Контексти успішного і невдалого виконання для цього докладемо представлені в табл 31

Таблиця 31Ситуації для тестування програми перекладу

Ситуація

Результати перевірки та

ali o

Успіх

&quot   ali o   &quot

Успіх

wor d    ali o

Невдача: не можна переводити одне слово без перекладу всіх інших слів

wor d   ali o   wor d

Невдача: за тією ж саме причини, що і у випадку з текстом wor d ali o

prefixall o

Невдача: не те слово

alloappen d

Невдача: не те слово

prefixalloappen d

Невдача: не те слово

Як можна бачити, виконання більшості тестів закінчується невдачею, т к компонент перекладу здатний перекладати тільки окремі слова Тести в табл 31 начебто охоплюють всі можливі ситуації, але насправді це не так Є ще дві можливі ситуації, які показані в табл 32

Таблиця 32Додаткові ситуації для тестування

Ситуація

Результати перевірки та

Alio

Успіх

&quot alio &quot

Успіх

Текст може бути в змішаному регістрі, і з точки зору людей таке слово раозначно слову в одному регістрі Але компютери розглядають текст в іншому

регістрі як зовсім інший текст, тому ми повинні бути в змозі обрабатать таку ситуацію

На рис 39 показано робоче рішення проблеми

Рис 39 Кінцеве додаток перекладу

Розглядаючи рішення, можна бачити, що воно містить елементи з першого ренію, яке було відкинуто, бо воно не працювало належним чином Це хороший приклад того, як можна помилитися, виправивши по-швидкому помилку і побачивши, що це рішення не працює, відкинути це рішення Тому необхідний спочатку грунтовно подумати, чому код не працює належним чином, а не просто виправляти на швидку руку помилку, аби тільки позбутися від неї

ПРИМІТКА

У всіх розглянутих рішеннях застосовувалися методи типу string Це дуже складний тип, який підтримує багато операцій, часто застосовуються на Тетово даних

На цьому ми закінчимо розгляд прикладу перекладу вітання Далі ми обговоримо пару інших аспектів, які вам потрібно знати при роботі зі строковими даними

Ви, напевно, звернули увагу на використання подвійних і одинарних лапок у виклику методу CompareTo () Ці два типи лапок істотно відрізняються один від одного Подвійні лапки визначають строковий тип, як показано в наступному прикладі:

&quotusin g   doubl e   quotes &quot

Одинарні ж лапки застосовуються для визначення символу, наприклад а.

Відповідно, одинарні лапки можна використовувати тільки з одиночним символом Одиночний символ можна розглядати як букву, але це не завжди так, оскільки не у всіх мовах є літери При спробі визначити рядок за допомогою одинарних лапок компілятор С # згенерує помилку, яка в NET зазвичай називається винятком (exception)

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*