C#

Рекламный модуль
Самые прочные всесезонные канадские Гусеницы для квадроциклов в Вашем городе по самым дешевым ценам

Решение проблемы отступа

Можно решать проблему отступа разными способами. Используемый подход будет зависеть от ваших потребностей. Давайте рассмотрим несколько решений и выясним, какой из них лучше подходит для нашей программы перевода. Обрезка отступа Первое решение заключается в удалении отступа с помощью метода, специально предназначенного для этой цели. Другими словами, проблема отступа не уникальна и фактически хорошо известна. Тип string имеет метод, применяемый для обрезки, или удаления, отступа из буфера. Вы можете удалять отступ в начале, в конце или с обеих сторон буфера. Как ни соблазнительно изменить исходную реализацию метода TranslateHello () , не торопитесь делать это, поскольку вы можете что-нибудь нарушить. Разрабатывая код, вы имеете несколько возможных способов решения проблемы. Если вы не будете серьезно относиться к первоначальному исходному коду, то ко времени третьего или четвертого решения код может оказаться в полном беспорядке. Ваши исправления мо¬гут все испортить, а вернуться к первоначальному коду будет уже затруднительно. На заметку. Для обслуживания своего исходного кода вы должны использовать контроль версий (version control). Но даже при контроле версий, когда вы удаляете прошлые попытки, идеи мож¬но потерять. Таким образом, несмотря на чистоту исходного кода, вы можете забыть то, что де¬лали три или четыре часа назад. Поверьте мне, это случается, поскольку разработка исходного кода — процесс, требующий больших умственных усилий. Решение заключается в создании прокладки (shim), которая вызывает метод TranslateHello О . В механике прокладку помещают между двумя другими деталями, чтобы улучшить соединение. В программировании прокладка — это код, помещаемый между двумя другими слоями кода, чтобы устранить ошибку и повысить эффективность кода! В данном случае наша прокладка будет использоваться для устранения ошибки. Следующий код прокладки — это временное решение. public static string TrimmingWhitespace (string buffer) { string trimmed = buffer.Trim () ; return LanguageTranslator.Translator.TranslateHello(trimmed); } TrimmingWhitespace () — это временный метод, который вырезает отступ из стро-ки, передаваемой на перевод; buf fer . Trim () — это новая функция, предваритель¬но обрабатывающая буфер. И наконец, происходит вызов первоначального метода, TranslateHello (), осуществляющего перевод. Конечно, необходимо проверить новый метод, чтобы убедиться, обрезает ли он пере¬даваемую строку. Соответствующий проверочный код приведен ниже. verifyValue = TrimmingWhitespace (" alio") ; if (verifyValue.CompareTo("hallo") != 0) { Console.WriteLine("Test failed of extra white spaces alio to hallo"); } Проверка вызывает метод TrimmingWhiteSpace (), чтобы убедиться, все ли сработа¬ло. Код верификации не изменился. Итак, вы получили ожидаемый результат, но не забывайте, что вызов прокладки — это не первоначальный метод. Если вы запустите проверочный код, то убедитесь, что прокладка работает и, таким образом, решение есть. Поиск подстроки Другое решение проблемы отступа — поиск в буфере определенной подстроки. Решение подразумевает перебор строки в поисках соответствия элемента буфера неко¬торому тексту, который ищут. Временный рабочий код приведен на рис. 3.8. Проверочный код здесь не приведен, поскольку он такой же, как в предыдущем решении; различие лишь в проверяемом методе. Какое решение лучше? Уделите момент размышлениям о том, какое решение лучше — обрезка отступа или поиск подстроки? Ни одно из них не совершенно; каждое имеет свои недостатки. Как нь: уже, возможно, знаете, это обычное дело при разработке программного обеспечения. Вы думаете, что заткнули все дыры, но при новых обстоятельствах ваше программное : "еспечение снова не работает. Случалось ли с вами такое? Подозреваю, что да. Снова хочу подчеркнуть, что вам понадобится написать больше проверок, чтобы вы-.-:нить, какие случаи могли бы нарушить работу программного обеспечения. Для реше¬ния обрезки отступа приведенная ниже проверка приведет к отказу. verifyValue = TrimmingWhitespace ( "a alio"); if (verifyValue.CompareTo("hallo") != 0) Tonsole.WriteLine("Test failed: cannot parse multiple words"); В этой проверке первая буква "а" окажется первым символом и не будет удалена. Верификация потерпит неудачу, поскольку метод CompareTo () не сможет сравнить сме¬шенный буфер из-за начального символа "а". ////////////////////////////////////////////////////////////////////// Добавить страницу ////////////////////////////////////////////////////////////////////// Сложности разработки <азалось бы, что выработка решений и последующее создание аннулирующих их проверок — это упражнение по самобичеванию. Вы многократно создаете код, который не решает проблемы. Если вы последовательны в своих проверках, считайте это частью разработки программного обе¬спечения. Некоторые разработчики пишут код и не волнуются о проверках, такие разработчики создают разработке программного обеспечения плохую репутацию. Если вы хотите быть разра¬ботчиком, заслуживающим доверия, кто-то должен проверять ваш код. Создание проверок до разработки кода Небольшой Дзен о проверке: причина, по которой последующее решение терпит не¬удачу, в том, что каждое последующее решение было сродни безусловному рефлексу. Безусловный рефлекс — когда программист, столкнувшись с ошибкой, устраняет только re — не больше и не меньше. Вместо этого программист должен выяснить, в чем при¬чина ошибки, и попытаться устранить ее. Первоначальная ошибка с отступом не была :шибкой отступа, а ошибкой, говорящей: "Эй, а если начало текста или предложения не совпадают?" Поэтому для исправления ошибки вы должны не только написать код; вы должны продумать все проверки, которые ваш код должен пройти. Нужно назначить ответ-:твенного и определить критерии успеха и провала. В примере перевода подходящий подход реализации Должен был бы подразумевать написание проверок перед написа¬нием кода. В табл. 3.1 приведены критерии успеха и неудачи. Таблица 3.1. Подходящие проверки для программы перевода Проверка Результат верификации alio Успех "alio" Успех word alio Неудача. Вы не можете перевести одно слово без перевода других word alio word Неудача. Та же причина, что и у слова alio с ref ixallo Неудача. Другое слово ъ.1 loappend Неудача. Другое слово с ref ixalloappend Неудача. Другое слово Как можно заметить, большинство случаев проверки — отказы, поскольку компо¬нент перевода, как предполагается, переводит только отдельные слова. Набор проверок кажется законченным, но фактически мы пропустили еще один набор случаев, который приведен в табл. 3.2. Таблица 3.2. Пропущенный набор проверок для программы перевода Проверка Результат верификации ?--1о Успех 'alio" Успех Текст может содержать символы в разном регистре, с точки зрения человека, это то же самое слово (даже при том, что его можно посчитать опечаткой). Но компьютер рас¬сматривает такой случай как совершенно иной буфер, и нам следует справиться с этой ситуацией. Рассмотрев это решение, вы обратите внимание на элементы, которые уже были в первом решении. Но это решение было не особенно ценно, поскольку оно не работало правильно. Это пример того, как поиск быстрого решения только для ошибки, сбойно¬го кода, в отрыве от решения проблемы, может завести в тупик. Я знаю, что слишком далеко отклоняюсь от темы, но полагаю, что это важно. Чтобы стать настоящим разра¬ботчиком программного обеспечения, вы должны думать не только о том, почему нечто не работает, и не только устранять ошибки, чтобы избавиться от них. На заметку. Все решения используют методы типа string. Тип string очень сложен и поддер-живает множество действий, обычно выполняемых с текстом. В настоящий момент мы закончим с переводом приветствия. Впоследствии я ука¬жу пару дополнительных элементов, которые необходимо иметь в виду, работая со строками.