มันเป็น "ผิด" / การออกแบบที่ไม่ดีที่จะนำคนงานกระทู้ / พื้นหลังในชั้นเรียนหรือไม่?


15

ฉันมีชั้นเรียนที่จะอ่านจาก Excel (C # และ. Net 4) และในชั้นเรียนนั้นฉันมีผู้ทำงานเบื้องหลังที่จะโหลดข้อมูลจาก Excel ในขณะที่ UI สามารถตอบสนองได้ คำถามของฉันมีดังต่อไปนี้: การออกแบบที่ไม่ดีที่จะมีคนทำงานเบื้องหลังในชั้นเรียนหรือไม่? ฉันควรสร้างชั้นเรียนโดยไม่มีมันและใช้ผู้ทำงานเบื้องหลังเพื่อทำงานในชั้นเรียนนั้นหรือไม่? ฉันไม่เห็นปัญหาใด ๆ ในการสร้างชั้นเรียนของฉันด้วยวิธีนี้ แต่จากนั้นอีกครั้งฉันเป็นมือใหม่ดังนั้นฉันจึงคิดว่าฉันจะทำให้แน่ใจก่อนที่ฉันจะดำเนินการต่อ

ฉันหวังว่าคำถามนี้เกี่ยวข้องกับที่นี่เพราะฉันไม่คิดว่ามันควรจะเป็นแบบ stackoverflow เนื่องจากรหัสของฉันทำงานได้นี่เป็นเพียงปัญหาการออกแบบ


3
ทำไมคุณคิดว่ามันผิด
Alb

1
@Alb - มันยากที่จะพูด รหัสของฉันทำงานและเติมเต็มความต้องการของฉันอย่างไรก็ตามฉันวางแผนที่จะใช้สิ่งนี้ในโครงการที่ฉันจะทำโอเพนซอร์ส ฉันต้องการให้แน่ใจว่ารหัสของฉันไม่ได้ "แค่ทำงาน" และได้รับการออกแบบมาอย่างดี
Jetti

คำตอบ:


21

ฉันควรสร้างชั้นเรียนโดยไม่มีมันและใช้ผู้ทำงานเบื้องหลังเพื่อทำงานในชั้นเรียนนั้นหรือไม่?

ใช่คุณควรจะ. และฉันจะบอกคุณว่าทำไม - คุณกำลังละเมิดSingle รับผิดชอบหลักการ ด้วยการเชื่อมโยงคลาสที่เข้าถึง excel doc อย่างแน่นหนาด้วยวิธีการเข้าถึง excel doc คุณจะกำจัดความสามารถในการ "ควบคุม" รหัส (รหัสใด ๆ ที่ใช้สิ่งนี้) เพื่อทำวิธีอื่น แตกต่างกันคุณอาจถาม? จะเกิดอะไรขึ้นถ้ารหัสคอนโทรลเลอร์มีสองการดำเนินการที่ใช้เวลานาน แต่ต้องการให้มันเป็นลำดับ? หากคุณอนุญาตให้คอนโทรลเลอร์มีความสามารถในการจัดการเธรดสามารถทำงานทั้งสองอย่างร่วมกันในเธรดเดียว ถ้าคุณต้องการเข้าถึง excel excel จากบริบทที่ไม่ใช่ UI และไม่ต้องการให้มีเธรด

โดยการย้ายความรับผิดชอบในการเธรดออกไปยังผู้เรียกคุณอนุญาตให้มีความยืดหยุ่นของโค้ดมากขึ้นทำให้สามารถนำมาใช้ซ้ำได้มากขึ้น


2
+1 สำหรับการตอบคำถามจริงที่ถามและตอบคำถามได้ดี
Adam Lear

+1 - ขอบคุณ Nemi คุณตอบคำถามของฉันในจุดที่ฉันขอบคุณมัน ฉันจะดึงมันออกจากชั้นเรียนของฉันแล้วนำไปใส่ในชั้นเรียนใหม่ขอบคุณอีกครั้ง!
Jetti

@Nemi - มันจะเป็นที่ยอมรับหรือไม่ถ้าฉันสร้างวิธีอื่นที่จะโหลดแบบซิงโครนัสแล้วมีวิธีการแบบอะซิงก์? หรือมันจะดีกว่าถ้ามีวิธีการโหลดแบบซิงโครนัสแล้วไปจากที่นั่น
Jetti

1
โดยส่วนตัวฉันจะไม่มีวิธีการซิงค์และวิธีการทำข้อมูลให้ตรงกัน คุณยังคงมีความรับผิดชอบต่อการแต่งงาน ฉันได้ทำงานกับปัญหาที่แน่นอนนี้หลายครั้ง สิ่งที่ฉันทำคือสร้าง TaskController ซึ่งจำลองมาจาก SwingWorker แต่มีรหัสเฉพาะสำหรับแอปของเรา TaskController ทำสิ่งต่าง ๆ เช่นอัปเดตแถบความคืบหน้าเปลี่ยนเคอร์เซอร์เมาส์ ฯลฯ ดูเหมือนว่ารหัสแผ่นบอยเลอร์จะต้องสร้าง TaskController เพื่อโทรออก แต่ในที่สุดรหัสก็แข็งแกร่งและบำรุงรักษาได้มากกว่า
Nemi

ขอบคุณ Nemi! ฉันหวังว่าฉันจะสามารถโหวตคุณอีกครั้งเพราะคุณตอบคำถามของฉันอย่างแน่นอนและชี้ไปในทิศทางที่ถูกต้อง ขอขอบคุณอีกครั้ง!!
Jetti

3

มันเป็นการออกแบบที่ดีที่มีการใช้งาน UI ในเธรดแยกจากงานเบื้องหลัง มิฉะนั้น UI จะไม่ตอบสนองเมื่อแอปพลิเคชันไม่ว่าง

หากคุณสามารถแยกส่วนที่ทำงานในเธรดพื้นหลังเป็นคลาสของตัวเองรหัสจะสะอาดขึ้น


1
แม้ว่าถูกต้องจากวิธีการที่ฉันอ่านคำถามของเขาเขาไม่ได้มีปัญหาในการทำความเข้าใจจุดนี้
Nemi

ฉันขอโทษถ้าคำถามของฉันถูกอ่านผิด ฉันรู้ว่าการแยก UI และงานพื้นหลังเป็นการออกแบบที่ดี (ถ้าไม่จำเป็นไฟล์ทดสอบ excel ของฉันมีมากกว่า 8k แถวและจะทำให้โปรแกรมดูไม่ตอบสนอง) คำถามของฉันนั้นเป็นสิ่งที่ดีหรือไม่ที่จะจับคู่เธรดกับคลาส Excel ให้แน่น
Jetti

0

ฉันจะแยก UI ของคุณออกจากงานเบื้องหลังโดยใช้คลาสแยก การทำเช่นนี้ส่งเสริมการแยกความกังวล ไม่ควรผสมรหัส UI และตรรกะทางธุรกิจ


เพื่อให้ชัดเจนชั้นของฉันไม่ได้สัมผัส UI มีสองเหตุการณ์ที่จะอนุญาตให้สิ่งที่ใช้อัปเดต UI หากจำเป็น แต่คลาสของฉันในตัวมันไม่ได้สัมผัส UI
Jetti

0

จากสิ่งที่ฉันจำได้เกี่ยวกับ BackgroundWorkers ก็คือพวกเขามีวิธีการเชื่อต่าง ๆ เช่นความสามารถในการส่งการอัปเดตความคืบหน้าไปยัง UI ไม่มีกฎที่บอกว่าคุณไม่สามารถใช้จากคลาสอื่นได้

นอกจากนี้หากคุณกำลังทำซ้ำโดยไม่ต้องใช้รายการที่ต้องดำเนินการตามลำดับให้พิจารณาใช้ThreadPoolแทน (หรือถ้าคุณใช้. NET 4 ให้ใช้Task Parallel Library )


ขอบคุณสำหรับคำตอบของคุณ ฉันสร้างสองเหตุการณ์ในชั้นเรียนของฉันที่จะก่อให้เกิดความคืบหน้า (โดยทั่วไปแล้วจะห่อเหตุการณ์ความคืบหน้าของ BackgroundWorker เนื่องจาก BackgroundWorker เป็นส่วนตัว) ซึ่งส่งความคืบหน้าไปยัง UI (แถบความคืบหน้า)
Jetti
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.