Ответы пользователя по тегу Программирование
  • Кто должен логировать? Функция или тот, кто её вызывает?

    artemgapchenko
    @artemgapchenko
    То, что вы описали, называется в англоязычной литературе cross-cutting concerns - это такие области кода, которые решают не саму бизнес-задачу, а являются как бы перпендикулярными к ней, и относятся скорее к функционированию системы. Вы правы насчёт того, что добавлять логирование в саму функцию - это, наверное, не совсем правильный выбор, так как во-первых, функция начинает решать две задачи, что сразу же уменьшает время на понимание её работы, а во-вторых, возможно будут варианты вызова функции, при которых её выполнение логировать не обязательно.
    Я бы, возможно, попробовал зайти к этой задаче со стороны паттерна Декоратор (дальше пишу на Java, так как этот язык для меня основной, но принципы должны быть понятны).

    Определяем интерфейс:

    interface ClientHandler {
    	void blockUser(User user);
    	void unblockUser(User user);
    }

    Дальше пишем реализацию, которая будет заниматься блокированием/разблокированием пользователя:

    public final class ClientHandlerImpl implements ClientHandler {
    	public void blockUser(User user) {
    		// Логика блокирования пользователя
    	}
    
    	public void unblockUser(User user) {
    		// Логика разблокирования пользователя
    	}
    }

    А теперь ход конём: пишем декоратор, который будет оборачивать собой написанную нами имплементацию (и в аргументе конструктора пробрасываем ClientHandlerImpl):

    public final class ClientHandlerLoggingDecorator implements ClientHandler {
    	private final ClientHandler handler;
    
    	public ClientHandlerLoggingDecorator(final ClientHandler handler) {
    		this.handler = handler;
    	}
    
    	public void blockUser(User user) {
    		Log.d("User " + user.getName() + " blocked!")
    		handler.blockUser(user);
    	}
    
    	public void unblockUser(User user) {
    		Log.d("User " + user.getName() + " unblocked!")
    		handler.unblockUser(user);
    	}
    }


    Дальше можно будет создать, например, фабрику ClientHandler'ов, которая по запросу будет возвращать нам новый инстанс ClientHandler'а:

    public final class ClientHandlerFactory {
    	public static ClientHandler getClientHandler() {
    		return new ClientHandlerLoggingDecorator(new ClientHandler());
    	}
    }

    Чего мы добились:
    1. Код логирования вынесен из реализации ClientHandler, если вам нужно будет изучить реализацию блокирования/разблокирования, вы просто открываете ClientHandlerImpl, и изучаете её.
    2. (связано с предыдущим пунктом) Реализацию блокирования/разблокирования и логирования теперь можно менять независимо друг от друга.
    3. Логирующее поведение становится скрытым для пользователей ClientHandler - они просто получают новый инстанс при обращении к фабрике, и используют его. Хотите отключить логирование? Меняете реализацию фабрики, и она начинает возвращать ClientHandlerImpl. Хотите сделать это поведение настраиваемым? Пишете дополнительный код, который на старте читает конфигурацию, и начинает использовать либо ту реализацию фабрики, которая возвращает ClientHandler, покрытый декоратором, либо реализацию, которая возвращает голый ClientHandler. Либо же зашиваете этот выбор внутрь самой фабрики.
    Ответ написан
    Комментировать
  • Как получить аргумент функции при заданном значении функции?

    artemgapchenko
    @artemgapchenko
    Если у вас есть математическая функция, задающая переход значения из множества X в множество Y, например y = x ** 2, то нужно написать реализацию этой функции на python, а затем применить её к каждому значению из первого массива. Можно с помощью циклических конструкций, можно воспользоваться функцией map().
    Если функции нет, а есть график, то сначала получаем приближение этой функции (см. аппроксимация), а потом проводим те же манипуляции, что и в первом параграфе.
    Ответ написан
    Комментировать
  • Кто где делает заметки по программированию?

    artemgapchenko
    @artemgapchenko
    Было уже. Раз, два.
    Ответ написан
    Комментировать
  • Есть ли книга по правильному проектированию кода?

    artemgapchenko
    @artemgapchenko
    Мартин Фаулер - "Рефакторинг - улучшение существующего кода".
    Роберт Мартин - "Быстрая разработка программ. Принципы, примеры, практика".
    Эрик Фримен, Элизабет Фримен - "Паттерны проектирования".

    Но

    Прочтение всех этих книг не будет иметь ни малейшего смысла, если вы не будете перемежать их практикой. Я бы даже сказал так: 80-85% практики, 15-20% чтения книг. Если много читать и мало практиковаться - ничего не усвоите. В зачёт практики идёт также и изучение чужого кода с долгой медитацией над ним: "Почему так сделали? Как это работает? Могу ли я это применить у себя? Решит ли это мою задачу? Какие минусы у такого подхода?"
    Ответ написан
    Комментировать
  • Порекомендуйте сервис конспектирования?

    artemgapchenko
    @artemgapchenko
    Я в Markdown пишу, все заметки находятся в Mercurial-репозитории, который залит на Bitbucket.
    Ответ написан
    Комментировать
  • В какой ВУЗ поступить на программиста?

    artemgapchenko
    @artemgapchenko
    СПбГУ, не? Дают крайне хорошее фундаментальное образование, судя по постоянным успехам их команд на олимпиадах ACM. Подозреваю, что с таким образованием в Google/Яндекс можно будет заходить, открывая дверь ногой.
    Более подробно ответить не могу, и дать каких-то точных рекомендаций тоже, так как лично я вообще в своём родном городе учился. :) От рассказов преподавателей и участия в олимпиадах осталась память об СПбГУ и Саратовском Государственном Университете как об очень хороших ВУЗах, но тут лучше вам самому сравнить их программы, поговорить с преподавателями, возможно посмотреть на статистику трудоустройства выпускников в ведущие IT-компании, посмотреть на наличие договоренностей ВУЗов с IT-компаниями о совместных курсах (вроде https://academy.yandex.ru/ - совместный проект ВШЭ и Яндекса) и так далее.
    Ответ написан
  • Есть ли ресурсы где смогут конструктивно (и не очень) отозватся о написанном проекте?

    artemgapchenko
    @artemgapchenko
    По поводу ресурсов я ничего не скажу, да и подозреваю, что нет таких - просмотреть код проекта дело не быстрое, а не быстрые задачи обычно требуют оплаты.

    Я два с половиной года назад начинал разрабатывать приложения под Android. Был единственным в компании Android-разработчиком, поэтому пинать меня особо не кому было. Первое время меня это сильно напрягало, а потом я успокоился и понял, что научиться можно и самому, без помощи извне.

    Изучайте книги по выбранной тематике (неплохой способ выбрать хороший учебник - посмотреть отзывы на Amazon, там обычно очень подробно расписывают как плюсы, так и минусы), изучайте документацию по выбранной технологии, и пишите-пишите-пишите. Написали - посмотрели, проанализировали. Как оно работает, понятно ли структурирован код, можно ли будет его в последствии расширить? Нужно ли его вообще будет потом расширять, или же это компонент, который будет написан один раз, и потом не будет изменяться? Какие-то из рекомендаций, указанных в книгах/документации, окажутся вредными - вы и сами это впоследствии поймёте, наткнувшись на проблемы, вызванные этими рекомендациями.
    Подпишитесь в Твиттере на известных в вашей среде людей (тут я ничем помочь не могу, известных Android-программистов знаю, а по вебу помочь не смогу), они обычно подкидывают много интересной пищи для размышления.
    Поищите подкасты по выбранной технологии, начните смотреть видео с конференций, подпишитесь на Хабре на нужные топики.
    Ещё хороший способ понять чего не хватает - походить по собеседованиям (в вашей ситуации он, правда, слабо применим, так как город по вашим словам небольшой). Я таким образом нашёл несколько тем, в которых я "плаваю", и которые при этом очень нужны в реальной работе.
    На гитхабе можно найти хорошие проекты, посмотреть как они структурированы, как происходит работа над проектом, какова структура коммитов, и так далее.
    Ещё потенциально полезная тема - еженедельные дайджесты вроде такого, в которых расписываются текущие тенденции. Подпишитесь и читайте.

    Главное при этом - постоянно анализировать входящую информацию, учиться отделять зёрна от плевел, и тогда всё у вас получится.

    P.S. Ну и да, фриланс как способ постепенного совершенствования навыков тоже хорош. Начинайте с простых заданий - где-то что-то допилить, и потихоньку-полегоньку переходите на более сложные проекты.
    Ответ написан
    2 комментария