อะไรคือวิธีที่ดีและกระชับในการอธิบายถึงอันตรายของการเขียนโปรแกรมคัดลอกแปะกับผู้ที่ไม่ใช่โปรแกรมเมอร์ [ปิด]


27

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

เพื่อชี้แจง (ตามคำตอบของ Jaroslav ด้านล่าง) - ฉันไม่ได้พูดถึงการใช้ข้อมูลโค้ดที่นี่; สิ่งที่ฉันเห็น (รบกวนบ่อย) คือการคัดลอกและวางโค้ดอันกว้างใหญ่หรือโค้ดสิบบรรทัดเพื่อรับข้อมูลผู้ใช้บางส่วน (สมบูรณ์ด้วยคิวรี SQL แบบอินไลน์) วางลงในหน้า PHP หรือ ASP.NET หลายสิบหน้า ดังนั้นซ้ำรหัสจากที่อื่นในโครงการเดียวกัน

อัปเดต: มีคำตอบที่ดีมาก ๆ อยู่ที่นี่ ฉันได้อธิบายในความคิดเห็นว่าทำไมฉันถึงเลือกคำตอบของ Scott Whitlock แต่ฉันก็อยากจะแนะนำคำตอบแบบ whatsisname อย่างมากถ้าคุณติดต่อกับลูกค้าที่คุ้นเคยกับการผลิตเลย


อืมนั่นเป็นสิ่งที่ยาก มันแปลได้ไม่ดีนักกับรถคลาสสิค / อาคาร / โรงงานเปรียบเทียบ .....
whatsisname

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

วิธีการเกี่ยวกับการเปรียบเทียบของ: รหัสการคัดลอก (ไม่ปลอดภัย, โครงสร้างไม่ดี ฯลฯ ) ที่คุณไม่เข้าใจจาก wikis, กระดานสนทนา, ฯลฯ เป็นเหมือนการเปิดไฟล์แนบอีเมล (ไวรัส, สปายแวร์, สแปม, ฯลฯ ) จาก บุคคลที่สาม?
sakisk

@faif: รหัสที่คัดลอกไม่จำเป็นต้องเป็นรหัสขยะ มันอาจเป็นรหัสที่ดีที่ผู้ชายในสำนักงานถัดจากคุณเขียน ปัญหาเกี่ยวกับโค้ดที่คัดลอกวางคือว่ามันจะกลายเป็นฝันร้ายที่ไม่สามารถจัดการได้ / การดีบักที่ไม่สามารถจัดการได้อย่างรวดเร็ว
whatsisname

1
@faif: จากนั้นจับส่วนเครื่องหมายวงเล็บไว้
whatsisname

คำตอบ:


36

มันเป็นอย่างนี้ ... คุณมีนาฬิกาหนึ่งเรือนในบ้านของคุณ ที่ดี! คุณรู้ว่าเวลามันคืออะไร แต่คุณต้องไปที่ห้องหนึ่งเพื่อดู

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

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

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

การเขียนโปรแกรมการคัดลอกวางก็เหมือนกับการซื้อนาฬิกาอิสระมากขึ้น มันไม่ได้ปรับขนาด


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

38

ลองนึกภาพคุณกำลังออกแบบเครื่องบิน คุณมีเครื่องบินไอพ่นเดี่ยว มันขายดี ตอนนี้คุณกำลังออกแบบเครื่องบินเครื่องยนต์ 4 ลำสำหรับลากยาวข้ามมหาสมุทร

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

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

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

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

อย่าทำซ้ำเครื่องยนต์เพียงแค่เขียนรหัสที่ประกอบเข้ากับเครื่องยนต์


11
ตอนนี้ลองนึกภาพว่าคุณพบว่าเอ็นจิ้นหมายเลข 4 นั้นแตกต่างจากอีกสามตัว ความแตกต่างนี้มีจุดประสงค์หรือไม่? ถูกออกแบบมาเพื่อตอบโต้ปัญหาแรงบิดที่เกิดจากการเลี้ยวซ้ายทันทีหลังจากบินขึ้น? หรือมันเป็นความผิดพลาดในการคัดลอก?
David Thornley

5
การเปรียบเทียบที่ยอดเยี่ยม ... แต่ถ้าใครบางคนมีปัญหาในการเข้าใจการคัดลอก / วางรหัส ... เครื่องยนต์ไอพ่นอาจจะยากเหมือนกัน :)
Steven Evers

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

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

7

คุณต้องอธิบายในแง่ของการแบ่งปันทรัพยากรเดียวกันกับการทำซ้ำทรัพยากรเดียวกัน

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


7

“ เฮ้ดูการผ่าตัดทั้งหมดค่อนข้าง คล้ายกันใช่มั้ยดังนั้นคุณจะไม่รังเกียจถ้าฉันคัดลอกคำสั่งการผ่าตัด สำหรับขั้นตอนที่แตกต่างจากศัลยแพทย์ที่แตกต่างกันสำหรับการผ่าตัดของคุณหรือไม่”


1
ยิ่งใหญ่ !!! การผ่าตัดจะทำด้วยมีดใช่ไหม? ให้ฉันใช้มีดเขียงเพื่อทำการผ่าตัดสมองกับคุณ
Aditya P

1
@AdityaGameProgrammer: เมื่อเครื่องมือเดียวที่คุณมีคือมีดเขียงทุกอย่างดูเหมือนแฮม
Joey Adams

6

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

ในการค้นหาความคล้ายคลึงแรกที่เราต้องพิจารณาถึงอันตรายของการคัดลอกและวางโปรแกรม :

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

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

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

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

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

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


2
ฉันชอบโมลด์โมลด์ส่วนที่เหลือฉันกลัวจะไม่ช่วยเหลือผู้ใช้ที่ไม่ใช้เทคโนโลยีมากนัก
Matthieu M.

@ Matthieu - ฉันไม่รู้ว่าคุณหมายถึงสัญลักษณ์แรกหรือไม่ แต่ฉันไม่ได้บอกว่าสิ่งเหล่านั้นเป็นแบบอะนาล็อกฉันอธิบายสิ่งที่ฉันคิดว่าเป็นกระบวนการคิดสำหรับนักพัฒนาที่จะคิดเปรียบเทียบที่ดี
Nicole

4

ฉันคิดว่าคุณกำลังพูดถึงรหัสที่ซ้ำกันไม่ใช่การคัดลอกการวาง (โดยใช้ตัวอย่างและคล้ายกัน)

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

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

มีบทความที่ยอดเยี่ยมเกี่ยวกับการคัดลอกจากเจฟฟ์ที่http://www.codinghorror.com/blog/2009/04/a-modest-proposal-for-the-copy-and-paste-school-of-code-reuse HTML

ป.ล. ฉันรู้ว่ามีสื่อสิ่งพิมพ์ก่อนกูเทนแบร์ก


2

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

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

ตัดและวาง = เผาเงิน


1

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

มีสาเหตุบางประการที่การคัดลอก / วางนำไปสู่ปัญหามันแพร่กระจายบั๊กที่มีอยู่ในพื้นที่ที่เพิ่งวางใหม่ในบางสภาพแวดล้อมที่เคยถูกพิจารณาว่าเป็นการเพิ่มประสิทธิภาพการทำงานตอนนี้ช้าลงจริง ๆ (ฉันสามารถให้ตัวอย่างถ้าใครสนใจ แต่ มันลงมาที่ JIT และคุณคิดว่าคุณฉลาดกว่าคอมไพเลอร์สมัยใหม่หรือไม่?)

มันแสดงให้เห็นว่านักพัฒนาขี้เกียจหรือเห็นแก่ตัวหรือทั้งสองอย่าง หากนี่คือการต่อสู้ที่คุณกำลังต่อสู้ในทีมในขณะนี้ขึ้นอยู่กับตำแหน่งของคุณในทีมนี้ (หัวหน้าทีม / jnr dev, snr dev, อะไรที่เคย) คุณจำเป็นต้องแก้ไขมันโดยอนุญาโตตุลาการภายในองค์กรของคุณ

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

ขั้นแรกเมื่อสร้างรหัสสำหรับบุคคลที่สามพวกเขามีตัวชี้วัดหรือไม่ Lines of Code (LoC) เป็นต้น

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

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

ความคิดเห็น: ผู้พัฒนาล้มเหลวในการแสดงความเข้าใจในสิ่งที่เป็นนามธรรมและวิธีการควบคุมการไหลของโปรแกรมมีแนวโน้มที่จะเกิดข้อผิดพลาด คุณสามารถแนะนำ "ความซับซ้อนตามวัฏจักร" ที่นี่ จริงๆแล้วมันค่อนข้างง่ายที่จะเข้าใจและในรอบเกี่ยวกับวิธีที่ฉันคิดว่าฉันอาจได้พบคำตอบ: D Yay สำหรับฉัน

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

การคัดลอกและวางโค้ดอาจจะเพิ่มความซับซ้อนตามวัฏจักรเนื่องจากจะรวมตรรกะซ้ำ ๆ ที่อาจถูกแยกออกเป็นบล็อกชื่อของตนเอง (หรือวิธีการ)

ดูเหมือนจะสมเหตุสมผลหรือไม่


เพื่อความชัดเจนนี่คือรหัสที่องค์กรอื่น ๆ เขียนขึ้นและจะถูกนำไปยังองค์กรของเราเพื่อตรวจสอบ ดังนั้นจึงไม่ใช่การต่อสู้ภายในองค์กรของฉัน แต่มีบางสิ่งที่ฉันต้องการทำให้ผู้คน (ไม่ใช่โปรแกรมเมอร์) จากองค์กรอื่นเข้าใจ
EZ Hart

มีประโยชน์ที่จะรู้และทำให้ฉันมีประโยชน์มากขึ้นหวังว่า :) ฉันจะเพิ่มการแก้ไข
Ian

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

1

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

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

นอกจากนี้ยังไม่เจ็บที่จะแสดงจริงก่อนและหลังตัวอย่างของรหัสจริงที่ได้รับการปรับโครงสร้างเพื่อลบการทำซ้ำ


ฉันขอแนะนำให้ทดสอบย่อหน้าที่สองเพื่อส่งสไตล์ Leslie Nielsen :-)
Karl Bielefeldt

1

นอกจากนี้ยังมีข้อกังวลด้านความปลอดภัยและความสมบูรณ์ของรหัส

ดังที่แสดงไว้ที่นี่เป็นไปได้ที่จะฝังข้อมูลที่เป็นอันตรายในตัวอักขระ Unicode ที่ถูกถ่ายโอนไปยังคลิปบอร์ด

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


0

มีสองเส้นทางที่แตกต่างกันที่ฉันสามารถเห็นได้ที่นี่

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

  2. ทำตามคำแนะนำอย่างสุ่มสี่สุ่มห้า - คนส่วนใหญ่อาจเคยมีประสบการณ์ต้องไปสถานที่ที่พวกเขาไม่เคยไปมาก่อน บางคนอาจใช้ MapQuest หรือ Google Maps เพื่อค้นหาสถานที่แล้วทำตามคำแนะนำ มีเรื่องราวของคนหลงทางหรือไม่พบที่ที่ควรจะเป็นแม้ว่าซอฟต์แวร์จะให้คำแนะนำเฉพาะเกี่ยวกับวิธีการเดินทาง นี่คืออันตรายใหญ่หลวงอื่น ๆ ของการคัดลอกวางคือมันเหมือนกับว่ามีคนส่งคุณทิศทางจาก A ถึง B โดยไม่แจ้งให้คุณเห็นแผนที่ของพื้นที่ที่อาจทำให้การเดินทางยากขึ้นเล็กน้อย หากไม่ยากคุณสามารถเพิ่ม ante โดยขอให้บุคคลที่จะได้รับจาก A ถึง B สวมผ้าปิดตาเพื่อให้พวกเขาต้องพึ่งพาความรู้สึกอื่น ๆ เพื่อกำหนดทิศทางที่พวกเขากำลังเผชิญและไปยังเป้าหมาย

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


0

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

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


0

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


0

แบบจำลองต้นทุน CoCoMo

http://en.wikipedia.org/wiki/COCOMO

พยายามใช้ (E) = a * (KLOC) ** b โดยที่ b> 1.0

เลขชี้กำลังนั้นหมายถึงความพยายามในการสร้าง / ดูแล / สนับสนุน / เขียนใหม่เติบโตเร็วกว่าจำนวนบรรทัดของรหัส


0

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


0

การคัดลอกและวางโค้ดที่ฉันเห็นคือสิ่งที่นักพัฒนาซอฟต์แวร์ไม่เข้าใจหรือต้องการหาเหตุผลว่าพวกเขากำลังทำอะไรและคัดลอกส่วนต่าง ๆ ที่รวมกันแล้วทำสิ่งที่พวกเขาต้องการ "มากหรือน้อย" ที่พวกเขาต้องการ เพื่อให้เข้ากัน

มีสามปัญหาที่สำคัญที่:

  1. มันไม่เคยส่งผลในรหัสปราศจากข้อผิดพลาด เคย
  2. หากพวกเขาไม่เข้าใจรหัสในขณะที่เขียนพวกเขาไม่สามารถคิดออกได้ในขณะที่การแก้จุดบกพร่อง มีเพียงคนอื่นเท่านั้นที่สามารถทำความสะอาดความยุ่งเหยิงที่เกิดขึ้นได้
  3. หากพวกเขาหลีกเลี่ยงการคิดเกี่ยวกับรหัสที่พวกเขากำลังเขียนอยู่ หากพวกเขาหลีกเลี่ยงการเรียนรู้พวกเขาจะไม่เป็นโปรแกรมเมอร์ที่ดี หากพวกเขาไม่เคยเป็นโปรแกรมเมอร์ที่ดีทำไมพวกเขาอยู่ในทีมของคุณ?

0

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

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