ในฐานะที่เป็นบันทึกด้าน: ค้นหางานใหม่ อันนี้คงไม่ดีไปกว่านี้แล้ว
เป้าหมายของรหัสที่คุณกำลังตรวจสอบคือ:
เป้าหมายแรกจะได้รับการตรวจสอบโดยการตรวจสอบว่าหน่วยการรวมระบบและการทดสอบการทำงานอยู่ที่นี่ว่าพวกเขามีความเกี่ยวข้องและพวกเขาครอบคลุมทุกสถานการณ์ที่จะต้องมีการทดสอบ คุณต้องตรวจสอบความเชื่อที่ผู้เขียนต้นฉบับอาจมีเกี่ยวกับภาษาการเขียนโปรแกรมซึ่งอาจนำไปสู่ข้อบกพร่องที่ละเอียดอ่อนหรือรหัสที่อ้างว่าทำสิ่งที่แตกต่างจากสิ่งที่มันทำจริง
เป้าหมายที่สองคือคำถามที่คุณมุ่งเน้น ในอีกด้านหนึ่งรหัสใหม่ไม่คาดว่าจะเพิ่มหนี้ทางเทคนิค ในทางตรงกันข้ามขอบเขตของการตรวจสอบเป็นรหัสตัวเอง แต่ในบริบทของ codebase ทั้งหมด ในฐานะผู้วิจารณ์คุณสามารถคาดหวังได้สองวิธีจากผู้เขียนต้นฉบับ
รหัสภายนอกไม่ใช่ความผิดของฉัน ฉันเพิ่งใช้คุณสมบัติและไม่สนใจ codebase ทั้งหมด
ในมุมมองนี้รหัสจะคัดลอกข้อบกพร่องของ codebase และเพิ่มหนี้ทางเทคนิคอย่างหลีกเลี่ยงไม่ได้: รหัสที่แย่กว่านั้นแย่กว่าเสมอ
แม้ว่าวิธีนี้จะเป็นวิธีการระยะสั้นที่ถูกต้อง แต่ในระยะยาวมันจะส่งผลให้เกิดความล่าช้าและเพิ่มผลผลิตต่ำและในที่สุดก็นำไปสู่กระบวนการพัฒนาที่มีราคาแพงและมีความเสี่ยงสูงจนผลิตภัณฑ์จะหยุดพัฒนา
การเขียนรหัสใหม่เป็นโอกาสที่จะสร้างมรดกหนึ่งขึ้นมาใหม่
ในมุมมองนี้ผลกระทบของข้อบกพร่องของรหัสดั้งเดิมที่มีต่อรหัสใหม่อาจถูก จำกัด นอกจากนี้หนี้ทางเทคนิคอาจลดลงหรืออย่างน้อยก็ไม่เพิ่มขึ้นตามสัดส่วนของการเติบโตของรหัส
แม้ว่านี่จะเป็นแนวทางระยะยาวที่ถูกต้อง แต่ก็มีความเสี่ยงระยะสั้น สิ่งสำคัญคือระยะสั้นบางครั้งจะใช้เวลามากกว่าในการจัดส่งคุณลักษณะเฉพาะ สิ่งสำคัญอีกประการหนึ่งคือหากรหัสดั้งเดิมไม่ได้รับการทดสอบการเปลี่ยนใหม่จะทำให้เกิดความเสี่ยงสูงในการแนะนำการถดถอย
ขึ้นอยู่กับมุมมองที่คุณต้องการสนับสนุนคุณอาจโน้มน้าวให้คำแนะนำแก่ผู้ตรวจสอบเพื่อ refactor มากขึ้นหรือไม่ ในทุกกรณีอย่าคาดหวังว่าโค้ดที่สมบูรณ์แบบไร้ที่ติด้วยสถาปัตยกรรมที่ดีและการออกแบบภายในโค้ดเบสที่เส็งเคร็ง สิ่งที่คุณไม่ควรส่งเสริมคือพฤติกรรมที่นักพัฒนาที่มีความรู้ซึ่งต้องทำงานกับ codebase ที่เส็งเคร็งพยายามทำส่วนของเขาให้ดี แทนที่จะทำให้สิ่งต่าง ๆ ง่ายขึ้นเพียง แต่ทำให้พวกมันซับซ้อนขึ้นก่อนหน้านี้ ตอนนี้แทนที่จะเป็นรหัสที่ไม่ดีเท่ากันคุณมีส่วนหนึ่งที่มีรูปแบบการออกแบบอีกส่วนหนึ่งที่มีรหัสที่สะอาดและชัดเจนอีกส่วนหนึ่งที่ได้รับการปรับปรุงใหม่อย่างกว้างขวางเมื่อเวลาผ่านไปและไม่มีความสามัคคีใด ๆ
ลองจินตนาการถึงตัวอย่างเช่นคุณกำลังค้นพบ codebase ดั้งเดิมของเว็บไซต์ขนาดกลาง คุณประหลาดใจกับการขาดโครงสร้างตามปกติและความจริงที่ว่าเมื่อทำการบันทึกเสร็จแล้วจะทำโดยการต่อท้ายสิ่งต่างๆเข้ากับไฟล์ข้อความด้วยมือแทนที่จะใช้เฟรมเวิร์กการบันทึก คุณตัดสินใจให้ฟีเจอร์ใหม่ใช้ MVC และเฟรมเวิร์กการบันทึก
เพื่อนร่วมงานของคุณกำลังใช้งานฟีเจอร์อื่นและรู้สึกประหลาดใจอย่างมากกับการขาด ORM ที่จะทำให้ขนาดสมบูรณ์แบบ ดังนั้นเขาจึงเริ่มใช้ ORM
ไม่ว่าคุณหรือเพื่อนร่วมงานของคุณจะไม่สามารถผ่านบรรทัดหลายแสนบรรทัดเพื่อใช้ประโยชน์จาก MVC หรือกรอบการบันทึกหรือ ORM ได้ทุกที่ ที่จริงแล้วมันต้องใช้เวลาหลายเดือนในการทำงาน: ลองนึกภาพแนะนำ MVC; ใช้เวลานานเท่าไหร่ หรือสิ่งที่เกี่ยวกับ ORM ในสถานการณ์ที่แบบสอบถาม SQL ถูกสร้างขึ้นอย่างโกลาหลผ่านการต่อข้อมูล (พร้อมตำแหน่งสำหรับการฉีด SQL) ในโค้ดที่ไม่มีใครสามารถเข้าใจได้
คุณคิดว่าคุณทำได้ดีมาก แต่ตอนนี้ผู้พัฒนาใหม่ที่เข้าร่วมโครงการต้องเผชิญกับความซับซ้อนมากกว่าเดิม:
ในโครงการหนึ่งที่ฉันทำงานอยู่มีเฟรมเวิร์กการบันทึกสี่รายการ (!) ที่ใช้ควบคู่กัน (บวกกับการบันทึกด้วยตนเอง) เหตุผลก็คือทุกครั้งที่มีคนต้องการบันทึกสิ่งที่ไม่มีวิธีการทั่วไปที่จะทำดังนั้นแทนที่จะเรียนรู้กรอบใหม่ (ซึ่งในทุกกรณีถูกใช้เพียง 5% ของ codebase) หนึ่งจะเพิ่มอีกหนึ่งเขา รู้อยู่แล้ว ลองนึกภาพความยุ่งเหยิง
วิธีที่ดีกว่าคือการปรับโครงสร้างโค้ดเบสทีละขั้นตอน การทำตัวอย่างของการบันทึกอีกครั้งการเปลี่ยนโครงสร้างจะประกอบด้วยขั้นตอนเล็ก ๆ ต่อไปนี้:
ค้นหาสถานที่ทั้งหมดที่มีการบันทึกแบบดั้งเดิม (เช่นเมื่อเข้าถึงไฟล์บันทึกโดยตรง) และตรวจสอบให้แน่ใจว่าพวกเขาทั้งหมดเรียกวิธีการเดียวกัน
ย้ายรหัสนี้ไปยังไลบรารีเฉพาะถ้ามี ฉันไม่ต้องการตรรกะการจัดเก็บบันทึกในชั้นเรียนรถเข็น
ปรับเปลี่ยนอินเตอร์เฟสของวิธีการบันทึกหากจำเป็น ตัวอย่างเช่นเราสามารถเพิ่มระดับที่ระบุว่าข้อความนั้นไม่เป็นทางการหรือเป็นคำเตือนหรือข้อผิดพลาด
ใช้วิธีการปรับโครงสร้างใหม่ในคุณสมบัติใหม่
โอนย้ายไปยังเฟรมเวิร์กการบันทึก: โค้ดที่ได้รับผลกระทบเท่านั้นคือโค้ดภายในไลบรารีเฉพาะ