Сергей Галанин
@SergeyGalanin
Программы—программистам! Польза—пользователям!
Информация
- В рейтинге
- Не участвует
- Откуда
- Москва, Москва и Московская обл., Россия
- Дата рождения
- Зарегистрирован
- Активность
Программы—программистам! Польза—пользователям!
Ваш аккаунт
Алёна, спасибо за отличную статью!
Можете рассказать подробнее вот про это?
Ну почему же поздно? Рефакторинг в данной ситуации и будет состоять в извлечении метода/класса, то есть, в «моей терминологии», в инкапсуляции кусочков кода куда-то там.
А ненормальные обрабатывают во float-ах, и тоже неплохо зарабатывают.
Например (условно), раньше в коде я после каждой операции сложения денег выполнял округление, чтобы избежать побочных эффектов точности:
И таких мест по коду было очень много. В каждой такой точке содержался кусочек знания о том, что реализация денег в этом коде хреновая (в виде float), деньги нужно постоянно округлять.
Потом я заменяю сложение с округлением на специальный вызов, который сам умеет правильно складывать деньги с нужным округлением:
Теперь вы читаете add_money, и не видите никаких round. Я спрятал round? — спрятал.
Таким вот нехитрым способом я прячу от глаз подальше подробности того, как нужно работать с деньгами в этом коде: просто вызывай add_money — и всё всегда будет хорошо, и никаких проблем с точностью.
А что я сделал? Я инкапсулировал код, который выполняет нужные операции, в отдельный модуль, в отдельную функцию. Инкапсулировал? — да. Спрятал? — тоже да.
Термин уж больно хороший: заворачивание чего-то во что-то. Как раз то, о чём я и говорю.
Для начала встречный вопрос: вы согласны, что размазывание деталей реализации по всему коду — это плохо?
Второй вопрос: вы согласны, что значение термина — это вопрос договорённости?
Теперь мой ответ.
Я считаю, что определение в вики хуже, потому что оно не ведёт прямиком к полезному эффекту сокрытия реализации. И даже сокрытие данных, которое могло бы способствовать сокрытию реализации, в классическом понимании инкапсуляции не подразумевается.
Можно объединить поля данных и некоторые процедуры, к ним относящиеся, в одном классе, но это не гарантирует, что знания об устройстве объекта больше нигде не всплывут. Гарантию может дать только сам программист, если будет твёрдо придерживаться правила сосредотачивать все знания об устройстве объекта в одном месте.
Фактически, определение из вики — это частный случай моего определения: да, инкапсуляцию в смысле сокрытия реализации можно осуществить в том числе и при помощи инкапсуляции данных и методов в один класс.
P.S.
Определения терминов из мира программирования формируются исходя из работ авторитетных товарищей из этого мира программирования. Между тем, товарищи Роберт Мартин и Мартин Фаулер не намного умнее нас с вами, просто они пишут книги, а мы — нет. Поэтому я предлагаю нам с вами тоже сделать свой вклад в улучшение мира программирования. Например, путём корректировки некоторых не очень хороших определений терминов на определения, которые приведут в конечном итоге к созданию более качественного кода каждым программистом.
Да, мне тоже любопытно понять, почему anemic набирает популярность. Думаю, у её приверженцев есть достаточно сильные аргументы.
Тут, очевидно, всё дело в издании. В одном издании пошла одна редакция, в другом — другая. Где-то редактор исправил, где-то цензор, а где-то и сам автор подсуетился.
У автора ребуса была другая редакция, чем та, что мне удалось скачать.
Видел этот косяк, но поленился искать правильное издание или подчищать скан…
Да, я тоже иногда пишу обработчики ошибок, которые выдают пользователю «неизвестная внутренняя ошибка». Но только в том случае, когда пользователю действительно нечего рассказать (ошибка в базе по нештатной причине, например), и только для того, чтобы не показывать ему голую страницу 500. Никакие данные, введённые пользователем, при этом не теряются.
Согласен, что в случае ошибки с пунктом доставки, возможно, никак нельзя было установить причину. Но что-то мне подсказывает, что на самом деле можно. Просто нет такой привычки у программистов. Ну это как в былые времена не было практики подсвечивать поля ввода с ошибкой, а описания ошибок просто вываливались вверху страницы одной кучей после сабмита. И хорошо, если можно было понять, что не так с полем, а то часто получал просто «поле заполнено неправильно». Да ещё пароль с подтверждением очищались, и их перед каждой попыткой сабмита надо было набивать снова и снова.
Верю, что когда-нибудь забота о пользователе шагнёт ещё дальше, и в продуктах повсеместно(!) будут не только подсвечиваться неправильно заполненные поля, но и вообще на каждом шагу будут даваться подсказки, что можно предпринять даже в нештатной ситуации.
Ну и диагностику неплохо бы собирать, чтобы, если уж пользователь обратился в техподдержку, то его не посылали бы
напопробовать сделать то же самое в другом браузере, а смогли сходу выдать внятный ответ.Просто не так давно натыкался на такую ошибку при оформлении заказа в одном крупном магазине. И заказ-то был уже не первый, и магазин-то солидный — так нет же: «попробуйте повторить позже». Была бы хоть какая альтернатива — сразу молча ушёл бы, и магазин потерял клиента с ежегодными платежами в 10к рублей. Но идти некуда, я потыкался в других браузерах и отправился в техподдержку. Где меня предсказуемо послали обратно в те же самые другие браузеры. И только после того, как я сдерживая мат, вежливо объяснил, что всё это я уже сделал до обращения, и вопросил: а не начать ли программистам уделять больше внимания проблемам пользователей, через несколько дней получил ответ, что ошибка возникала из-за выбранного мной пункта выдачи. Тогда я спокойно выбрал другой пункт выдачи, находящийся от первого в трёхстах метрах, и совершенно без проблем завершил оформление заказа.
Вопрос: вот зачем так трепать нервы покупателям?
А вот это офигенно, зачёт! Я до такого не додумался.
Можно личный вопрос, чисто из любопытства: сколько Вы в планке можете простоять? На 15-минутный митинг хватит? А рассказ коллеги, услышанный в планке, хорошо воспримется и запомнится? А как насчёт что-нибудь записать по ходу обсуждения?
Не, я понимаю, что в реальности на постоянной основе так никто не делает, но как вообще такая мысль могла в голову прийти?))