Haruskah saya menggunakan file konfigurasi atau database untuk menyimpan aturan bisnis?

41

Saya baru-baru ini membaca The Pragmatic Programmer yang menyatakan bahwa:

Detail mengacaukan kode asli kami — terutama jika sering berubah. Setiap kali kita harus masuk dan mengubah kode untuk mengakomodasi beberapa perubahan dalam logika bisnis, atau dalam hukum, atau dalam selera pribadi manajemen saat itu, kita berisiko menghancurkan sistem — memperkenalkan bug baru.

Hunt, Andrew; Thomas, David (1999-10-20). Programmer Pragmatis: Dari Journeyman hingga Master (Lokasi Kindle 2651-2653). Pearson Education (USA). Edisi menyalakan.

Saat ini saya sedang memprogram aplikasi web yang memiliki beberapa model yang memiliki properti yang hanya dapat berasal dari sekumpulan nilai, misalnya (bukan contoh aktual sebagai data aplikasi web yang rahasia):

light-> type = sphere / cube / cylinder

Jenis cahaya hanya bisa menjadi tiga nilai di atas tetapi menurut TPP saya harus selalu kode seolah-olah mereka dapat mengubah dan menempatkan nilai-nilai mereka dalam file konfigurasi. Karena ada beberapa insiden ini di seluruh aplikasi, pertanyaan saya adalah:

Haruskah saya menyimpan nilai yang mungkin seperti ini di:

  • file konfigurasi:
    'light-types' => array(sphere, cube, cylinder),
    'other-type' => value,
    'etc' => etc-value

  • satu tabel dalam database dengan satu baris untuk setiap item konfigurasi

  • database dengan meja untuk setiap item konfigurasi (misalnya tabel: light_types; kolom: id, name)

  • cara lain?

Terima kasih banyak atas bantuan / keahlian yang ditawarkan.

foiseworth
sumber

Jawaban:

45

Pertanyaan yang sama muncul di sebagian besar proyek yang saya kerjakan. Biasanya, saya melakukan ini:

  1. Jika sekumpulan nilai yang mungkin tidak akan berubah dalam waktu dekat, saya menggunakan konstanta kelas / antarmuka atau enum dalam kode dan bidang yang dapat dihitung dalam database. Contoh: keadaan penerbitan entri blog: 'tidak dipublikasikan', 'di bawah moderasi', 'diterbitkan', dll.
  2. Nilai mungkin akan berubah, tetapi perubahan tidak akan mempengaruhi logika program - file konfigurasi. Contoh: daftar "bagaimana Anda menemukan situs web kami?" opsi untuk daftar dropdown dalam formulir pembelian online.
  3. Nilai cenderung berubah sering dan / atau dimaksudkan untuk diedit oleh non-pengembang, tetapi perubahan ini tidak akan mempengaruhi logika - database atau setidaknya penyimpanan nilai kunci dengan beberapa antarmuka yang ramah pengguna untuk mengedit.
  4. Mengubah nilai akan memengaruhi logika - mungkin sistem perlu dirancang ulang (sering kali benar) atau beberapa mesin aturan bisnis diperlukan. Kasus paling sulit yang pernah saya lihat sejauh ini adalah tes psikologi yang dilakukan oleh rekan saya. Setiap jenis tes dapat memiliki sistem penilaian sendiri yang dapat bervariasi dari penambahan sederhana hingga skala karakteristik ganda dengan nilai positif dan negatif atau bahkan evaluasi manusia atas jawaban. Setelah beberapa diskusi tentang proyek ini, kami akhirnya menggunakan Lua sebagai mesin scripting, yang benar-benar bertentangan dengan kemampuan non-pengembang untuk membuat tes baru (meskipun Lua adalah bahasa yang relatif sederhana yang tidak boleh Anda harapkan bahwa non-programmer akan mempelajarinya).

Tentang kutipan dari TPP. Saya pikir itu benar untuk kode asli , tetapi dalam kehidupan nyata, Anda lebih baik mulai sederhana ( prinsip KISS ) dan menambahkan fitur nanti jika mereka benar-benar diperlukan ( YAGNI ).

skrip
sumber
7

Jika data Anda akan ada dalam database, saya akan merekomendasikan memiliki tabel 'light_types' di DB yang sama. Ini memberi Anda kemampuan untuk menggunakan kunci asing untuk memberlakukan batasan bahwa tipe light-> hanya bisa menjadi salah satu dari nilai-nilai itu, jadi bahkan jika kode itu kacau, data dalam DB akan selalu valid.

Jika data tidak akan disimpan dalam DB, membuat satu hanya untuk sekelompok enum tidak banyak manfaatnya. Saya mungkin merekomendasikan file konfigurasi, jika Anda benar-benar ingin menghindari pengkodean nilai.

(Saya akan memperingatkan agar tidak terlalu jauh dalam menghindari hard-coding. Dalam sistem non-sepele, akan ada asumsi tentang aturan dan persyaratan bisnis, apakah penulis menyadarinya atau tidak. Bahkan jika Anda entah bagaimana berhasil menghindari semua asumsi dan kode lunak benar-benar segalanya, Anda pada dasarnya hanya berakhir dengan "mesin aturan", semacam sistem dalam sistem dan / atau bahasa meta, dan Anda memiliki banyak hal dalam bahasa meta untuk menerapkan aturan. Anda belum menyimpan pekerjaan apa pun atau mendapatkan fleksibilitas apa pun; Anda hanya perlu membangun dan / atau belajar bahasa lain.

Sekarang, jika Anda ingin menemukan dan menggunakan mesin aturan yang ada, itu mungkin menghemat sedikit pekerjaan (bersama dengan menjawab pertanyaan di mana menyimpan enum). Tetapi membangun sendiri hanya dua kali lipat beban kerja dan mau tidak mau membuat Anda menjadi sistem setengah-setengah yang dibangun oleh orang-orang yang benar-benar tidak tahu bagaimana membuat mesin aturan yang layak.)

cao
sumber
0

Secara umum database harus digunakan untuk data dan file konfigurasi harus digunakan untuk konfigurasi. (seperti namanya :)). Menjaga konfigurasi dalam database merupakan pemisahan yang buruk dan hanya boleh dilakukan jika Anda memiliki kasus penggunaan yang baik untuk membenarkannya.

Ada keseimbangan yang harus dipukul ketika memutuskan berapa banyak konfigurasi untuk digunakan. Anda harus memperlakukan file konfigurasi Anda sebanyak bagian dari aplikasi sebagai kode. Simpan sesingkat mungkin. Sangat mudah bagi aplikasi untuk menderita konfigurasi mengasapi di mana Anda berakhir dengan file xml besar penuh dengan string sihir.

Jika Anda menjelaskan akan masuk akal untuk memiliki elemen konfigurasi untuk menentukan file css mana yang akan digunakan. (Anda kemudian bisa mengubahnya jika persyaratan berubah). Akan berlebihan jika mengkonfigurasi gaya setiap elemen dalam file konfigurasi

Tom Squires
sumber
1
Bagaimana Anda mendefinisikan apa itu konfigurasi dan apa itu data?
nafg
3
Jawaban Anda tidak menjelaskan mengapa menyimpan konfigurasi dalam basis data melanggar pemisahan kekhawatiran (kekhawatiran basis data adalah menyimpan data; tidak peduli data apa yang Anda simpan di sana), atau mengapa ini adalah hal yang buruk, dan Anda jawabannya sekarang dikutip di tempat lain sebagai bukti bahwa itu adalah hal yang buruk.
Robert Harvey
database dapat berubah sesuai permintaan. kita dapat memiliki mereka yang tidak sinkron seperti mysql. Apakah file statis mendukung ini? TIDAK! Jadi saya
mengundurkan diri
@AmirHossein File statis mendukung perubahan sesuai permintaan selama file tersebut tidak dikunci. Itu bukan argumen.
Zimano