Beim Schreiben einer Bibliothek für ein großes Projekt, an dem ich gerade arbeite, ist ein Problem aufgetreten, bei dem ein Token an eine E-Mail-Adresse gesendet und dann an den Code zurückgegeben werden musste, wo es für die weitere Verwendung verwendet werden kann.
Mein Kollege sagt, er solle nur aus STDIN lesen (mit Python:) code = input("Enter code: ")
und dann von einem Benutzer weiterleiten lassen. Dies scheint mir jedoch eine schlechte Praxis zu sein, da die Bibliothek möglicherweise (in diesem Fall definitiv) in einer Hintergrundaufgabe auf einem Server verwendet wird .
Ich fragte mich, ob dies als Anti-Muster angesehen wurde oder nicht.
programming-practices
libraries
anti-patterns
Paradoxis
quelle
quelle
Antworten:
Als allgemeine Richtlinie sollten Bibliotheken vollständig von der Umgebung getrennt sein. Das bedeutet, dass sie keine Vorgänge für Standard-Streams oder für bestimmte Dateien ausführen oder Erwartungen an die Umgebung oder den Kontext haben sollten, in dem sie verwendet werden.
Natürlich gibt es Ausnahmen von dieser Regel, aber es muss einen sehr guten Grund dafür geben. Im Falle der Verwendung
stdin
kann ich keinen Grund finden (es sei denn, Ihre Bibliothek bietet tatsächlich Routinen zum Lesen von stdin, wiestd::cin
aus C ++). Darüber hinaus bietet das Abrufen der E / A-Datenströme von einem Parameter, anstatt sie fest zu codieren, so viel Flexibilität, dass es sich nicht lohnt, dies nicht zu tun.quelle
/dev/tty
, um mit dem zu kommunizieren Benutzer. Das Programm kann sogar ohne Terminal gestartet werden und mit ein eigenes Terminal öffnenxterm -S
.Ich würde dies nicht unbedingt als Anti-Pattern betrachten, sondern als eine schlecht gestaltete Bibliothek. Es sollte trivial sein, nach einem String als Methodenparameter zu fragen, in den die Eingabe direkt übergeben werden kann.
Wenn dies nicht zu dieser Verwendung passt, kann ein Methodenparameter ein Stream sein, wobei STDIN an die Methode übergeben wird.
Wenn dies nicht zu dieser Verwendung passt, ist die Bibliothek nicht flexibel genug.
quelle
Erwägen Sie möglicherweise, in Ihrer Bibliothek die Möglichkeit zu haben, einen Rückruf für eine vom Benutzer bereitgestellte Funktion festzulegen, die Eingaben von überall liest , und dann den entsprechenden Wert an den Teil der Bibliothek zurückzugeben, der diese Funktion verwendet.
quelle
Wenn es von stdin liest, bedeutet dies, dass es den Besitz von stdin auf Programmebene übernehmen möchte. Es ist wahrscheinlich nicht kompatibel mit anderen Bibliotheken, die aus dem weniger spezifischen Standardprotokoll für die gemeinsame Nutzung lesen. Zumindest in meinem persönlichen Glossar würde dies die Bibliothek zu einem Framework machen , was einen teuren Kompromiss darstellt.
In diesem Fall sollte die Bibliothek wahrscheinlich nur einen Eingabedateideskriptor verwenden.
quelle
Die Antwort von @ Paul92 ist eine gute allgemeine Diskussion, aber ich möchte eine mögliche saubere (ish) Lösung dafür anbieten :
Als Bibliothek muss dieser Code an jede Laufzeitumgebung anpassbar sein, sodass Sie nicht wirklich
STDIN
nach wichtigen Daten fragen können. Zum einen haben Benutzer Ihrer Bibliothek aus einer Reihe von Gründen möglicherweise kein stdin verfügbar. Stattdessen möchten Sie möglicherweise eine Art Strategiemuster verwenden , um anzupassen, wie das Token abgerufen werden soll.In Python ist es wahrscheinlich die beste Option, die Token-Abrufstrategie als Funktionsparameter zu übergeben. Sowas in der Art:
Stellen Sie es sich so vor. Das von Ihnen benötigte Token ist ein Argument für die Bibliotheksfunktion. Da der Wert für das Token an der Aufrufstelle möglicherweise nicht statisch bekannt ist, können Sie den Wert nicht wirklich als Argument anfordern. Stattdessen muss der Aufrufer eine Funktion bereitstellen, die für die Bereitstellung des Tokens beim Aufruf verantwortlich ist.
Die gesamte Verantwortung für die Bereitstellung der genauen Mechanik des Tokens wird jetzt aus der Bibliotheksfunktion ausgelagert. Der Verbraucher der Funktion ist nun dafür verantwortlich, das Token mit allen zur Laufzeit verfügbaren Mitteln zu erfassen. Es kann STDIN fragen, aber auch als Mail-Gateway fungieren, warten, bis die Nachricht im Posteingang eingeht, gelesen, das Token extrahiert und den Vorgang vollständig automatisiert. Es kann sich um ein GUI-Dialogfeld oder ein webbasiertes Formular handeln. Eigentlich alles - alle Optionen liegen jetzt in den Händen des Bibliotheksverbrauchers.
quelle