ความเข้าใจในความจำเป็นสำหรับเทมเพลตใน VB
ในโปรแกรมมิ่ง หลักการ DRY—“Don’t Repeat Yourself”—เป็นสิ่งสำคัญในการเขียนโค้ดที่สะอาด มีประสิทธิภาพ และสามารถบำรุงรักษาได้ หลักการนี้กลายเป็นสิ่งสำคัญโดยเฉพาะเมื่อทำงานกับภาษาที่เหมือนกับ Visual Basic for Applications (VBA) ซึ่งความซ้ำซ้อนเป็นเรื่องปกติเพราะการสนับสนุนเทคนิคการอ абstraction เช่น เทมเพลตใน C++ ที่มีจำกัด
หากคุณพบว่าตัวเองมีโค้ดหลายชิ้นที่ทำหน้าที่เหมือนกันในประเภทวัตถุที่แตกต่างกัน ก็ถึงเวลาที่จะพิจารณาแนวทางที่มีประสิทธิภาพมากขึ้น คำถามคือ: เราจะรวมการดำเนินการที่คล้ายกันโดยไม่ resort ไปที่โค้ดซ้ำซ้อนได้อย่างไร?
มาดูวิธีการที่คุณสามารถใช้ประโยชน์จากเทมเพลต (ในรูปแบบหนึ่ง) ภายใน VBA หรือจะดีกว่า ถ้าใช้เครื่องมือใหม่เมื่อเป็นไปได้
ปัญหา: โค้ดซ้ำซากใน VBA
พิจารณาตัวอย่างต่อไปนี้ที่เรามีโค้ดสองชิ้นที่ทำสิ่งเดียวกันสำหรับประเภทที่แตกต่างกัน:
Dim i as Obj1
Set i = RoutineThatReturnsObj1()
i.property = newvalue
Dim i as Obj2
Set i = RoutineThatReturnsObj2()
i.property = newvalue
ในกรณีนี้ชัดเจนว่าทั้งสองรูทีนทำการกำหนดค่าและการตั้งค่า property เพียงแต่อาจแตกต่างกันที่วัตถุ ประเภทต่างๆ นักพัฒนาซอฟต์แวร์ต้องการสร้างโซลูชันที่เป็นทั่วไปมากขึ้นเพื่อลดความซ้ำซ้อน
โซลูชันที่มีเจตนา
การสร้างรูทีนทั่วไป
เพื่อกำจัดโค้ดซ้ำซาก นักพัฒนาซอฟต์แวร์เสนอให้ใช้รูทีนที่สามารถจัดการทั้งสองสถานการณ์:
Sub MyRoutine(o as ObjectType, r as RoutineToInitializeObject, newvalue as value)
Dim i as o
Set i = r
i.property = newvalue
End Sub
อย่างไรก็ตาม สิ่งสำคัญที่ต้องสังเกตคือ VBA แบบเนทีฟขาดความสามารถของเทมเพลตที่ซับซ้อนได้ที่พบในภาษาที่เหมือนกับ C++ ดังนั้นการบรรลุผลที่คล้ายกันภายในข้อจำกัดของ VBA อาจเป็นเรื่องท้าทาย
ทางเลือก: การใช้ .NET กับ VBA
ในขณะที่ VBA แบบดั้งเดิมไม่สนับสนุน เจนริกหรือเทมเพลตเช่นใน C++ การเปลี่ยนไปใช้ Visual Studio Tools for Office (VSTO) เป็นทางเลือกที่มีอยู่ หากคุณพร้อมหรือสามารถปรับปรุงแนวทางของคุณ คุณสามารถใช้เจนริกใน .NET
การใช้งานเจนริก
นี่คือวิธีการที่คุณสามารถใช้เจนริกในบริบทของ .NET:
Function MyRoutine(Of O)(R As Delegate, newvalue As Object) As O
Dim i As O = CType(r.Method.Invoke(Nothing, Nothing), O)
' คุณต้องการพารามิเตอร์อีกตัวเพื่อระบุว่าใช้ property อะไร
' และจากนั้นใช้ reflection เพื่อตั้งค่าค่า'
i.property = newvalue
return i
End Function
ในตัวอย่างนี้:
- Of O แทนพารามิเตอร์ประเภทที่สามารถกำหนดได้ในระหว่างการเรียกใช้งาน
- CType ถูกใช้เพื่อแปลงค่าผลลัพธ์ของ delegate ที่ถูกเรียกใช้ให้เป็นประเภทที่ต้องการ
- เพื่อที่จะตั้งค่าค่า property จะใช้ reflection ซึ่งให้การเข้าถึงแบบไดนามิกไปยัง properties ที่กำหนดซึ่งไม่สามารถทำได้ใน VBA แบบดั้งเดิม
สรุป
ในขณะที่ VBA แบบดั้งเดิมขาดฟีเจอร์การทำ Template ที่เห็นในภาษาการเขียนโปรแกรมที่พัฒนามากขึ้นเช่น C++ วิธีการทางเลือกในการลดความซ้ำซ้อนของโค้ดก็มีอยู่ การใช้ Visual Studio Tools for Office กับ .NET คุณสามารถใช้เจนริกในการสร้างโครงสร้างโค้ดที่มีความยืดหยุ่นและนำกลับมาใช้ใหม่ได้
หากคุณพบว่าตัวเองเขียนโค้ดที่คล้ายกันบ่อยครั้งในประเภทวัตถุที่แตกต่างกันในโครงการ VBA ของคุณพิจารณาการปรับปรุงสภาพแวดล้อมการพัฒนาของคุณ การรับมือกับการเปลี่ยนแปลงเหล่านี้ไม่เพียงแต่จะเสริมความชัดเจนของโค้ดแต่ยังเหมาะสมกับแนวทางการพัฒนาซอฟต์แวร์ที่ดีที่สุดด้วย
โดยการเข้าใจข้อจำกัดและความเป็นไปได้ภายใน VB คุณสามารถเขียนโค้ดที่สะอาดขึ้น มีประสิทธิภาพมากขึ้น และปฏิบัติตามหลักการ DRY ได้อย่างมีประสิทธิภาพ