Saat menulis perpustakaan untuk proyek besar yang sedang saya kerjakan di tempat kerja, muncul masalah yang membutuhkan token untuk dikirim ke alamat email, dan kemudian diteruskan kembali ke kode di mana ia kemudian dapat digunakan untuk penggunaan lebih lanjut.
Rekan saya mengatakan untuk hanya membaca dari STDIN (menggunakan Python:) code = input("Enter code: ")
dan kemudian memiliki pengguna yang meneruskannya, namun bagi saya ini sepertinya praktik yang buruk karena perpustakaan mungkin (dalam hal ini pasti akan) digunakan dalam tugas latar belakang pada server .
Saya bertanya-tanya apakah ini dianggap sebagai anti-pola atau tidak.
programming-practices
libraries
anti-patterns
Paradoksis
sumber
sumber
Jawaban:
Sebagai pedoman umum, perpustakaan harus benar-benar terputus dari lingkungan. Itu berarti bahwa mereka tidak boleh melakukan operasi pada aliran standar, pada file tertentu, atau memiliki harapan tentang lingkungan atau konteks yang digunakan.
Tentu saja, ada pengecualian untuk aturan ini, tetapi harus ada alasan yang sangat bagus untuk itu. Dalam hal menggunakan
stdin
, saya tidak dapat menemukan alasan apa pun (kecuali perpustakaan Anda benar-benar menyediakan rutinitas untuk membaca dari stdin, sepertistd::cin
dari C ++). Selain itu, mengambil stream I / O dari suatu parameter daripada meminta mereka melakukan hardcod menambahkan begitu banyak fleksibilitas sehingga tidak layak untuk tidak melakukannya.sumber
/dev/tty
untuk berkomunikasi dengan pengguna. Program bahkan dapat dimulai tanpa terminal dan buka terminal sendiri menggunakanxterm -S
.Saya akan menganggap ini tidak harus anti-pola, hanya perpustakaan yang dirancang dengan buruk. Seharusnya sepele untuk meminta string sebagai parameter metode, di mana input dapat diteruskan secara langsung.
Jika itu tidak sesuai dengan penggunaan ini, maka parameter metode bisa menjadi streaming, dengan STDIN diteruskan ke dalam metode.
Jika itu tidak sesuai dengan penggunaan ini, maka perpustakaan tidak cukup fleksibel.
sumber
Mungkin mempertimbangkan memiliki kemampuan di perpustakaan Anda untuk mengatur panggilan balik ke fungsi yang disediakan pengguna yang akan membaca input dari mana saja , dan kemudian mengembalikan nilai yang sesuai kembali ke bagian perpustakaan mana pun yang menggunakan fungsi itu.
sumber
Jika ia membaca dari stdin, itu berarti ia ingin mengambil kepemilikan tingkat program dari stdin. Kemungkinan tidak kompatibel dengan perpustakaan lain yang membaca dari stdin, protokol yang kurang spesifik untuk bagaimana mereka berbagi penggunaan. Setidaknya dalam glosarium pribadi saya sendiri, ini akan membuat perpustakaan menjadi kerangka kerja , yang merupakan tradeoff yang mahal.
Tetapi dalam kasus ini, perpustakaan mungkin harus hanya mengambil deskripsi file input.
sumber
Jawaban oleh @ Paul92 adalah diskusi umum yang baik, tetapi saya ingin menawarkan solusi bersih (ish) untuk ini:
Pustaka, kode ini harus dapat beradaptasi dengan lingkungan runtime, jadi Anda tidak bisa benar-benar meminta
STDIN
sedikit data penting. Untuk satu, pengguna perpustakaan Anda mungkin tidak memiliki stdin tersedia karena sejumlah alasan. Alih-alih, Anda mungkin ingin menggunakan beberapa bentuk pola strategi untuk menyesuaikan cara token diambil.Dalam Python, mungkin opsi terbaik adalah meneruskan strategi pengambilan token sebagai parameter fungsi. Sesuatu seperti itu:
Pikirkan seperti ini. Token yang Anda butuhkan, adalah argumen untuk fungsi perpustakaan. Karena nilai token mungkin tidak dikenal secara statis di situs panggilan, Anda tidak dapat benar-benar meminta nilai sebagai argumen. Sebaliknya, penelepon harus menyediakan fungsi yang akan bertanggung jawab untuk menyediakan token saat dipanggil.
Semua tanggung jawab untuk menyediakan mekanisme yang tepat dari token sekarang dieksternalisasi dari fungsi perpustakaan. Konsumen fungsi sekarang bertanggung jawab untuk memperoleh token dengan cara apa pun yang tersedia saat runtime. Mungkin bertanya STDIN, tetapi mungkin juga bertindak sebagai gateway email, menunggu pesan masuk ke kotak masuk, membacanya, mengekstrak token dan sepenuhnya mengotomatiskan proses. Mungkin dialog GUI atau formulir berbasis web. Apa pun yang benar - semua opsi kini ada di tangan konsumen perpustakaan.
sumber