Saya bertugas menulis ulang beberapa kode VB lama. Saya mengerti cara kerjanya, tetapi saya merasa ada cara yang jauh lebih efisien untuk melakukan apa yang mereka lakukan. Aku hanya tidak tahu apa itu. Berikut adalah contoh yang dibuat bahwa dalam hal persyaratan data benar-benar mirip dengan apa yang perlu saya lakukan.
Pengguna harus memilih pabrikan, membuat, model dan warna mobil mereka dalam GUI. Saya memiliki file teks besar yang terlihat seperti ini:
Ford Truck F150 red
Ford Truck F150 blue
Ford Truck F150 black
Ford Truck F150 silver
Ford Truck F250 red
Ford Truck F250 green
Ford Sedan Taurus red
Ford Sedan Taurus green
Ford Sedan Taurus white
Ford...
...
Subaru SUV Forester blue
Subaru SUV Forester red
Subaru SUV Outback Black
Subaru SUV Outback Green
Subaru SUV Outback Blue
Subaru SUV Outback Red
Subaru...
...
etc.
Jadi jika pilihan pertama adalah Subaru, kotak kedua (make) seharusnya tidak memiliki pilihan untuk memilih Truk karena tidak ada Subarus adalah truk. Demikian pula, jika mereka memilih Ford, Sedan dan Taurus, maka kotak terakhir (warna) tidak akan menunjukkan opsi untuk memilih biru. Atau Hitam. Atau apapun selain merah, hijau atau putih.
Orang-orang yang menulis kode sebelum saya membuat ini (dalam python-y psuedocode):
def getValidOptions():
items = []
for i from 0 to numRows:
options = getLine().split()
if selectingManufacturer:
if options[0] not in items:
items.append(options[0])
else if selectingMake:
if selectedManufacturer == options[0] and options[1] not in items:
items.append(options[1])
else if selectingModel:
if selectedManufacturer == options[0] and selectedMake == options[1] and options[2] not in items:
items.append(options[2])
else if selectingColor:
if selectedManufacturer == options[0] and selectedMake == options[1] and selectedModel == options[2] and options[3] not in items:
items.append(options[3])
return items
Saya pikir itu hanya mengerikan, baik pada level algoritma, dan pada level sintaksis. Untuk satu, itu mem-parsing seluruh file, ketika itu hanya perlu membaca beberapa baris jika dilakukan dengan benar. Untuk membuat ini lebih tidak efisien, data asli saya memiliki 6 opsi untuk dipilih, bukan hanya 4. Ini juga menyimpan lebih banyak data maka perlu, mengingat jumlah duplikasi data.
Saya mencari cara berbeda untuk menyimpan data dalam file, atau cara parsing yang berbeda untuk membuat getValidOptions
fungsi keduanya lebih cantik dan lebih efisien. Apakah ada cara saya bisa melakukan ini?
Jawaban:
Semua jawaban lain yang saya baca tampaknya mengabaikan dua aturan dasar pengembangan perangkat lunak:
mengklarifikasi persyaratan terlebih dahulu (terutama persyaratan kinerja dan penyimpanan)
Keep It Simple, Stupid (lihat KISS )
Anda menulis "file teks besar", tetapi tidak menulis terlalu besar, jadi saya berasumsi sebenarnya tidak ada yang salah dengan ukurannya kecuali firasat Anda. Jadi, jika memuat file sebenarnya tidak terlalu lama, dan departemen TI Anda atau orang lain tidak mengeluh tentang ruang disk yang terbuang, dan tidak ada yang mengeluh memiliki masalah dalam mempertahankan file, biarkan format file apa adanya - jangan meremehkan nilai kesederhanaan.
Anda juga mengeluh tentang efisiensi algoritme, yang sebenarnya tidak seefisien mungkin, tetapi ia memiliki satu keuntungan yang sangat besar: sederhana dan bekerja dengan sangat sederhana. Jadi selama itu cukup efisien, jangan menerapkan optimasi prematur.
Jadi mari kita asumsikan program bekerja cukup cepat, apa yang harus Anda tanyakan pertama adalah bagaimana Anda dapat meningkatkan kode dalam hal kesederhanaan dan prinsip KERING? Dan itu memang titik yang harus ditingkatkan, karena kode saat ini tidak KERING. Dalam contoh Anda, muncul empat kali pengujian blok kode yang hampir sama jika opsi pada "tingkat yang lebih tinggi" cocok dengan baris saat ini, yang menghasilkan empat kali panggilan "tambahkan" yang sama (dalam kode Anda yang sebenarnya, pengulangan terjadi setidaknya enam kali, seperti yang Anda tulis). Anda dapat dengan mudah menghindari itu dengan memperkenalkan tingkat pemilihan numerik, atau melewati opsi yang sudah dipilih dalam daftar yang dipesan. Menggunakan pseudo-code Anda, ini mengarah ke sesuatu di sepanjang baris
Jadi ini pada dasarnya adalah algoritma yang sama tanpa kode yang diulang lagi.
Karena jelas
getValidOptions
harus dipanggil lebih dari sekali (setidaknya sekali per level), saya sarankan untuk menerapkan hanya satu optimasi (jika ini belum terjadi): pastikangetLine
fungsi menarik datanya dari memori utama, dan tidak baca file dari disk lagi dan lagi.sumber
Nah, data yang Anda miliki memiliki struktur seperti pohon, di mana untuk setiap produsen Anda memiliki pohon model, dan untuk setiap model Anda memiliki warna (dan sebagainya).
Jadi, Anda dapat memisahkan proses data ini dengan dua langkah:
Struktur pohon dapat diimplementasikan dengan apa yang disebut hash , array asosiatif atau kamus dalam bahasa seperti Java, PHP, Javascript atau Python. Dengan struktur ini, Anda memiliki:
Tergantung pada bahasa pemrograman Anda, ini dapat diimplementasikan lebih cepat atau lebih lambat. Sebagai contoh:
Runtime.Serialization.Formatters.Binary.BinaryFormatter
bisa bermanfaat, tapi saya bukan ahli dalam membuat cerita bersambung dengan VB.Net.Class
yang mengimplementasikan antarmukajava.io.Serializable
.Referensi :
1: https://dvanderboom.wordpress.com/2008/03/15/treet-implementing-a-non-binary-tree-in-c/
- Penjelasan lengkap tentang penerapan pohon di C #.
- Cari komentar di mana seseorang bertanya tentang cerita bersambung objek itu, dan jawaban untuk komentar itu.
sumber
tree with an arbitrary number of nodes
implementasi.Salah satu cara sederhana untuk menyimpan data adalah dengan memasukkannya ke dalam database SQLite. SQLite, tidak seperti kebanyakan database SQL, sangat cocok untuk digunakan sebagai format file aplikasi. Pendekatan ini memiliki beberapa manfaat:
select distinct model where manufacturer='ford' and color = 'red'
).Ini memaksa Anda untuk belajar SQL, tetapi menghindari kebutuhan untuk mempelajari format file khusus.
sumber
Saya berasumsi Anda dapat mengakses baris secara acak dalam file, dan dengan demikian dapat memperlakukan file sebagai array catatan. Jika Anda tidak dapat mengakses jalur secara acak, maka algoritma yang Anda miliki adalah yang terbaik yang dapat Anda lakukan.
Untuk akses tercepat, simpan data dalam 6 file, di mana setiap file diindeks ke file berikutnya.
Ada banyak cara untuk membuat indeks flatfile. Saya biasanya menggunakan rentang subskrip. Saat pengguna membuat setiap pilihan, gunakan rentang untuk membatasi pembacaan file selanjutnya.
Inilah cara saya membuat indeks untuk data sampel yang Anda berikan.
Tentu saja file tersebut harus disortir. Saya sudah menghitung garis untuk ilustrasi; nomor baris tidak boleh muncul dalam file.
Untuk membuat indeks pertama, buat catatan untuk setiap kombinasi unik dari tiga bidang pertama dalam file. Di setiap catatan, simpan nomor baris pertama dan terakhir tempat kombinasi itu muncul.
Indeks kedua dibangun dengan cara yang sama, menggunakan dua bidang pertama dari indeks pertama.
Dan yang ketiga, level teratas dalam hal ini, indeks.
Saya pikir saya terlalu menjelaskan konsep, tetapi secara umum Anda membuat indeks dengan menjatuhkan bidang terakhir dan menghilangkan duplikat catatan.
Anda selanjutnya dapat mengurangi persyaratan penyimpanan file dengan menghilangkan beberapa data yang berlebihan.
Misalnya, subskrip "pertama" dalam setiap catatan indeks selalu lebih dari subskrip "terakhir" dari catatan sebelumnya, atau nol jika tidak ada catatan sebelumnya. Jadi, Anda tidak perlu menyimpan subskrip "pertama". Saya meninggalkan mereka di tempat di bawah untuk ilustrasi.
Juga, karena Anda hanya akan menggunakan bidang terakhir di setiap catatan untuk mengisi daftar pilihan, Anda tidak perlu menyimpan bidang lainnya.
Penyajian minimum kaskade indeks berakhir tampak seperti ini, di mana tanda centang 'menunjukkan angka yang sebenarnya tidak disimpan dalam file.
Saat Anda mengisi daftar pilihan dari indeks, Anda menggunakan subskrip "pertama" dan "terakhir" dari pilihan pengguna dalam indeks sebelumnya untuk membatasi baris yang dibaca.
Contoh:
Anda mengisi daftar pilihan pertama dari semua
file0.dat
. (Ford, Subaru)Pengguna memilih "Ford". Subskrip yang sesuai adalah 0 dan 1.
Anda mengisi daftar pilihan kedua dari baris 0 hingga 1 dari
file1.dat
. (Truk, Sedan)Pengguna memilih "Sedan". Subskrip yang sesuai adalah 2 dan 2.
Seperti yang Anda lihat, pada saat pengguna telah memilih, misalnya, "Ford" "Sedan" "Taurus" Anda akan menemukan bahwa Anda hanya perlu membaca baris 6 sampai 8
file3.dat
untuk mengisi daftar pilihan keempat.Saya minta maaf untuk deskripsi yang agak panjang tapi ini sudah sangat terlambat dan saya tidak punya waktu untuk menulis yang singkat.
TAMBAH: Dipikirkan lebih lanjut, file dapat digabung menjadi satu.
Ini digunakan persis seperti versi banyak file, kecuali Anda memerlukan baris dummy pertama untuk berisi rentang subskrip pertama.
sumber