Во время написания библиотеки для большого проекта, над которым я работаю на работе, возникла проблема, которая требовала, чтобы токен был отправлен на адрес электронной почты, а затем возвращен в код, где он может быть использован для дальнейшего использования.
Мой коллега говорит, что нужно просто читать из STDIN (используя Python:), code = input("Enter code: ")
а затем передать его пользователю, однако для меня это кажется плохой практикой, поскольку библиотека может (в этом случае определенно будет) использоваться в фоновом режиме на сервере. ,
Мне было интересно, считается ли это анти-паттерном или нет.
programming-practices
libraries
anti-patterns
Paradoxis
источник
источник
Ответы:
Как правило, библиотеки должны быть полностью отключены от среды. Это означает, что они не должны выполнять операции со стандартными потоками, с конкретными файлами или иметь какие-либо ожидания относительно среды или контекста, который они используют.
Конечно, есть исключения из этого правила, но для этого должна быть очень веская причина. В случае использования
stdin
я не могу найти никакой причины (если ваша библиотека на самом деле не предоставляет подпрограммы для чтения из stdin, какstd::cin
из C ++). Кроме того, взятие потоков ввода-вывода из параметра вместо их жесткого кодирования добавляет столько гибкости, что не стоит этого делать.источник
/dev/tty
для связи с пользователь. Программа может даже быть запущена без терминала и открыть свой собственный терминал с помощьюxterm -S
.Я считаю, что это не обязательно анти-паттерн, просто плохо спроектированная библиотека. Это должно быть тривиально, чтобы запросить строку в качестве параметра метода, где входные данные могут быть переданы непосредственно в.
Если это не подходит для этого использования, то параметром метода может быть поток, с STDIN, переданным в метод.
Если это не подходит для этого использования, то библиотека недостаточно гибкая.
источник
Возможно, стоит рассмотреть возможность использования в вашей библиотеке функции обратного вызова для предоставленной пользователем функции, которая будет читать входные данные откуда угодно , а затем возвращать соответствующее значение обратно в любую часть библиотеки, использующую эту функцию.
источник
Если он читает из stdin, это означает, что он хотел бы принять владение программным уровнем stdin. Скорее всего, он не совместим с любой другой библиотекой, которая читает из stdin, менее специфичным протоколом для совместного использования. По крайней мере, в моем собственном глоссарии это сделало бы библиотеку основой , что является дорогостоящим компромиссом.
Но в этом случае библиотека, вероятно, должна просто взять дескриптор входного файла.
источник
Ответ @ Paul92 - это хорошее общее обсуждение, но я хотел бы предложить возможное чистое (ish) решение этого:
Будучи библиотекой, этот код должен быть адаптируем к любой среде выполнения, поэтому вы не можете запросить
STDIN
какой-то важный бит данных. Во-первых, у пользователей вашей библиотеки может быть недоступен стандартный ввод по ряду причин. Вместо этого вы можете использовать некоторую форму шаблона стратегии , чтобы настроить способ получения токена.В Python, вероятно, лучшим вариантом является передача стратегии извлечения токена в качестве параметра функции. Что-то такое:
Думайте об этом так. Требуемый токен является аргументом библиотечной функции. Поскольку значение токена может быть неизвестно статически на сайте вызовов, вы не можете запросить значение в качестве аргумента. Вместо этого вызывающая сторона должна предоставить функцию, которая будет отвечать за предоставление токена при вызове.
Вся ответственность за предоставление точной механики токена теперь не связана с библиотечной функцией. Теперь пользователь функции отвечает за получение токена любыми доступными во время выполнения средствами. Он может запрашивать STDIN, но он также может выступать в качестве почтового шлюза, ждать, пока сообщение войдет в папку «Входящие», прочитать его, извлечь токен и полностью автоматизировать процесс. Это может быть графический интерфейс или веб-форма. Что-нибудь действительно - все варианты теперь находятся в руках потребителя библиотеки.
источник