ทําความเข้าใจโค้ดที่จับคู่อย่างเข้มงวด
รหัสคู่ขนานเกิดขึ้นเมื่อคอมโพเนนต์จะขึ้นอยู่กับรายละเอียดการใช้งานของกันและกันมากเกินไป การขึ้นต่อกันอาจทําให้โค้ดของคุณยากขึ้นในการบํารุงรักษา มีความยืดหยุ่นน้อยลง และมีแนวโน้มที่จะเกิดข้อบกพร่องมากขึ้น โซลูชันทั่วไปคือการใช้ อินเทอร์เฟส เพื่อแยกส่วนส่วนประกอบและปรับปรุงโมดูล
ในบทบาทของคุณในฐานะนักพัฒนาซอฟต์แวร์ คุณพบกับความท้าทายของโค้ดที่ควบคู่หนาแน่นที่ซึ่งมีการขึ้นต่อกันโดยตรง คุณใช้ หลักการเปิด/ปิด เพื่อจัดการกับการแยกส่วนโค้ดของคุณสําหรับการสร้างระบบที่ดูแลรักษาไว้มากขึ้น
โค้ดคู่หนาแน่น
โค้ดที่ควบคู่กันหนาขึ้นหมายถึงสถานการณ์ที่องค์ประกอบหนึ่งขึ้นอยู่กับรายละเอียดภายในของอีกองค์ประกอบหนึ่งอย่างมาก สิ่งนี้สร้างระบบที่เข้มงวดซึ่งยากต่อการแก้ไขหรือขยายโดยไม่ทําลายฟังก์ชันการทํางานที่มีอยู่
ตัวอย่างการขึ้นต่อกันโดยตรง
พิจารณาคลาส Library ที่โต้ตอบกับ BorrowableBook ชั้นเรียนโดยตรง คลาส Library จะขึ้นอยู่กับการดําเนินการเฉพาะของ BorrowableBook เพื่อดําเนินการกู้ยืม
public class BorrowableBook
{
public string Title { get; set; }
public bool IsAvailable { get; private set; } = true;
public BorrowableBook(string title)
{
Title = title;
}
public void Borrow()
{
if (IsAvailable)
{
IsAvailable = false;
Console.WriteLine($"You have borrowed \"{Title}\".");
}
else
{
Console.WriteLine($"\"{Title}\" is already borrowed.");
}
}
}
public class Library
{
private BorrowableBook _book;
public Library(BorrowableBook book)
{
_book = book;
}
public void BorrowBook()
{
if (_book.IsAvailable)
{
_book.Borrow();
}
else
{
Console.WriteLine("The book is not available.");
}
}
}
ในโค้ดLibraryนี้ ระดับชั้นจะขึ้นอยู่กับระดับชั้นโดยตรงBorrowableBook ในขณะที่การขึ้นต่อกันทํางานสําหรับรายการที่สามารถกู้ยืมได้ชนิดเดียว แต่ก็มีปัญหาสําคัญสองประการ:
-
การขึ้นต่อกันโดยตรง: คลาส
Libraryจะควบคู่กับBorrowableBookชนิดอย่างเข้มงวด หากคุณต้องการเพิ่มรายการใหม่ที่ยืมได้ (เช่น ดีวีดี นิตยสาร) คุณจะต้องปรับเปลี่ยนLibraryชั้นเรียน - ความสามารถในการขยายที่จํากัด: การออกแบบในปัจจุบันทําให้ยากต่อการขยายฟังก์ชันการทํางานโดยไม่ต้องเปลี่ยนโค้ดที่มีอยู่
Coupling ที่หนาแน่นนี้จะฝ่าฝืนหลักการเปิด/ปิด (OCP) ซึ่งระบุว่าซอฟต์แวร์ควรเปิดสําหรับส่วนขยาย แต่ปิดเพื่อการปรับเปลี่ยน กล่าวอีกนัยหนึ่งคุณควรสามารถเพิ่มคุณลักษณะใหม่ได้โดยไม่ต้องเปลี่ยนโค้ดที่มีอยู่
ด้วยการลดการขึ้นต่อกัน คุณสามารถ:
- ปรับปรุงความสามารถในการดูแลรักษา: การเปลี่ยนแปลงในส่วนหนึ่งของระบบมีแนวโน้มที่จะส่งผลกระทบต่อผู้อื่นน้อย
- เพิ่มความยืดหยุ่น: คุณสามารถเพิ่มคุณลักษณะใหม่ได้โดยไม่ต้องปรับเปลี่ยนโค้ดที่มีอยู่
- ทําให้การทดสอบง่ายขึ้น: สามารถทดสอบส่วนประกอบได้อย่างอิสระ
หากต้องการแก้ไขปัญหานี้ คุณต้องปรับโครงสร้างโค้ดใหม่โดยใช้อินเทอร์เฟซเพื่อทําให้เป็นแบบแยกส่วนและมีความยืดหยุ่นมากขึ้น