ความเข้าใจในความจำเป็นสำหรับเทมเพลตใน 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 ได้อย่างมีประสิทธิภาพ