Bir İplik / Arkaplan İşçisini Sınıfa Koymak “Yanlış” / Kötü Tasarım mı?


15

Ben Excel (C # ve .Net 4) okuyacak bir sınıf var ve bu sınıfta UI duyarlı kalabilir süre Excel'den veri yükleyecek bir arka plan işçi var. Sorum şu: Bir sınıfta arka plan çalışanı olması kötü bir tasarım mı? Sınıfımı onsuz oluşturmalı ve bu sınıfta çalışmak için bir arka plan çalışanı kullanmalı mıyım? Sınıfımı bu şekilde oluşturmanın herhangi bir sorununu göremiyorum ama yine de bir acemi oldum, bu yüzden devam etmeden önce emin olacağımı düşündüm.

Bu kod burada alakalı umarım benim kod çalışır gibi stackoverflow olması gerektiğini düşünmüyorum, bu sadece bir tasarım sorunu.


3
neden yanlış olabileceğini düşünüyorsun?
Alb

1
@Alb - söylemek zor. Kodum çalışıyor ve ihtiyaçlarımı karşılıyor, ancak ben bunu açık kaynak yapacağım bir projede kullanmayı planlıyorum. Kodumun sadece çalışmadığından ve aslında iyi tasarlanmış olduğundan emin olmak istiyorum.
Jetti

Yanıtlar:


21

Sınıfımı onsuz oluşturmalı ve bu sınıfta çalışmak için bir arka plan çalışanı kullanmalı mıyım?

Evet yapmalısın. Ve size nedenini anlatacağım - Tek Sorumluluk İlkesini ihlal ediyorsunuz . Excel belgesine erişen sınıfı, Excel belgesine nasıl eriştiğiyle sıkıca eşleştirerek, "denetleyici" kodunun (bunu kullanan herhangi bir kod) farklı bir şekilde yapma yeteneğini ortadan kaldırmış olursunuz. Ne kadar farklı, sorabilirsiniz? Denetleyici kodunun uzun zaman alan ancak sıralı olmasını isteyen iki işlemi varsa ne olur? Denetleyiciye iş parçacığının işlenmesine izin verdiyseniz, uzun süren görevleri tek bir iş parçacığında birlikte yapabilir. Excel belgesine UI olmayan bir bağlamdan erişmek istiyorsanız ve iş parçacığının işlenmesine gerek yoksa ne olur?

İş parçacığına iplik geçirme sorumluluğunu taşıyarak, kodunuzun daha fazla esnekliğine izin vererek kodu yeniden kullanılabilir hale getirebilirsiniz.


2
Sorulan asıl soruyu yanıtlayıp iyi yanıtladığınız için +1.
Adam Lear

+1 - Teşekkürler Nemi. Sorularıma cevap verdiniz, çok memnun oldum. Bunu sınıfımdan çıkaracağım ve yeni bir sınıfa koyacağım, tekrar teşekkürler!
Jetti

@Nemi - Bu nedenle, eşzamanlı bir yük olacak ve daha sonra zaman uyumsuz bir yöntem olurdu başka bir yöntem oluşturduysanız kabul edilebilir olurdu? Yoksa tek bir eşzamanlı yükleme yöntemine sahip olmak ve oradan gitmek daha iyi olur mu?
Jetti

1
Şahsen bir senkronizasyon yöntemi ve bir zaman uyumsuz yöntem olmazdı. Hala sorumlulukları birleştiriyorsunuz. Bu sorunla birçok kez çalıştım. Ne yaptım SwingWorker sonra modellenen, ancak bizim app için belirli bir kod vardı bir TaskController oluşturuldu. TaskController, ilerleme çubuğunu güncelleme, fare imlecini değiştirme, vb. Gibi şeyler yaptı. Arama yapmak için her zaman bir TaskController oluşturmak zorunda olan kazan plakası kodu gibi görünebilir, ancak sonuçta kod daha sağlam ve daha sürdürülebilir.
Nemi

Teşekkürler Nemi! Keşke seni tekrar değerlendirebilsem çünkü sorumu kesinlikle cevapladın ve beni doğru yöne doğrulttun. Tekrar teşekkürler!!
Jetti

3

Kullanıcı arabirimi işlemlerinin arka plan görevlerinden ayrı bir iş parçacığında çalışması iyi bir tasarımdır. Aksi takdirde, uygulama meşgulken kullanıcı arayüzü yanıt vermez.

Arka plan iş parçacığında çalışan parçayı kendi sınıfına ayırabiliyorsanız, kod daha temiz olacaktır.


1
Doğru olmasına rağmen, sorusunu nasıl okuduğumdan bu noktayı anlamakta bir sorunu yok.
Nemi

Sorum yanlış yazılmışsa özür dilerim. UI ve arka plan görevlerini ayırmanın iyi bir tasarım olduğunu biliyorum (gerekli değilse, test excel dosyası 8k satırın üzerinde ve programın tepkisiz görünmesini sağlar). Benim sorum temelde Excel sınıfı ile sıkıca birleştirmek iyi olmasıdır.
Jetti

0

Kullanıcı arayüzünüzü ayrı sınıflar kullanarak arka plan görevinizden ayırırdım. Bunu yapmak endişelerin ayrılmasını teşvik eder. UI kodu ve iş mantığı karıştırılmamalıdır.


Açıkçası, sınıfım kullanıcı arayüzüne dokunmuyor. Gerekirse, kullanıcı arayüzünü güncellemek için kullandığı her şeye izin verecek iki olay vardır, ancak sınıfım kendi içinde kullanıcı arayüzüne dokunmaz.
Jetti

0

BackgroundWorkers hakkında hatırladığım kadarıyla, kullanıcı arayüzüne ilerleme güncellemeleri gönderme yeteneği gibi bir takım convienence yöntemleri sağlamalarıdır. Yine de farklı bir sınıftan kullanamayacağınızı söyleyen bir kural yok.

Ayrıca, öğelerin belirli bir sırada işlenmesini gerektirmeyen yineleme yapıyorsanız, bunun yerine ThreadPool'u kullanmayı düşünün (veya .NET 4'teyseniz Görev Paralel Kütüphanesini kullanın ).


Yanıtınız için teşekkürler. Sınıfımda ilerlemeyi tetikleyecek iki olay oluşturdum (temelde, BackgroundWorker özel olduğu için BackgroundWorker ilerleme olayını sarma) (UI'ye ilerleme durumu) (ilerleme çubuğu).
Jetti
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.