ฉันจะบอกได้อย่างไรว่าซอฟต์แวร์นั้นมีการทำงานร่วมกันสูง


16

ฉันคุ้นเคยกับคำว่า "เป็นอย่างยิ่งคู่" แต่ฉันอยากรู้ว่ามีสัญญาณ (รหัสกลิ่น) ที่สามารถระบุได้ว่าเป็นรหัสคู่ ปัจจุบันฉันทำงานกับ Java EE แต่สิ่งนี้สามารถใช้กับภาษาใดก็ได้

แก้ไข:

ในกรณีที่ใครสนใจบทความนี้ฟังดูมีประโยชน์: ในการค้นหาคุณภาพของรหัส: ระวังคู่ที่แน่นหนา! (IBM)


1
Rule of thumb: หากคุณทำการเปลี่ยนแปลงเล็กน้อยให้กดปุ่มคอมไพล์และมีเวลาเข้าห้องน้ำมันจะแน่นเกินไป
Uri

คำตอบ:


15

ตัวบ่งชี้อันดับหนึ่งของโมดูลที่มีคู่ที่ไม่ดีในความคิดของฉันคือการพึ่งพาทวิภาคี ตัวอย่างเช่นหนึ่ง Module1 เรียกบางฟังก์ชั่นใน Module2 และ Module2 เรียกบางฟังก์ชั่นใน Module1

อินเตอร์เฟสส่วนใหญ่ควรเป็นทิศทางเดียว หากโมดูลที่ถูกเรียกนั้นจำเป็นต้องส่งข้อมูลบางอย่างไปยังโมดูลการโทรที่ไม่ได้ส่งคืนเป็นส่วนหนึ่งของการโทรดังนั้นควรใช้การส่งข้อความบางประเภทหรือกลไกการทริกเกอร์เหตุการณ์เช่นคิวข้อความ เป็นการดีที่หมายเลขอ้างอิงถึงส่วนต่อประสานข้อความผ่านควรถูกส่งผ่านในระหว่างการเริ่มต้นหรือกระบวนการลงทะเบียน อินเทอร์เฟซนี้เป็นนามธรรมอย่างสมบูรณ์ในลักษณะที่โมดูลไม่สนใจจริง ๆ ว่าเหตุการณ์สำหรับ ... ดังนั้นจึงเป็น decoupled

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

เครื่องมือตัวที่สามที่จะพูดก็คือถามตัวเองว่า "ฉันสามารถดึงโมดูลนี้ออกมาและแทนที่มันได้หรือไม่โดยไม่ต้องเปลี่ยนโมดูลอื่น

นี่ไม่ใช่รายการที่ครบถ้วนสมบูรณ์ แต่เป็นสามสิ่งแรกที่ฉันถามตัวเองเมื่อออกแบบซอฟต์แวร์


2
+1 สำหรับการพึ่งพาระดับทวิภาคี พวกเขาคือหัวใจมืดมนแห่งความชั่วร้ายอันบริสุทธิ์
Adam Crossland

16

การออกแบบแบบเก่าบอกว่า "คุณสามารถสัมผัสเพื่อน ๆ ของคุณและคุณสามารถสัมผัสกับการเป็นส่วนตัวของคุณ แต่คุณไม่สามารถสัมผัสการเป็นเพื่อนของคุณได้" นั่นคือการมีเพศสัมพันธ์สั้น ๆ

สัญญาณของรหัสที่มีการเชื่อมโยงอย่างสูงรวมถึงอินเทอร์เฟซที่มีขนาดใหญ่มากซึ่งทำให้ผู้ใช้ทราบเกี่ยวกับรายละเอียดส่วนตัวของการใช้งานและวัตถุที่ดูเหมือนจะ "รู้มากเกี่ยวกับกันและกัน" มีเครื่องมือสำหรับการวิเคราะห์อัตโนมัติที่จะทำเครื่องหมายรหัสที่มีลักษณะคู่ที่แน่นสำหรับคุณ ดูhttp://www.scitools.com/features/metricsintro.phpสำหรับการสุ่ม (ฉันไม่รู้เลยว่ามันทำงานได้ดีแค่ไหนมันก็ค่อนข้างสูงในการค้นหาของ Google)


7

ลองเขียนบททดสอบหน่วยสำหรับชั้นเรียน หากคุณไม่สามารถทดสอบคลาสได้อย่างง่ายดายโดยไม่จำเป็นต้องสร้าง / จำลองการโหลดของคลาสการสนับสนุนหรือ db / ui อะไรก็ตามมันเป็นสัญญาณที่บ่งบอกว่าการมีเพศสัมพันธ์ / การพึ่งพาที่ไม่ดี

มันเป็นหนึ่งในวิธีรักษาที่ดีที่สุด แต่คุณต้องทำในระหว่างการเข้ารหัส (เช่น TDD) เพื่อให้คุณซื่อสัตย์


+1 นกโกรธที่ฉันโปรดปรานไม่สามารถยกตัวอย่างวัตถุธุรกิจด้วยตัวเองและตรวจสอบกฎทางธุรกิจทั้งหมดของมันเอง โดยทั่วไปแล้วจะเห็นกฎ "ค่าที่ต้องการ" ตัวอย่างเช่นนำมาใช้ใน UI ของไคลเอ็นต์ แต่ไม่ได้อยู่ในวัตถุนั้นเอง ไม่เป็นไรที่จะใส่ไว้ใน UI (สำหรับการพิจารณาเกี่ยวกับประสิทธิภาพสมมติว่า) แต่ต้องอยู่ในอ็อบเจกต์ธุรกิจเอง
Radarbob

6

สัญญาณที่ชัดเจนสำหรับฉันคือทุกสิ่งเป็นสาธารณะ

สัญญาณอื่น ๆ คือการละเมิดกฎหมายของ Demeter - มากเกินไปการอ้างอิงนี้ SumObj.SomeProp.SomeProp บนอินเทอร์เฟซที่ไม่คล่อง

ฉันเคยเห็นสิ่งที่ฉันตั้งแต่ขนานนามว่า "puppetmaster class" ที่สร้างแบบฟอร์มการป้อนข้อมูลแบบทันที มีการละเมิดการออกแบบซอฟต์แวร์หลายครั้งดังนั้นการมีเพศสัมพันธ์มากเกินไปจึงเป็นเรื่องที่น่ากังวลน้อยที่สุด

เมื่อดึงข้อมูลจากส่วนควบคุมที่สร้างขึ้นก็ทำเช่นนี้:

var control = activeDataEntryControl as CustomTextBox;
if (control != null)
   result = control.NestedTextBox.Text;

/* several other controls */

ว้าว. คุณสร้างมันขึ้นมาและมันไร้ค่า ??????
Michael K

มันอาจเป็นประเภทที่แตกต่างออกไป นั่นเป็นเพียงหนึ่งในหลาย ๆ วง
Austin Salonen

5

ระลอกผล

การเปลี่ยนแปลงทุกครั้งมีผลกระเพื่อมผ่านโมดูลที่เชื่อมต่อกันอย่างแน่นหนา

หลักการ "เปิด - ปิด" ถูกละเมิดเนื่องจากไม่ได้ปิดอย่างเหมาะสมและเปลี่ยนการรั่วไหล


+1 สำหรับ Ripple การทำงานกับสิ่งประหลาดประหลาดคู่กันทำให้ฉันต้องการเข้าถึง Ripple
Adam Crossland

@ Adam Crossland: ฉันไม่ได้เป็นLaphroaig Effect ที่จะทำงานได้ดี - แพงเกินไป แต่ธันเดอร์เบิร์ดเอฟเฟกต์อาจจะดี
S.Lott

3

ตรวจสอบจำนวน # include / import ฯลฯ ระหว่างคลาส / แพ็คเกจ / dlls / jars / whatnots พยายามวาดกราฟของสิ่งนี้จิตใจตนเองหรือใช้เครื่องมือบางชนิด

  • หากกราฟนั้นมีความหนาแน่น (เช่นการเชื่อมต่อจำนวนมากทั่วสถานที่) แสดงว่าระบบของคุณเป็นแบบเสาหินและเชื่อมต่อกันอย่างมาก
  • ถ้ามันถูกแบ่งออกเป็นเลเยอร์อย่างชัดเจนโดยไม่มีการเชื่อมต่อข้าม / เลเยอร์รางและการเชื่อมต่อมีน้อยคุณมีระบบแยกส่วนและแยกส่วน

0

หากคุณพบว่ามันเป็นไปไม่ได้ที่จะใช้งานฟีเจอร์นี้เพราะคุณไม่รู้ว่าจะมีความรับผิดชอบเฉพาะตรงไหนระบบของคุณก็จะถูกผนวกเข้าด้วยกันอย่างแน่นหนา


0

สำหรับสัญญาณขั้นพื้นฐานมากคุณอาจพิจารณาการค้นหาจำนวนของอินเทอร์เฟซและการใช้งานของพวกเขาระหว่างคลาสของแพคเกจที่แตกต่างกัน (โดยปกติแล้วโค้ดที่ประกอบเข้าด้วยกันอย่างหลวม ๆ ประกอบด้วยอินเทอร์เฟซ ใช้ในการจัดกลุ่มคลาสอื่น ๆ (ในโค้ดแบบหลวม - คู่การโต้ตอบจริงระหว่างคลาสที่มีงานที่แตกต่างกันจะกระทำโดยฟังก์ชันอินเทอร์เฟซหรือโดยฟังก์ชันของคลาสทั่วไป / กลุ่มการจัดกลุ่ม) หรือตัวแปรสาธารณะจำนวนภายในชั้นเรียน )


0

กลิ่นรหัสทั้งหมดค่อนข้างบ่งบอกถึงการแต่งงานกันแบบฟุ่มเฟือยในบางลักษณะ ฉันคิดว่ากลิ่นที่บ่งบอกถึงการมีเพศสัมพันธ์แม้ว่าอาจจะเป็น "ความไม่เหมาะสมที่ใกล้ชิด" (กลิ่นโปรดของฉัน)

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

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