การครอบคลุมรหัสเน้นวิธีที่ไม่ได้ใช้ - ฉันควรทำอย่างไร


59

ฉันได้รับมอบหมายให้เพิ่มรหัสครอบคลุมของโครงการ Java ที่มีอยู่

ฉันสังเกตเห็นว่าเครื่องมือครอบคลุมรหัส ( EclEmma ) ได้เน้นวิธีการบางอย่างที่ไม่เคยเรียกจากที่ใดก็ได้

ปฏิกิริยาเริ่มต้นของฉันคือไม่เขียนการทดสอบหน่วยสำหรับวิธีการเหล่านี้ แต่เพื่อเน้นพวกเขาไปยังผู้จัดการสายงาน / ทีมของฉันและถามว่าทำไมฟังก์ชันเหล่านี้ถึงเริ่มต้นด้วย

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


1
ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
maple_shaft

คำตอบ:


119
  1. ลบ.
  2. ผูกมัด
  3. ลืม.

เหตุผล:

  1. รหัสที่ตายแล้วจะตาย โดยคำอธิบายมากมันไม่มีวัตถุประสงค์ อาจมีจุดประสงค์ในจุดหนึ่ง แต่มันหายไปแล้วดังนั้นรหัสควรจะหายไป
  2. การควบคุมเวอร์ชันทำให้แน่ใจได้ว่าในเหตุการณ์ที่ไม่ซ้ำกัน(ในประสบการณ์ของฉัน) ที่หายากที่มีคนมาหาทีหลังว่าสามารถเรียกคืนรหัสได้
  3. ในฐานะที่เป็นผลข้างเคียงคุณจะสามารถปรับปรุงการครอบคลุมโค้ดได้ทันทีโดยไม่ต้องทำอะไรเลย (เว้นแต่ว่าทดสอบรหัสที่ตายแล้วซึ่งไม่ค่อยเกิดขึ้น)

Caveat จากความคิดเห็น: คำตอบเดิมสันนิษฐานว่าคุณได้ตรวจสอบอย่างละเอียดว่ารหัสนั้นเป็นที่แน่นอนว่าตายแล้ว IDEs นั้นผิดพลาดได้และมีหลายวิธีที่รหัสที่ดูไม่ดีอาจถูกเรียกใช้ เอาผู้เชี่ยวชาญมาด้วยถ้าคุณไม่แน่ใจจริงๆ


118
โดยทั่วไปฉันจะเห็นด้วยกับวิธีการนี้ แต่ถ้าคุณยังใหม่กับโครงการและ / หรือนักพัฒนารุ่นน้องให้ถามที่ปรึกษาของคุณ / ดีกว่าก่อนที่จะลบ ขึ้นอยู่กับโครงการวิธีการบางอย่างอาจดูไม่ได้ใช้ แต่ถูกเรียก / ใช้โดยรหัสภายนอกที่ไม่ได้อยู่ในรหัสโครงการที่คุณสามารถเข้าถึงได้ อาจเป็นรหัสที่สร้างอัตโนมัติเพื่อให้การลบของคุณไม่ประสบความสำเร็จนอกจากสัญญาณรบกวนประวัติ IDE ของคุณอาจไม่สามารถค้นหาการเข้าถึงที่สะท้อนจากภายในโครงการ หน้าอื่น ๆ หากคุณไม่แน่ใจเกี่ยวกับมุมคดีดังกล่าวอย่างน้อยให้ถามอีกครั้ง
Frank Hopkins

11
แม้ว่าฉันจะเห็นด้วยกับแก่นแท้ของคำตอบนี้คำถามที่แท้จริงคือ"ฉันควรถามว่าทำไมพวกเขาถึงอยู่ที่นั่น" . คำตอบนี้อาจสร้างความประทับใจแก่ผู้ปฏิบัติการไม่ควรถามทีมก่อนที่จะลบ
Doc Brown

58
ฉันจะเพิ่มขั้นตอนก่อน - ตรวจสอบบันทึกการตำหนิ git สำหรับบรรทัดรหัสที่ไม่ได้ใช้ หากคุณสามารถค้นหาคนที่เขียนพวกเขาคุณสามารถถามสิ่งที่พวกเขากำลังหา หากบรรทัดเป็นของใหม่มีโอกาสที่ดีที่ใครบางคนกำลังวางแผนที่จะใช้พวกเขาในไม่ช้า (ซึ่งในกรณีนี้พวกเขาน่าจะได้รับการทดสอบจากหน่วย)
bdsl

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

11
@Emory วิธีที่ดีที่สุดในการเริ่มทีมใหม่คือการทำลายสิ่งก่อสร้างด้วยการลบสิ่งต่าง ๆ โดยไม่ตั้งใจเพราะคุณคิดว่าไม่มีใครต้องการมัน รับประกันว่าคุณจะได้รับความนิยมจากวันที่ 1 แน่นอนว่ามันอาจจะไม่จำเป็น (เพราะทุกที่มีขนาดใหญ่, การประยุกต์ใช้เก่ามักจะมีความคุ้มครอง 100% รหัสไอ ) แต่ที่ผลตอบแทนการลงทุนที่ดีมาก
Voo

55

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

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

ในกรณีนี้มีความเป็นไปได้สี่ประการ:

  • หากวิธีการนั้นเป็นแบบส่วนตัวหรือแบบส่วนตัวก็สามารถลบออกได้อย่างปลอดภัย
  • หากวิธีการนั้นเป็นแบบสาธารณะการมีอยู่ของพวกเขาอาจเป็นธรรมแม้จะไม่มีการใช้งานจริงก็ตามเพื่อความสมบูรณ์ของคุณลักษณะ พวกเขาควรจะทดสอบว่า
  • หากวิธีการนั้นเป็นแบบสาธารณะและไม่จำเป็นการลบออกจะเป็นการเปลี่ยนแปลงที่ไม่สมบูรณ์และหากไลบรารีทำตามการกำหนดเวอร์ชันแบบ semanticจะอนุญาตเฉพาะในเวอร์ชันหลักใหม่เท่านั้น
  • หรือมิฉะนั้นวิธีการสาธารณะยังสามารถเลิกใช้และลบออกได้ในภายหลัง สิ่งนี้ให้เวลาสำหรับผู้บริโภค API ในการเปลี่ยนผ่านจากฟังก์ชั่นที่เลิกใช้ก่อนที่พวกเขาจะถูกลบออกในเวอร์ชันหลักถัดไป

9
นอกจากนี้หากเป็นห้องสมุดจะมีฟังก์ชั่นเพื่อความครบถ้วนสมบูรณ์
PlasmaHH

คุณสามารถอธิบายรายละเอียดเกี่ยวกับวิธีการทดสอบได้อย่างไร ถ้าคุณไม่รู้ว่าทำไมถึงมีวิธีนั้นคุณอาจไม่รู้ว่ามันควรจะทำยังไง
TKK

ชื่อวิธีเช่นfilter_name_exists, ReloadSettingsหรือaddToSchema(สุ่มเลือกจาก 3 โดยพลการโครงการโอเพ่นซอร์ส) ควรให้คำแนะนำบางสิ่งที่วิธีการที่ควรจะทำ ความคิดเห็น javadoc อาจมีประโยชน์มากยิ่งขึ้น ไม่ใช่สเปคที่เหมาะสมฉันรู้ แต่อาจเพียงพอที่จะสร้างการทดสอบบางอย่างที่อาจป้องกันการถดถอยอย่างน้อย
Zoltan

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

31

ก่อนอื่นตรวจสอบว่าเครื่องมือครอบคลุมรหัสของคุณถูกต้อง

ฉันเคยมีสถานการณ์ที่พวกเขาไม่ได้เลือกวิธีการที่ถูกเรียกผ่านการอ้างอิงไปยังอินเทอร์เฟซหรือถ้ามีการโหลดคลาสแบบไดนามิกที่ไหนสักแห่ง


ขอบคุณจะทำ บน Eclipse ฉันค้นหาด้วยโค้ด - เบสสำหรับฟังก์ชั่นและไม่มีอะไรเกิดขึ้น หากคุณมีข้อเสนอแนะอื่น ๆ ของวิธีการค้นหาที่ครอบคลุมมากขึ้นฉันจะขอบคุณมากที่สุด
ลูคัส T

3
ใช่คุณควรตรวจสอบโครงการอื่น ๆ ซึ่งอาจนำเข้าชั้นเรียนเป็น dll
Ewan

7
คำตอบนี้รู้สึกไม่สมบูรณ์ "ตรวจสอบก่อนว่าเครื่องมือครอบคลุมรหัสของคุณถูกต้องถ้าเป็นเช่นนั้น .... [ใส่คำตอบที่เหลือ] " OP ต้องการทราบว่าต้องทำอย่างไรหากเครื่องมือครอบคลุมรหัสถูกต้อง
Jon Bentley

1
@ jonbentley OP ขอวิธีที่ดีที่สุดในการรายงานเครื่องมือ "ตรวจสอบด้วยตนเอง" เพราะมันค่อนข้างชัดเจนจากบริบทที่ไม่ถูกต้อง
Ewan

15

เนื่องจาก Java นั้นรวบรวมแบบสแตติกจึงค่อนข้างปลอดภัยที่จะลบเมธอด การลบรหัสที่ตายแล้วจะดีเสมอ มีความน่าจะเป็นบางอย่างที่มีระบบการสะท้อนแสงแบบบ้าๆซึ่งทำงานในรันไทม์ดังนั้นให้ตรวจสอบกับผู้พัฒนารายอื่นก่อนเป็นอันดับแรก


9
+1 สำหรับการตรวจสอบกับผู้คนมันเป็นไปตามหลักการประหลาดใจน้อยที่สุด คุณไม่ต้องการให้ใครบางคนใช้เวลามากเกินไปในการมองหาวิธีที่เพิ่งทำไปก่อนหน้านี้ นอกจากนี้ในบางกรณีรหัสที่ตายแล้วอาจเป็นสิ่งใหม่ที่ถูกเช็คอินแล้ว แต่ยังไม่ได้ต่อสายใด ๆ (แต่ในกรณีนี้ควรมีการบันทึกไว้อย่างดีพร้อมความคิดเห็นและทดสอบแล้ว)
Frax

4
ดีถ้ารหัสใช้การสะท้อนที่จะเรียกวิธีการ "ไม่ได้ใช้" แต่ในกรณีที่คุณมีปัญหาที่ใหญ่กว่าและเราหวังว่าจะเห็นรหัสที่ thefailywft.com (ทำการทดสอบอย่างรวดเร็วเพื่อดูว่ารหัสใด ๆ ทำ ClassName class)
MTilsted

2
มันถูกรวบรวมแบบคงที่ แต่ก็มีinvokedynamicคำสั่งด้วยดังนั้นคุณรู้ไหม ...
corsiKa

@Milsted: มีกรอบหลายอย่างที่จะเรียกรหัสโดยใช้สตริง - ฉันสามารถคิดอย่างน้อยฤดูใบไม้ผลิและไฮเบอร์เนตจากด้านบนของหัวของฉัน
jhominal

9

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

การลบรหัสเป็นสิ่งที่ดี

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

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

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

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

หากโครงการของคุณเป็นใบไม้ในกราฟการพึ่งพาดังนั้นกรณีของการคัดค้านจะลดลง หากโปรเจ็กต์ของคุณเป็นไลบรารี่ดังนั้นเคสสำหรับการคัดค้านจะแข็งแกร่งขึ้น

หาก บริษัท ของคุณใช้mono-repo การลบจะมีความเสี่ยงต่ำกว่าในกรณีที่มีหลาย repo

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

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

คำถามว่าทำไมพวกเขาถึงอยู่ที่นั่น?

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

คุณสามารถใช้สิ่งที่คล้ายกับระเบียนการตัดสินใจทางสถาปัตยกรรมเป็นวิธีในการจับตำนานด้วยซอร์สโค้ด


9

เครื่องมือครอบคลุมรหัสไม่ได้รู้ทุกเรื่อง เพียงเพราะเครื่องมือของคุณอ้างว่าไม่มีการเรียกวิธีการนั่นไม่ได้หมายความว่าจะไม่ถูกเรียก มีเงาสะท้อนและขึ้นอยู่กับภาษาอาจมีวิธีอื่นในการเรียกใช้วิธีการ ใน C หรือ C ++ อาจมีมาโครที่สร้างชื่อฟังก์ชันหรือเมธอดและเครื่องมืออาจไม่เห็นการโทร ดังนั้นขั้นตอนแรกจะเป็น: ทำการค้นหาข้อความสำหรับชื่อวิธีการและชื่อที่เกี่ยวข้อง ถามเพื่อนร่วมงานที่มีประสบการณ์ คุณอาจพบว่ามีการใช้งานจริง

หากคุณไม่แน่ใจให้ใส่ assert () ที่จุดเริ่มต้นของแต่ละวิธีที่ "ไม่ได้ใช้" บางทีมันอาจถูกเรียก หรือคำสั่งบันทึก

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

บางทีรหัสนั้นมีค่าจริงตอนที่ 2: รหัสอาจทำการทดสอบรันไทม์ที่มีราคาแพงมากซึ่งจะสามารถค้นหาสิ่งที่ผิดพลาดได้ รหัสจะเปิดใช้งานเฉพาะเมื่อมีสิ่งผิดปกติเกิดขึ้นจริง คุณอาจลบเครื่องมือแก้ไขข้อบกพร่องที่มีค่า

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


ฉันไม่เห็นด้วยอย่างเคารพเกี่ยวกับ "DELETE. COMMIT. FORGET" เป็นคำแนะนำที่แย่ที่สุด (ฉันคิดว่ามันดีที่สุด) วิธีการของคุณก็โอเค ฉันคิดว่าคำแนะนำที่แย่ที่สุดที่เป็นไปได้คือการเขียนการทดสอบหน่วยที่ใช้ "รหัสตาย" แต่ไม่มีการยืนยัน เครื่องมือครอบคลุมรหัสจะถูกหลอกให้คิดว่ามีการใช้งาน
emory

3
ไม่มีสิ่งใดในคำตอบ "ลบยอมรับได้ลืม" บอกว่าอย่าทำการตรวจสอบโค้ด เป็นไปได้อย่างสมบูรณ์ (และแนะนำให้ใช้ IMHO) เพื่อตรวจสอบรหัสหลังจากมีการยืนยันแล้ว (แต่ก่อนการปรับใช้ :-))
sleske

@sleske คุณจะตรวจสอบรหัสที่ไม่มีอีกต่อไปได้อย่างไร คำตอบนั้นไม่ได้กล่าวถึง "ทบทวน"
user949300

@ user949300: ไม่ว่าการเปลี่ยนแปลงรหัสจะต้องมีการตรวจทานหรือไม่เป็นคำถามแยกต่างหากและไม่ขึ้นอยู่กับว่าจะมีการเพิ่มเปลี่ยนหรือลบรหัสหรือไม่ (การเพิ่มรหัสอาจทำให้เกิดความเสียหายมากกว่าการลบ นอกจากนี้คำตอบ (ตอนนี้) บอกว่า "นำผู้เชี่ยวชาญมาด้วย" ซึ่งฟังดูใกล้เคียงกับการตรวจสอบโค้ด
sleske

1
@ user949300: ตามที่ "คุณจะตรวจสอบรหัสที่ไม่มีอีกต่อไปอย่างไร" - ฉันหวังว่าชัดเจน: โดยดูที่การเปลี่ยนแปลงในเครื่องมือควบคุมเวอร์ชันที่คุณเลือก คุณจะตรวจสอบการเปลี่ยนแปลงอีกครั้ง (การเปลี่ยนแปลงใด ๆ )
sleske

6

ขึ้นอยู่กับสภาพแวดล้อมที่ซอฟต์แวร์ใช้งานคุณสามารถเข้าสู่ระบบได้หากมีการเรียกใช้เมธอด หากไม่ได้รับการโทรภายในระยะเวลาที่เหมาะสมวิธีการนั้นสามารถลบออกได้อย่างปลอดภัย

นี่เป็นวิธีที่ระมัดระวังมากกว่าเพียงแค่การลบวิธีการและอาจมีประโยชน์หากคุณกำลังใช้งานในสภาพแวดล้อมที่มีข้อบกพร่องสูง

เราเข้าสู่#unreachable-codeช่องหย่อนโดยเฉพาะด้วยตัวระบุที่ไม่ซ้ำกันสำหรับผู้สมัครแต่ละคนเพื่อนำออกและมันก็พิสูจน์แล้วว่ามีประสิทธิภาพ



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