(3 курс ФИИТ) Паттерны проектирования приложений: практика

Большая просьба: когда в текстовом ответе пишете «ссылки», делайте их дейтсивтельно гиперссылками. А то приходится копипастить адрес в адресную строку :cry:

Напоминаю, что на ближайшей лабораторной состоится контрольная работа (на половинку пары).

Основной материал — использование git. Как минимум нужно уметь пользоваться средствами, описанными в программе-минимум документации из этого сообщения. Также необходимо прочитать выдержку из книги МакКоннелла про ​защитное программирование​ (использование утверждений, исключений, etc).

В 3ем проекте не хватает правила

Если F - это формула, то (F) - формула

В примерах скобки есть, но в правилах вывода нет.

Еще про приоритеты ничего не сказано

[1] + [2] # 3

Сначала + или #?

Верные замечания, спасибо.

Приоритет — слева направо. Сначала считается внутренняя формула (она всегда «в скобках»), затем внешняя операция.

Я так понял, приоритета там в принципе быть не может, т.к. везде скобки (которые я как раз и добавил). Всегда есть внешняя операция. Или ты про случай, когда мы вводим формулу самостоятельно?

Сейчас изменили. Примеры раньше были типа: 2 * 3 + 5

Передайте, пожалуйста, Парьеву, что если он хочет больше 0.25 балла за к/р, пусть расшарит мне репозиторий.

UPD А нет, порядок, это он мне ссылку не ту прислал.

Обращаюсь ко всем паттерно-мученикам. Паттерны — это не костыли и не палки в колёсах ваших проектов. Не надо насильно заталкивать в архитектуру паттерн, который туда никак не вписывается, потому что в задании написано использовать паттерн.

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

Один из самых ярких сигналов проблемы в архитектуре — это дублирующийся код. Я не устаю повторять: если хочется сделать копи-паст, вы должны вздрагивать. Если хочется сделать большоооой копи-паст, то кричать от ужаса :scream:. Копи-паст — это серьёзный симптом, не нужно его игнорировать.

2 лайка

Продемонстрируйте использование паттерна «Адаптер» для удаления всех вхождений заданной подстроки.

Кхм, а что он адаптирует, метод Replace из стандартной библиотеки? И почему жёстко требуется написать класс с названием SubstringRemover, а не с каким-нибудь другим?

Класс SubstringRemover ничего не адаптирует, адаптировать нужно его, чтобы использовать в формуле. В этом варианте, к сожалению, удаление подстроки получилось скучное, да.

Имя зафиксировано, потому что так проще читать задание. И мне потом проще проверять, когда у всех на диаграмме есть одинаковое имя, за которое можно зацепиться.

Понятия не имею, зачем нужно адаптировать Replace / Remover, но получается, что это именно палка в колёса. Ни разу не жизненно.

Да ладно вам, так и скажите, что не знаете, как адаптер писать…

К сожалению, моей фантазии не хватило, чтобы придумать для варианта со строками вменяемую задачу по этому пункту. Поэтому нужно вообразить, что SubstringRemover удаляет подстроки супер-круто и эффективно. В других вариантах классы, которые нужно адаптировать, выполняют разумную работу.

А хотя знаете, @Goga, мне только что пришла в голову одна мысль. Сейчас я исправлю задание.

1 лайк

Вы только diff киньте, пожалуйста.

Очень вовремя, Юлия Вячеславовна. :cold_sweat:

1 лайк

Внимание! Изменение в варианте #2 проекта #3! Новое задание на паттерн адаптер:

Удаление из F всех вхождений самого частого и самого редкого символов из строки c. F ! c — это формула.

Продемонстрируйте использование паттерна «Адаптер» для удаления всех вхождений самого частого и самого редкого символов заданной строки.
Указание. В dll-библиотеке необходимо реализовать класс CharsFreqRemover со следующим интерфейсом:

(конец см. на странице задания)

Ничего не знаю :innocent:

Так, а теперь скажите, зачем нужно адаптировать класс с одним методом CharsFreqRemover.Remove?

Почему я сразу не могу его вызвать? Он вполне удовлетворяет моим потребностям.

// метод выражения
string Eval() {
    var r = new Remover(where);
    return r.Remove(what);
}

Всё прекрасно используется, что здесь адаптировать?

Ну, переборите уже нежелание писать адаптер. У вас тут что-то странное. Откуда what, какое выражение? Вы ещё подумайте, если что — в личку, не надо тут спойлерить.

А подскажите, можно ли в выражениях использовать неопределённые (ещё) пользователем переменные?