Saya memiliki kelas yang akan membaca dari Excel (C # dan .Net 4) dan di kelas itu saya memiliki pekerja latar belakang yang akan memuat data dari Excel sementara UI dapat tetap responsif. Pertanyaan saya adalah sebagai berikut: Apakah desain yang buruk memiliki pekerja latar belakang di suatu kelas? Haruskah saya membuat kelas saya tanpa itu dan menggunakan pekerja latar belakang untuk beroperasi di kelas itu? Saya tidak bisa melihat masalah apa pun tentang membuat kelas saya dengan cara ini, tetapi sekali lagi saya seorang pemula jadi saya pikir saya akan memastikan sebelum melanjutkan.
Saya harap pertanyaan ini relevan di sini karena saya tidak berpikir itu harus di stackoverflow karena kode saya berfungsi, ini hanya masalah desain.
c#
design
multithreading
class-design
Jetti
sumber
sumber
Jawaban:
Ya kamu harus. Dan saya akan memberi tahu Anda alasannya - Anda melanggar Prinsip Tanggung Jawab Tunggal . Dengan secara ketat menghubungkan kelas yang mengakses dokumen excel dengan cara mengakses dokumen excel, Anda menghilangkan kemampuan kode "controller" (kode apa pun yang menggunakan ini) untuk melakukannya dengan cara yang berbeda. Seberapa berbeda, Anda mungkin bertanya? Bagaimana jika kode pengontrol memiliki dua operasi yang memakan waktu lama tetapi menginginkannya berurutan? Jika Anda mengizinkan pengontrol untuk menangani threading, pengontrol dapat melakukan kedua tugas yang sudah berjalan lama dalam satu utas. Bagaimana jika Anda ingin mengakses dokumen excel dari konteks non-UI dan tidak perlu di-threaded?
Dengan memindahkan tanggung jawab untuk mengirim keluar ke pemanggil, Anda memungkinkan lebih banyak fleksibilitas kode Anda, membuatnya lebih dapat digunakan kembali.
sumber
Desain yang bagus agar operasi UI beroperasi di utas terpisah dari tugas latar belakang. Kalau tidak, UI menjadi tidak responsif ketika aplikasi sedang sibuk.
Jika Anda dapat memisahkan bagian yang berfungsi di utas latar belakang ke kelasnya sendiri, kodenya akan lebih bersih.
sumber
Saya akan memisahkan UI Anda dari tugas latar belakang Anda menggunakan kelas yang terpisah. Melakukannya mendorong pemisahan kekhawatiran. Kode UI dan logika bisnis tidak boleh dicampur.
sumber
Dari apa yang saya ingat tentang BackgroundWorkers adalah bahwa mereka menyediakan sejumlah metode kenyamanan seperti kemampuan untuk mengirim pembaruan kemajuan ke UI. Tidak ada aturan yang mengatakan Anda tidak dapat menggunakannya dari kelas yang berbeda.
Juga jika Anda melakukan iterasi yang tidak mengharuskan item diproses dalam urutan tertentu, pertimbangkan untuk menggunakan ThreadPool sebagai gantinya (atau jika Anda menggunakan .NET 4 gunakan Pustaka Paralel Tugas ).
sumber