มีคำสั่งการใช้ / นำเข้าจำนวนมากบ่งบอกถึงการออกแบบที่ไม่ดีหรือมีกลิ่นรหัสหรือไม่?


13

โดยปกติแล้วฉันเห็นข้อความสั่งจำนวนเล็กน้อยที่ด้านบนของไฟล์คลาส ตัวอย่าง:

using System.Collections.Generic;
using System.IO;
using System.Xml.Linq;

แต่ในโครงการฉันกำลังทำงานหลายต่อหลายครั้งฉันเห็นการใช้งาน / การนำเข้ามากกว่า 20 รายการในไฟล์คลาสเดียว นี่เป็นการออกแบบที่ไม่ดีหรือไม่? ดูเหมือนว่าคลาสที่ออกแบบมาเพื่อทำสิ่งหนึ่งควรพึ่งพาส่วนประกอบบางอย่างเท่านั้น


1
Visual Studio มีตัวเลือกในการลบusingข้อความที่ไม่ได้ใช้ คุณอาจต้องการดูว่ามี 20 รายการที่มีการใช้งานจริง
Dan Pichelman

@ แดน - พวกเขาทั้งหมดถูกใช้งานตามที่ฉันได้ใช้ ReSharper เพื่อกำจัดคนที่ไม่ได้ใช้
Jon Raynor

คุณได้ลองเพิ่ม IoC, แปลงเป็น constructor injection และ / หรือแปลงจุดการรวมบางส่วนเป็น lambdas แบบอินไลน์เพื่อดูว่ามันจะลดจำนวนusingงบโดยไม่ต้องเพิ่มจำนวนคลาสหรือไม่? โปรดทราบว่าการเพิ่มจำนวนคลาสหรือไฟล์ต้นฉบับจะเพิ่มค่าใช้จ่ายในการจัดการซอร์สโค้ด
ร. ว.

2
IoC เพียงซ่อนปัญหา
Telastyn

1
บางสิ่งเหล่านี้เป็นเพียงส่วนหนึ่งของภาษาและรูปแบบการเขียนโปรแกรมที่ส่งเสริมเช่น Collections.Generic และ LINQ ดังนั้นฉันจึงไม่จำเป็นต้องกังวลเกี่ยวกับสิ่งเหล่านั้น ฉันอาจจะมุ่งความสนใจไปที่คนอื่น คลาสส่วนใหญ่อาจไม่จำเป็นต้องทำ IO โดยตรงดังนั้นอาจพบว่ามีอยู่ทุกหนทุกแห่งที่มีความรับผิดชอบหรือการวางชั้นไม่ดี แต่ขึ้นอยู่กับแอปพลิเคชัน
Erik Eidt

คำตอบ:


21

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

ที่กล่าวว่ามันเป็นกลิ่น - บางครั้งก็นำคุณไปสู่สิ่งที่ไม่ดีและบางครั้งก็เป็นเพียงสัญญาณเตือนที่ผิดพลาด


ฉันคิดว่า "กลิ่นรหัส" ที่แท้จริงจะเป็นถ้า namespaces ที่นำเข้าทั้งหมดหรือส่วนใหญ่มีจุดประสงค์ที่แตกต่างกันอย่างดุเดือด ความซื่อสัตย์ฉันไม่ค่อยมีมากกว่า 6 ถึง 8 usingในไฟล์ C # ไฟล์เดียว
Greg Burghardt

2
ฉันต้องการให้ +1 ที่สองกับคุณถ้าทำได้เพียงแค่ใช้คำว่า "code ดม" อย่างถูกต้อง!
Jörg W Mittag

! @Greg - ฉันเห็นด้วยว่าโดยปกติแล้ว "การใช้งาน" จะเกี่ยวข้องกัน ฉันคิดว่าในกรณีนี้มันเป็นเรื่องที่เป็นนามธรรมเพราะประมาณ 15-20 ของ "การใช้" มาจากเนมสเปซของแอปพลิเคชันและส่วนที่เหลือจาก. NET Framework
Jon Raynor

2

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

ในแอปพลิเคชันหนึ่งฉันมีคลาสการเข้ารหัสที่มีงานเดียว: เข้ารหัสข้อมูล ระหว่างฟังก์ชันการทำงานหลักการบันทึกและการจัดการข้อยกเว้นสภาพแวดล้อมต้องใช้เนมสเปซ 11 รายการที่แตกต่างเพื่อทำงานนี้

มันยากสำหรับฉันที่จะบอกตัวเองว่า 'ลดการนำเข้า' หรือเพื่อตัดสินความสำเร็จของชั้นเรียนของฉันเพียงผู้เดียวโดยนับจำนวน namespaces ที่นำเข้า ฉันไม่สามารถใช้สิ่งนี้โดยแยกเหตุผลเพื่อบ่งชี้ถึงความสำเร็จของชั้นเรียน สำหรับฉันการนำเข้า 'เป็นวิธีการที่ชั้นเรียน' สิ้นสุด หากงานของชั้นเรียนมีการกำหนดไว้อย่างดีทุกอย่างอื่นภายในระบบสนับสนุนรวมถึงการนำเข้าจะดูแลตัวเอง

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