Misalnya, kami memiliki permainan komputer dengan beragam karakter. Jenis kelamin karakter akan disimpan di bidang gender. Anda dapat membuat bidang ini bilangan bulat atau string, tetapi pemrogram yang baik berusaha membuat keadaan objek yang salah menjadi tidak dapat diekspresikan, dan karenanya, kemungkinan besar, akan mulai enum untuk lantai. Sekarang membuat karakter dengan jenis kelamin yang salah tidak mungkin!
Dan dalam gim ini ada database di mana semua pemain disimpan, dan di sana Anda juga perlu mencatat jenis kelamin mereka. Akan menyenangkan untuk membuat karakter dengan gender yang salah tidak dapat ditambahkan ke database, karena tidak hanya kode yang akan bekerja dengannya, di mana tidak ada kecuali enum yang disediakan untuk jenis kelamin, tetapi juga orang yang hidup. Dan orang-orang yang masih hidup, seperti yang Anda tahu, berusaha masuk ke dalam basis data apa yang tidak perlu dimasukkan di sana.
Untungnya, terutama untuk kasus-kasus seperti itu, banyak DBMS juga memiliki kemampuan untuk membuat kolom dari tipe enum, sehingga membatasi rentang nilai yang dapat dimiliki data dalam kolom tersebut. Apa yang akan mengambil keuntungan dari pengembang berpengalaman yang tidak ingin proyeknya menjadi sesuatu yang bukan untuk feng shui.
Pada klien, programmer juga bukan orang bodoh dan juga tahu bahwa status yang salah harus tidak dapat diekspresikan, dan untuk ini jenis kelamin karakter harus enum.
Ideal!
Namun, jika Anda mencermati, Anda dapat menemukan satu kekurangan kecil, yang pada akhirnya menyebabkan masalah. Bidang penyimpanan lantai disebut bukan jenis kelamin, tetapi jenis kelamin, yang berarti bahwa perancang permainan sudah dipilih untuk itu. Cepat atau lambat, dia akan mengetahui bahwa ada lebih dari dua jenis kelamin, tidak seperti jenis kelamin, dan dia akan ingin menambahkan gender GENERIC_TEEN. Dan kemudian itu semua dan poploheet.
Klien harus terus diperbarui
Yang pertama jatuh adalah orang-orang yang menulis kode klien, karena nilai-nilai yang salah dari parameter gender akan mulai datang dari server untuk setiap bersin. Dan ketika karakter dengan jenis kelamin berasal dari server tentang keberadaan yang tidak diketahui klien, maka permainan, seperti yang diinginkan oleh programmer pada klien, tidak akan dimulai. Sekarang, ketika jenis kelamin baru perlu merilis versi baru dari klien dan menjalankan upgrade paksa, yang kita semua cinta begitu banyak.
Di server enum, itu bagus, karena jika beberapa nilai yang tidak diketahui ditemukan di sana, maka ini jelas merupakan kesalahan yang perlu ditemukan dan diperbaiki, tetapi pada klien, penampilan nilai yang tidak diketahui adalah situasi biasa yang secara teratur akan terjadi pada versi klien yang ketinggalan zaman, dan oleh karena itu ada enum adalah kejahatan yang harus diberantas dan dihancurkan sesegera mungkin.
Kode baru tidak akan bekerja dengan dasar tua
Selanjutnya, menurut rekomendasi dari peternak terbaik, kode baru harus dapat bekerja dengan data sirkuit tua, dan kemudian ternyata bahwa seluruh sistem dapat runtuh hanya karena fakta bahwa kode ini ditambahkan ke jenis kelamin baru.
Oleh karena itu, enum mengganggu kita dalam database, dan dalam hal ini kita perlu menyimpan di string bidang, atau int, atau apa pun, di mana, jika perlu, Anda dapat menulis nilai yang tidak diberikan sebelumnya.
Dan seseorang akan berkata: oke, oke, itu membahayakan klien enum, dan dalam database itu mengganggu lebih dari itu membantu, tetapi enum sangat bermanfaat dalam kode server. Dia tidak akan menawarkan untuk menghapus enum dari kode di server? Akan menjadi!
kode lama tidak akan bekerja dengan basis baru
Saat ini, programmer direkomendasikan tidak hanya untuk menulis kode sehingga berfungsi normal dengan database lama, tetapi juga untuk mengembangkan skema data sehingga kode yang agak ketinggalan jaman juga dapat bekerja secara normal dengannya.
Dan jika Anda menggunakan enum pada server untuk gender, maka semuanya akan berantakan lagi, hanya setelah ternyata ada yang salah dengan kode baru dan Anda harus segera memutar kembali semuanya ke versi sebelumnya, dan gender baru telah memasuki database.
Dan karena itu, enum dari kode server dengan langkah prajurit yang terukur pergi ke suatu tempat ke arah hutan terdekat, agar tidak pernah kembali dari sana, karena segala sesuatu yang dapat menghancurkan sistem pada waktu yang salah adalah jahat, dan kejahatan tidak memiliki tempat dalam kode nyaman kami.
Jadi mungkin palu pada enum dan selalu menggunakan string?
Singkatnya, seperti yang akan dikatakan Winnie the Pooh - ini adalah semacam kesalahan, dan mereka memprovokasi programmer untuk menulis kode yang salah! Dalam enum, Anda perlu meletakkan hal-hal yang benar-benar tak tergoyahkan dan mendasar yang tidak berubah selama bertahun-tahun, dan bukan jenis kelamin yang menambah dan menghilangkan setiap rilis! Setiap tugas memiliki alatnya sendiri, dan enum bukanlah alat yang perlu Anda gunakan untuk menyimpan nilai, spektrum yang mungkin terus berkembang.
Jika suatu variabel hanya dapat mengambil beberapa nilai yang diketahui sebelumnya dan segala sesuatu yang tidak termasuk dalam nilai-nilai ini harus mengarah ke kesalahan, maka menggunakan enum adalah ide yang baik, tetapi jika tidak, jika nilai-nilai yang tidak terduga secara teratur jatuh ke dalam variabel, maka gunakan enum sama dengan menembak diri sendiri di kaki, dan lebih baik tidak melakukan ini, kecuali jika Anda, tentu saja, seorang masokis.
Situasi khusus ini menarik karena tidak ada yang meramalkan penambahan nilai baru ke enum, belum lagi fakta bahwa nilai baru akan muncul secara teratur. Bagaimana kita tahu bahwa akan ada lebih dari dua jenis kelamin?
Oleh karena itu, sesuai dengan prinsip KISS, enum pada tahap pertama adalah pilihan yang baik dan benar. Pemrogram yang berpengalaman akan membuat enum dan memperbaikinya ketika nilai tambahan muncul, Anda harus segera menjalankan acara yang diperlukan agar enum menghilang dari kode.
Sayangnya, latihan menunjukkan bahwa pada kenyataannya orang lain akan terlibat dalam menambah gender baru, dan tanpa berpikir dua kali, ia akan menambahkan makna baru pada enum, dan ini akan tenang. Jadi jika ada keraguan, lebih baik mengikuti aturan sederhana: itu disimpan di suatu tempat, kecuali untuk kode - itu berarti tidak enum, dan itu intinya.
Jadi, enum tidak harus sama sekali dalam kode terkait gender?
Terlepas dari kenyataan yang baru saja saya katakan, enum dalam kode masih bisa sangat berguna, bahkan jika mereka mengandung nilai-nilai yang termasuk dalam database. Tidak hanya perlu menggunakannya untuk menyimpan nilai-nilai yang ditarik dari basis data, perlu juga membandingkan apa yang datang dari basis data dengan nilai yang diinginkan. Misalnya, ketika seorang programmer ingin menulis bahwa jika jenis kelamin karakternya GENERIC_TEEN, maka ia tidak dapat memasukkan alkohol dalam inventarisnya, Anda dapat membuat enum Gender dengan metode nilai yang mengembalikan string, dan menulis kode yang akan memeriksa apakah karakter memiliki bidang gender dan Gender.GENERIC_TEEN .value () dan ini akan bagus, karena tidak akan membiarkan programmer membuat kesalahan dalam nilai status.
Kode harus berkembang
Solusi, telah melayani kami dengan baik di beberapa titik, dapat menjadi tidak nyaman dari waktu ke waktu. Dan Anda perlu memastikan bahwa kode tersebut mencerminkan keadaan proyek saat ini, dan bukan seperangkat kruk, yang dengannya solusi dibuat pada lutut beberapa tahun yang lalu, membentang ke "di sini dan sekarang." Jika tidak, itu akan menjadi sumber habis-habisnya fakapov dan lulz untuk semua orang yang pernah ada hubungannya dengan proyek, baik itu pengembang, tester atau langsung ke konsumen.