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


102

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

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

ฉันควรเก็บทุกอย่างไว้ในฟังก์ชั่นขนาดใหญ่ตามสไตล์ของฟังก์ชั่นที่มีอยู่หรือฉันควรสรุปแคปปลุกในฟังก์ชั่นของตัวเองหรือไม่?

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

โดยสรุปฉันกำลังเปรียบเทียบ

showAlarms(){
    // tons of code
}

ต่อต้าน

showAlarms(){
   alarm1();
   alarm2();
   return;
}

alarm1(){
    ...
    printf(...);
    return;
}

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

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


117
เป็นที่น่าสงสัยอย่างมากว่า บริษัท ที่คุณทำงานรับตำแหน่งหน้าที่ของคุณควรมีความยาว 300 บรรทัดเพราะ "นั่นคือวิธีที่เราทำมาตลอด" นั่นไม่ใช่ "การประชุมลักษณะการเข้ารหัส" มันเป็นสไตล์ที่ไม่ดี
Robert Harvey

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

17
@beginnerBinx นั่นเป็นคำพูดที่คุณคิดขึ้นมา อย่าพูดว่า "X กำลังทำอะไรที่โง่จริงๆฉันต้องทำสิ่งที่โง่เช่นนั้นด้วย" แต่เป็นสิ่งที่ชอบ "ฉันสังเกตเห็นว่า X กำลังทำสิ่งนี้อยู่มีเหตุผลบางอย่างที่ทำอย่างนั้นมันจะเป็นปัญหาไหมถ้าฉันไม่ได้ทำสิ่งเดียวกันเมื่อเขียน Y?" จากนั้นจะเป็นการตัดสินใจว่าจะทุบตีรหัสเก่าหรืออธิบายว่าทำไมพวกเขาต้องทำอย่างนั้น (ไม่ว่าจะเป็นเรื่องที่ไม่ดีหรืออย่างกระตือรือร้น)
Servy

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

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

คำตอบ:


102

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

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

lockMutex(&mutex);
int rval;
if (...)
{
    ...
    rval = foo();
}
else
{
    ...
    rval = bar();
}
unlockMutex(&mutex);
return rval;

เป็น OO สดใสและเงางาม c ++ นักพัฒนาฉันเป็นฉันทันทีเรียกว่าพวกเขาออกมาเกี่ยวกับความเสี่ยงข้อผิดพลาดที่พวกเขาได้โดยการล็อกและปลดล็อก mutexes แทนที่จะใช้RAII ฉันยืนยันว่าสิ่งนี้ดีกว่า:

MutexLocker lock(mutex);
if (...)
{
    ...
    return foo();
}
else
{
    ...
    return bar();
}

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

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

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

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


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

10
แน่นอนว่าการพูดคุยกับผู้อาวุโสนั้นดีเสมอและต้องทำการปรับโครงสร้างใหม่ด้วยความระมัดระวัง (และด้วยการทดสอบ) และแน่นอนการเห็นพ้องด้วย / mutexes เป็นสัตว์พิเศษด้วยตัวเอง แต่เมื่อเห็นฟังก์ชั่นด้วย> 300 บรรทัดฉันจะไม่ลงทุนเวลามากเกินไปในการมองหา "เหตุผลทางเทคนิคที่ซ่อนอยู่" ทำไมฟังก์ชั่นเหล่านี้ใหญ่เกินไป เหตุผลที่ฟังก์ชั่นยาวเกินไปนั้นเหมือนกันเสมอและมันไม่ได้เป็นเรื่องทางเทคนิค
Doc Brown

8
@DocBrown เพียงเพราะพวกเขาไม่ใช่ด้านเทคนิคไม่ได้หมายความว่าพวกเขาไม่ใช่เหตุผล เป็นสิ่งสำคัญสำหรับนักพัฒนาที่ต้องจำไว้ว่าพวกเขาเป็นส่วนหนึ่งของเครื่องที่มีขนาดใหญ่กว่า (ฉันไม่สามารถนับจำนวนครั้งที่ฉันต้องเรียนรู้บทเรียนนั้นใหม่อีกครั้ง)
Cort Ammon

4
@DocBrown ไม่ว่าจะด้วยวิธีใดก็เป็นนักพัฒนาอาวุโสที่ควรพูดคุยด้วย ฉันเลือกตัวอย่างที่ฉันทำเพราะมันง่ายที่จะหาข้อโต้แย้งที่นับไม่ถ้วนสำหรับเหตุผลที่รหัสโง่เป็นโง่ การหาข้อโต้แย้งว่าเพราะเหตุใดโค้ดที่ดูเหมือนโง่จริง ๆ แล้วไม่ใช่ว่าโง่
Cort Ammon

3
@DocBrown จากความคิดเห็นและคำตอบของคุณฉันคิดว่าฉันสามารถบอกได้ว่าความแตกต่างของความคิดเห็นของเราคือคุณเริ่มจากสมมติฐานที่ว่าโค้ดนั้น "แย่" อยู่บนพื้นฐานของหลักฐานที่คุณได้รับในขณะที่ฉันต้องการ ใช้เส้นทางที่สำรวจว่ารหัสนั้น "เลว" หรือไม่ก่อน
Cort Ammon

84

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

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

ภาคผนวกเนื่องจากความคิดเห็นที่: "300 บรรทัด" และ "ยากต่อการใช้" เป็นตัวบ่งชี้ที่แข็งแกร่งของ IMHO สำหรับรหัสที่ไม่ดี จากประสบการณ์ของฉันมันไม่น่าเป็นไปได้มากที่จะมี "เหตุผลทางเทคนิคที่ซ่อนอยู่" ทำไมรหัสดังกล่าวไม่สามารถนำไปใช้ในรูปแบบที่อ่านได้มากขึ้นเทียบได้กับตัวอย่างของคำตอบของ Cort Ammon อย่างไรก็ตามฉันเห็นด้วยกับ Cort คุณควรปรึกษาเรื่องนี้กับผู้รับผิดชอบในทีม - เพื่อไม่หาเหตุผลที่คลุมเครือว่าทำไมรหัสหรือสไตล์ "แบบนี้" ไม่สามารถเปลี่ยนแปลงได้ .


127
แม้แต่โปรแกรมเมอร์ผู้มีความสามารถก็สามารถก่ออาชญากรรมเหล่านี้ได้เมื่อถึงกำหนด
gardenhead

13
@gardenhead ฉันสามารถเข้าใจได้ว่าไม่ต้องปรับเปลี่ยนฟังก์ชั่น 300-line เพื่อประหยัดเวลา แต่ไม่มีวิธีที่เป็นไปได้ที่การเขียนฟังก์ชั่น 300-line จะช่วยคุณประหยัดเวลา
Dangph

39
@gardenhead: เมื่อฉันไปหาศัลยแพทย์เพราะฉันต้องการความช่วยเหลืออย่างเร่งด่วนฉันยังคงคาดหวังให้เขาใช้เวลาล้างมือก่อนที่เขาจะเริ่มแสดงกับฉัน นี่คือสิ่งที่ผู้คนจำนวนมากต้องเรียนรู้ในธุรกิจของเราเพื่อให้บรรลุความสามารถที่แท้จริง : ปล่อยรหัสไว้ในสถานะที่ดีขึ้นกว่าเดิมและสิ่งนี้จะช่วยปรับปรุงความสามารถในการกำหนดเวลา 300 บรรทัดฟังก์ชั่นการเติบโตทุกวันโดยคนที่ไม่สนใจและพวกเขามักจะใช้ "เส้นตาย" เป็นข้อแก้ตัว
Doc Brown

17
@ ห้อยมันช่วยประหยัดเวลาเมื่อคุณเพิ่มเพียง 5 บรรทัดในฟังก์ชั่นแทนการปรับโครงสร้างอีกครั้ง สิ่งเหล่านี้มักจะเพิ่มขึ้นเมื่อฟังก์ชันเริ่มต้นยาว (30+ บรรทัด) และโปรแกรมเมอร์คนต่อไปคิดว่า "นี่ไม่ใช่รหัสของฉันฉันจะไม่ refactor ไม่ให้ทำลายมันแค่เพิ่มสองสามบรรทัดตรงนี้และตรงนั้น"
Džuris

7
@Juris ตามที่ฉันเข้าใจคำถามคือเกี่ยวกับการสร้างฟังก์ชั่นใหม่ไม่ใช่การปรับโครงสร้างที่มีอยู่ หากคุณกำลังเขียนฟังก์ชั่นใหม่คุณจะไม่ประหยัดเวลาด้วยการทำให้เป็นฟังก์ชันมอนสเตอร์เดียว
Dangph

42

เลขที่

ในหนังสือเล่มนี้Programmer ศาสตร์การเจรจาเขียนเกี่ยวกับทฤษฎีหน้าต่างแตกสลาย

ทฤษฎีนี้รัฐ:

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

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

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

และคำตอบคือ: ไม่

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

และวันหนึ่งรหัสก็จะ colapse

มอบสำเนาของClean CodeและClean Coderให้กับทุกคน

และในขณะที่คุณอยู่ในหัวข้อสำเนาของTDDก็เป็นสิ่งที่ดีเช่นกัน


6
เกิดอะไรขึ้นถ้า codebase เป็นเรือนกระจกที่ไม่มีอะไรนอกจากหน้าต่างแตก
Alan Shutko

8
@AlanShutko จากนั้นตรวจสอบให้แน่ใจว่าประวัติการทำงานของคุณเป็นปัจจุบันหรือไม่ หานายจ้างที่แตกต่างกันในขณะนี้
David Montgomery

12
รหัสไม่ค่อย "ยุบ" การเพิ่มคุณสมบัติใหม่ใช้เวลามากขึ้นและยากขึ้นและการประเมินการล้างรหัสจะเพิ่มขึ้นซึ่งหมายความว่ายิ่งยากขึ้นที่จะได้รับงบประมาณในการทำความสะอาดที่จำเป็น
Doc Brown

8
ว้าวสิ่งที่คล้ายคลึงกับทฤษฎี "หน้าต่างแตก" โดยพลการดูเหมือนว่าจะเป็น
Samthere

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

25

ใช่ไปเลย โครงสร้าง! = สไตล์

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

ระวัง

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

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

สุภาพอ่อนโยน

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


"พยายามที่จะยึดติดกับกระแสที่จะเข้าท่ากับคนที่คุ้นเคยกับรูปแบบเก่า ๆ " - ดังนั้นคำแนะนำของคุณในการเขียนโปรแกรมในลักษณะเดียวกับตัวตลกที่ไร้ความสามารถทำอะไรมาก่อนหรือไม่? การเพิ่มฟังก์ชั่น 300 บรรทัดนั้นไม่ใช่เรื่องง่าย
BЈовић

11
ฉันไม่ได้บอกว่าติดอยู่กับกระแสที่คล้ายกัน ฉันพูดติดกับกระแสที่พวกเขาจะเข้าใจ
John Wu

2
คำปรึกษาที่ดี. เมื่อฉัน refactored คำสั่งเดียวเป็น 5 ฟังก์ชั่นในคำตอบนี้ฉันเปลี่ยนความหมายอย่างละเอียดโดยค่าการคำนวณล่วงหน้าภายในการแสดงออกทางตรรกะซึ่ง แต่เดิมถูกคำนวณตามเงื่อนไขเท่านั้น ผู้ตรวจสอบจับได้ว่า ;-) คำแนะนำที่จริงจังคือการตรวจสอบและทดสอบอย่างละเอียด การเปลี่ยนแปลงแต่ละครั้งสามารถแนะนำข้อผิดพลาดและนั่นอาจเป็นเหตุผลหลักที่ไม่มีใครทำเลย
Peter A. Schneider

6

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


1
" ไม่มีเหตุผลมันเป็นเพียงนโยบายของเรา "

5

คำตอบคือในการตรวจสอบรหัส

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

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

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

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

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

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


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

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

บางครั้งแยกฟังก์ชั่นขนาดใหญ่ (และการตั้งชื่อสิ่งที่ดีกว่าและเพิ่มความคิดเห็นและเอกสารตามที่ผมคิดออกเป็นขั้นตอนแรกที่จำเป็นก่อนที่จะ savely mqking เปลี่ยนแปลง.
JDługosz

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

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

3

บางครั้งคุณต้องไปกับกระแส

อย่างที่คุณบอกว่าคุณได้รับมอบหมายให้ใช้งานฟังก์ชั่นใน codebase ที่ใช้งานอยู่

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

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

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


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

5
OP ได้รับการขอให้เขียนฟังก์ชั่นที่ไม่ได้แก้ไขโค้ดหลายร้อยบรรทัด
meda

2
@meda แน่นอน! ฉันอยู่ในสถานการณ์เดียวกันมาก ฉันกำลังพัฒนาโมดูลใหม่สำหรับอินทราเน็ตของ บริษัท และฉันกำลังค้นหาสิ่งที่อาจอธิบายได้ว่าเป็น "ปีแห่งการเพิกเฉยเกินกว่าซ่อม" ด้วยซอฟต์แวร์เซิร์ฟเวอร์และไลบรารีที่ไม่ได้รับการปรับปรุงเลยตั้งแต่ปี 2549 ฉันไม่ควรทำความสะอาดระเบียบนี้ แต่ฉันต้องใช้รหัสนานขึ้นเนื่องจากข้อ จำกัด (ลองนึกภาพ MySQl 5.2, MySQL 5.0) ฉันไม่สามารถอัปเดตอะไรก็ได้เพราะอาจเป็นไปได้ว่ารหัสที่มีอยู่จะไม่ทำงานในเวอร์ชันที่ใหม่กว่าเนื่องจากรหัสที่เลิกใช้แล้ว
roetnig

3
"ถ้ามันไม่พังอย่าซ่อมเลย" ฉันมีรถยนต์อายุ 20 ปีที่รั่วน้ำมันเล็กน้อย คุ้มค่ากับการใช้เงินหรือไม่ ไม่น่าเชื่อถือ ใช่.

3

ก่อนที่จะแถลงว่าการปฏิบัติไม่ดีฉันจะเริ่มขั้นตอนต่อไปเพื่อทำความเข้าใจเหตุผลของวิธีการขนาดใหญ่และการปฏิบัติอื่น ๆ ที่อาจพบว่าไม่ดี

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

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

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


ฉันไม่ได้เปลี่ยนรหัสปัจจุบันฉันแค่เขียนฟังก์ชั่นใหม่ไม่แน่ใจว่าฉันควรทำตาม 'การประชุม' และโค้ดในความแปลกประหลาดบรรทัดที่มากกว่า 300+ หรือแบ่งมันเป็นชิ้นตรรกะเช่นปกติฉันจะทำ แต่มี ไม่ได้ทำในส่วนนี้ของรหัสฐาน
Justin

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

3

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

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

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

มีทางเดียวเท่านั้นที่จะหา ถาม

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


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

1

มี "สไตล์" ในระดับต่าง ๆ

ในระดับหนึ่งมักจะเป็นส่วนหนึ่งของการประชุมรหัสซึ่งหมายความว่าจะใส่ช่องว่างสีขาวบรรทัดว่างวงเล็บและวิธีการตั้งชื่อสิ่งต่าง ๆ (กรณีผสม, ขีดล่าง, ฯลฯ .. )

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

จากนั้นก็มีห้องสมุดและกรอบงานที่โครงการใช้อยู่

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

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

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

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