Saya harus merancang dan membuat skrip impor (dalam C #) yang dapat menangani hal berikut:
- membaca data dari berbagai sumber (XML, XSLX, CSV)
- Memverifikasi data
- tulis data ke berbagai jenis objek (pelanggan, alamat)
Data akan berasal dari sejumlah sumber tetapi sumber akan selalu memiliki satu format impor (baik csv, xml, xslx). Format impor dapat bervariasi dari sumber ke sumber. Format impor baru dapat ditambahkan di masa mendatang. Jenis objek tujuan selalu sama (pelanggan, alamat, dan beberapa lainnya).
Saya sudah berpikir tentang menggunakan obat generik dan saya membaca sesuatu tentang pola pabrik tetapi saya seorang noob yang cukup besar di bidang ini sehingga saran apa pun lebih dari sambutan.
Apa pola desain yang tepat untuk mengatasi masalah ini?
c#
design-patterns
jao
sumber
sumber
Jawaban:
Anda akan berlebihan dengan konsep mewah terlalu cepat. Generik - ketika Anda melihat kasing menggunakannya, tetapi sebaliknya jangan khawatir. Pola pabrik - terlalu banyak fleksibilitas (dan menambahkan kebingungan) untuk ini.
Tetap sederhana. Gunakan praktik mendasar.
Coba bayangkan hal-hal umum antara melakukan membaca untuk XML, membaca untuk CSV apa pun. Hal-hal seperti, catatan berikutnya, baris berikutnya. Karena format baru dapat ditambahkan, coba bayangkan kesamaan bahwa format yang akan ditentukan dengan yang dikenal. Gunakan kesamaan ini dan tentukan 'antarmuka' atau kontrak yang harus dipatuhi semua format. Meskipun mereka berpegang pada landasan bersama, mereka semua mungkin memiliki aturan internal khusus mereka.
Untuk memvalidasi data, cobalah memberikan cara untuk dengan mudah memasukkan blok kode validator baru atau berbeda. Jadi sekali lagi, cobalah untuk mendefinisikan antarmuka di mana setiap validator, yang bertanggung jawab untuk jenis konstruksi data tertentu mematuhi kontrak.
Untuk membuat konstruksi data Anda mungkin akan dibatasi oleh siapa pun yang mendesain objek output yang disarankan lebih dari apa pun. Cobalah untuk mencari tahu apa langkah selanjutnya untuk objek data, dan apakah ada optimasi yang dapat Anda lakukan dengan mengetahui penggunaan akhir. Misalnya jika Anda tahu objek akan digunakan dalam aplikasi interaktif, Anda dapat membantu pengembang aplikasi itu dengan memberikan 'penjumlahan' atau jumlah objek atau jenis informasi turunan lainnya.
Saya akan mengatakan sebagian besar adalah pola Templat atau pola Strategi. Seluruh proyek akan menjadi pola Adaptor.
sumber
Yang jelas adalah menerapkan pola Strategi . Memiliki kelas dasar generik
ReadStrategy
dan untuk setiap format input seperti subkelasXmlReadStrategy
,CSVReadStrategy
dll. Ini akan memungkinkan Anda untuk mengubah pemrosesan impor secara independen dari pemrosesan verifikasi dan pemrosesan keluaran.Bergantung pada perinciannya, dimungkinkan juga untuk menjaga sebagian besar impor generik dan hanya menukar bagian dari pemrosesan input (misalnya, membaca satu catatan). Ini dapat mengarahkan Anda ke pola Metode Templat .
sumber
Pola yang sesuai untuk utilitas impor yang mungkin perlu Anda perluas di masa depan adalah dengan menggunakan MEF - Anda dapat menjaga agar penggunaan memori tetap rendah dengan memuat konverter yang Anda perlukan dengan cepat dari daftar malas, buat impor MEF yang dihiasi dengan atribut. yang membantu memilih konverter yang tepat untuk impor yang Anda coba lakukan dan menyediakan cara mudah untuk memisahkan kelas impor yang berbeda.
Setiap bagian MEF dapat dibangun untuk memenuhi antarmuka pengimporan dengan beberapa metode standar yang mengubah satu baris file impor ke data output Anda atau mengganti kelas dasar dengan fungsionalitas dasar.
MEF adalah kerangka kerja untuk membuat arsitektur plug-in - bagaimana pandangan dan Visual Studio dibangun, semua ekstensi yang indah di VS adalah bagian-bagian MEF.
Untuk membangun aplikasi MEF (Managed Extensability Framework), mulailah dengan menyertakan referensi
System.ComponentModel.Composition
Tentukan antarmuka untuk menentukan apa yang akan dilakukan konverter
Ini dapat digunakan untuk semua jenis file yang ingin Anda impor.
Tambahkan atribut ke kelas baru yang menentukan kelas apa yang akan "Ekspor"
Ini akan menentukan kelas yang akan mengimpor file CSV (dari format tertentu: Format1) dan memiliki atribut khusus yang menetapkan MEF Export Attribute Metadata. Anda akan mengulangi ini untuk setiap format atau jenis file yang ingin Anda impor. Anda dapat mengatur atribut khusus dengan kelas seperti:
Untuk benar-benar menggunakan pengonversi MEF Anda perlu mengimpor bagian MEF yang Anda buat ketika kode konversi dijalankan:
catalog
mengumpulkan bagian-bagian dari folder, defaultnya adalah lokasi aplikasi.converters
adalah daftar malas bagian-bagian MEF yang diimporKemudian ketika Anda tahu jenis file yang ingin Anda konversi (
importFileType
danimportType
) dapatkan konverter dari daftar bagian yang diimporconverters
Panggilan ke
converter.ImportData
akan menggunakan kode di kelas yang diimpor.Mungkin tampak seperti banyak kode dan butuh beberapa saat untuk memahami apa yang terjadi tetapi sangat fleksibel ketika harus menambahkan jenis konverter baru dan bahkan dapat memungkinkan Anda untuk menambahkan yang baru saat runtime.
sumber
-1
dari saya karena ide yang mendasarinya masih masuk akal dan bergantung pada pola strategi yang diatur olehIImportConverter
antarmuka.C # idiom melibatkan penggunaan kerangka kerja serialisasi bawaan untuk melakukan ini. Anda membubuhi keterangan objek dengan metadata, dan kemudian instantiate berbagai serializer yang menggunakan anotasi tersebut untuk merobek data untuk dimasukkan ke dalam formulir yang tepat, atau sebaliknya.
Bentuk Xml, JSON, dan biner adalah yang paling umum, tetapi saya tidak akan terkejut jika yang lain sudah ada dalam bentuk kemasan yang bagus untuk Anda konsumsi.
sumber