Dalam tiga tahun terakhir saya bekerja sebagai pengembang, saya telah melihat banyak contoh di mana orang menggunakan pernyataan beralih untuk mengatur jalur (baik di back-end dan front-end) untuk URL. Di bawah ini adalah contohnya:
Contoh back-end (C #):
public static string getHost(EnvironmentEnum environment){
var path = String.Empty;
switch (environment)
{
case EnvironmentEnum.dev:
path = "http://localhost:55793/";
break;
case EnvironmentEnum.uat:
path = "http://dev.yourpath.com/";
break;
case EnvironmentEnum.production:
path = "http://yourpath.com/";
break;
}
return path;
}
Contoh front-end (JavaScript):
(function () {
if (window.location.host.indexOf("localhost") !== -1) {
window.serviceUrl = "http://localhost:57939/";
}
else if (window.location.host.indexOf("qa") !== -1) {
window.serviceUrl = "http://dev.yourpath.com/";
}
else {
window.serviceUrl = "http://yourpath.com/";
}
})();
Telah dibahas apakah itu praktik yang baik atau buruk, dan saya pikir itu adalah praktik yang buruk, karena kita harus menghindari kode semacam ini dan mengatur konfigurasi yang tepat. Tetapi sejujurnya saya benar-benar tidak tahu jawaban yang tepat dan mengapa itu tidak direkomendasikan dan apa cara yang benar untuk menerapkan ini.
dapatkah seseorang menjelaskan pro dan kontra dari praktik di atas?
Dictionary
adalah cara yang jauh lebih bersih untuk mengkode ini dalam C #. Lihat ideone.com/45g5xO . Atau di JS gunakan objek yang sudah tua, lihat jsfiddle.net/1ouhovqq .Jawaban:
Kode yang cocok untuk Anda dan mudah dipelihara adalah definisi "baik". Anda tidak boleh mengubah hal-hal hanya demi mematuhi gagasan seseorang tentang "praktik yang baik" jika orang itu tidak dapat menunjukkan apa masalahnya dengan kode Anda.
Dalam hal ini, masalah yang paling jelas adalah bahwa sumber daya dikodekan secara keras ke dalam aplikasi Anda - bahkan jika mereka dipilih secara dinamis, mereka masih dikodekan dengan keras. Ini berarti bahwa Anda tidak dapat mengubah sumber daya ini tanpa mengkompilasi ulang / mempekerjakan kembali aplikasi Anda. Dengan file konfigurasi eksternal, Anda hanya perlu mengubah file itu dan memulai ulang / memuat ulang aplikasi Anda.
Apakah itu masalah atau tidak tergantung pada apa yang Anda lakukan dengannya. Dalam kerangka Javascript yang secara otomatis didistribusikan kembali dengan setiap permintaan, itu tidak masalah sama sekali - nilai yang diubah akan menyebar ke setiap pengguna saat mereka menggunakan aplikasi berikutnya. Dengan penyebaran di tempat dalam bahasa yang dikompilasi di lokasi yang tidak dapat diakses, itu memang masalah yang sangat besar. Menginstal ulang aplikasi mungkin membutuhkan waktu lama, biaya banyak uang atau harus dilakukan pada malam hari untuk menjaga ketersediaan.
Nilai hard-coded atau tidak merupakan masalah tergantung pada apakah situasi Anda lebih seperti contoh pertama atau lebih seperti contoh kedua.
sumber
Anda benar dalam berpikir ini adalah praktik yang buruk. Saya telah melihat ini dalam kode produksi, dan selalu kembali menggigit Anda.
Apa yang terjadi ketika Anda ingin menambahkan lingkungan lain? Atau ubah server pengembangan Anda? Atau Anda harus gagal ke lokasi yang berbeda? Anda tidak bisa karena konfigurasi Anda langsung terkait dengan kode.
Konfigurasi harus dipaksa keluar dari kode dan masuk ke lingkungan itu sendiri. Ini adalah prinsip dari Aplikasi Dua Belas-Faktor ( http://12factor.net/config ), tetapi ini adalah praktik yang baik untuk aplikasi apa pun. Anda mungkin menemukan bahwa variabel lingkungan tidak sesuai untuk situasi Anda, dalam hal ini saya sarankan melihat menyimpan konfigurasi itu dalam database file konfigurasi bersama (tetapi tidak diperiksa dengan) kode.
sumber
Untuk satu, (seperti yang telah disebutkan orang lain) ini adalah ide yang buruk karena Anda mengikat detail implementasi ke dalam kode Anda. Ini membuatnya sulit untuk mengubah banyak hal.
Seperti disebutkan dalam jawaban ini , jika Anda ingin menambahkan lingkungan baru sekarang Anda harus memperbarui kode Anda di mana-mana , alih-alih hanya menambahkan program Anda ke lingkungan baru.
Ada kesalahan serius lain dengan melakukan ini dalam kode Javascript Anda: Anda mengekspos internal perusahaan Anda kepada penyerang potensial. Tentu, Anda mungkin berada di belakang firewall, tetapi Anda mungkin masih memiliki karyawan yang tidak puas atau seseorang yang membiarkan virus masuk.
Berita buruk ditanggung.
Hal terbaik yang harus dilakukan adalah mengatur konfigurasi Anda dari lingkungan (seperti pada jawaban yang ditautkan sebelumnya, Twelve-Factor App memiliki saran hebat tentang topik ini). Ada beberapa cara untuk melakukan ini tergantung pada bahasa Anda. Salah satu yang termudah (biasanya) adalah hanya mengatur variabel lingkungan. Kemudian Anda hanya mengubah variabel tergantung di mana Anda menjalankan - apakah itu kotak dev, qa, atau produksi lokal. Opsi lain adalah menyimpan nilai-nilai dalam
.ini
file atau JSON. Alternatif lain adalah menyimpan nilai konfigurasi Anda sebagai kode aktual. Bergantung pada bahasa atau lingkungan apa yang Anda gunakan ini mungkin atau mungkin bukan ide yang baik.Tetapi tujuan utamanya adalah membiarkan Anda mengambil satu basis kode, meletakkannya di mesin apa pun yang memiliki arsitektur / konektivitas yang didukung, dan dapat menjalankannya tanpa mengubah kode dengan cara apa pun.
sumber
Bagaimana jika saya ingin menjalankan backend pada komputer saya sendiri tetapi tidak pada port 55793, misalnya jika saya menjalankan beberapa versi pada saat yang sama untuk membandingkannya? Bagaimana jika saya ingin menjalankan aplikasi backend pada satu mesin, tetapi mengaksesnya dari yang lain? Bagaimana jika saya ingin menambahkan lingkungan keempat? Seperti yang orang lain tunjukkan, Anda harus mengkompilasi ulang hanya untuk mengubah konfigurasi dasar.
Pendekatan yang telah Anda jelaskan mungkin telah berhasil dalam praktik untuk tim Anda sejauh ini, tetapi itu membatasi tanpa tujuan. Sistem konfigurasi yang memungkinkan parameter seperti jalur ini ditetapkan secara sewenang-wenang dalam file konfigurasi pusat jauh lebih fleksibel daripada yang hanya menyediakan opsi tetap, dan apa keuntungan yang Anda dapatkan dengan pendekatan pernyataan switch? Tidak ada!
sumber
Ini PRAKTEK YANG BURUK .
Prinsip dasar desain perangkat lunak: Jangan nilai-nilai konfigurasi hard-code di dalam program Anda. Ini terutama berlaku untuk apa pun yang memiliki peluang yang wajar untuk berubah di masa depan.
Kode program yang Anda kembangkan harus kode yang sama yang masuk ke lingkungan apa pun seperti pengujian QA, UAT, dan produksi. Jika seseorang perlu mengubah konfigurasi nanti karena lingkungan telah berubah, atau mereka perlu menggunakannya di lingkungan baru, baiklah. Tetapi mereka tidak perlu menyentuh kode program Anda untuk melakukannya. Dan Anda seharusnya tidak memiliki versi kode yang berbeda untuk setiap lingkungan. Jika program Anda telah berubah sejak diuji, maka Anda belum menguji versi itu. Tanyakan insinyur perangkat lunak apa pun, profesional penjaminan kualitas perangkat lunak apa pun, profesional manajemen proyek TI, auditor TI apa pun.
Seseorang dapat memindahkan pengujian ke server lain. Seseorang mungkin memutuskan juga menginginkan lingkungan pelatihan pengguna, atau lingkungan untuk demonstrasi penjualan. Mereka tidak harus pergi ke programmer untuk konfigurasi administratif.
Perangkat lunak harus fleksibel dan cukup kuat untuk menangani situasi yang tidak terduga, masuk akal.
Selain itu, perangkat lunak tidak boleh ditulis tetapi sepertinya paling mudah untuk Anda saat ini. Biaya pengembangan perangkat lunak kecil dibandingkan dengan biaya pemeliharaan perangkat lunak selama masa pakainya. Dan katakanlah setahun dari sekarang, Anda mungkin bukan orang yang mengerjakan kode itu. Anda harus memikirkan apa yang Anda tinggalkan untuk orang bodoh miskin berikutnya yang harus mengambil kekacauan apa pun yang mungkin Anda tinggalkan, mungkin bertahun-tahun setelah Anda pergi ke padang rumput yang lebih hijau. Atau Anda mungkin orang yang mengambil kode bertahun-tahun kemudian, tidak percaya dengan apa yang Anda lakukan saat itu.
Kode hal-hal dengan benar, sebaik mungkin. Ini cenderung menjadi masalah nanti.
sumber