วัตถุประสงค์ของโครงการนี้คือเพื่อวิเคราะห์ข้อมูลหุ้นของบริษัทพลังงานสีเขียวในปี 2560 และ 2561 เราคำนวณทั้งผลรวมของปริมาณรายวันทั้งหมดในแต่ละปีและผลตอบแทนรายปีสำหรับสัญลักษณ์ย่อแต่ละตัว
โดยรวมแล้ว หุ้นพลังงานสีเขียวเหล่านี้มีผลการดำเนินงานดีขึ้นมากในปี 2560 มากกว่าปี 2561 ยกเว้น TerraForm Power (สัญลักษณ์ย่อ TERP) ดังที่คุณเห็นจากข้อมูลด้านล่าง
Scrip ที่ปรับโครงสร้างใหม่รันรูทีนย่อยใน 0.55 วินาทีและ 0.57 วินาทีสำหรับปี 2017 และ 2018 ตามลำดับ นี่เป็นการปรับปรุงเล็กน้อยใน 0.64 วินาทีและ 0.67 วินาทีสำหรับสคริปต์ต้นฉบับ ตามภาพหน้าจอด้านล่าง
ความแตกต่างที่สำคัญในสองวิธีที่ใช้ในการสร้างข้อมูลเดียวกันคือวิธีการจัดเก็บข้อมูล ในรูทีนย่อยดั้งเดิม เซลล์ในเวิร์กชีทจะได้รับการอัปเดตด้วยการวนซ้ำแต่ละครั้งของ for loop ซึ่งคล้ายกับโค้ดด้านล่างนี้
For i in tickers
...
Worksheets("AllStocksAnalysis").Activate
Cells(4 + i, 1).Value = ticker
Cells(4 + i, 2).Value = totalVolume
Cells(4 + i, 3).Value = endingPrice / startingPrice - 1
...
End i
สคริปต์สำหรับวิธีการปรับโครงสร้างใหม่จะเก็บข้อมูลเอาท์พุตของลูปไว้ในอาร์เรย์ข้อมูลสามชุด ซึ่งจากนั้นจะใช้เพื่ออัปเดตเวิร์กชีตด้วยข้อมูลหลังจากที่ลูปการรับข้อมูลทำงาน คล้ายกับโค้ดด้านล่าง
Dim tickerVolumes(12) As Long
Dim tickerStartingPrices(12) As Single
Dim tickerEndingPrices(12) As Single
...
'For loops populating arrays
...
For i = 0 To 11
Worksheets("All Stocks Analysis").Activate
Cells(4 + i, 1).Value = tickers(i)
Cells(4 + i, 2).Value = tickerVolumes(i)
Cells(4 + i, 3).Value = tickerEndingPrices(i) / tickerStartingPrices(i) - 1
End i
การจัดการนี้อาจดูเล็กน้อย แต่ก็ลดเวลาการทำงานลงประมาณหนึ่งในสิบของวินาทีสำหรับแต่ละรูทีนย่อย
โค้ดการปรับโครงสร้างใหม่อาจมีข้อดีหรือข้อเสียขึ้นอยู่กับสถานการณ์ ไม่ว่าในกรณีใด หากโค้ดต้นฉบับไม่ได้รับการแสดงความคิดเห็นเพียงพอ หรือจุดประสงค์ของโค้ดคือสิ่งที่เราไม่คุ้นเคยอย่างใกล้ชิด มันอาจจะยากมากที่จะปรับโครงสร้างใหม่ เนื่องจากเราอาจไม่มีความรู้เพียงพอเกี่ยวกับวิธีการเขียนโค้ดหรือวัตถุประสงค์ ของรหัส
หากโค้ดไม่ได้รับการแสดงความคิดเห็นเพียงพอ อาจเป็นเรื่องยากมากที่จะเข้าใจวัตถุประสงค์ของแต่ละคำสั่งและฟังก์ชัน นี่จะทำให้โค้ดรีแฟคเตอร์ได้ยาก
หากจุดประสงค์ของโค้ดคือสิ่งที่เราไม่คุ้นเคย เป็นเรื่องยากที่จะปรับโครงสร้างโค้ดใหม่โดยไม่รู้ว่าเป้าหมายสุดท้ายคืออะไร ยกตัวอย่างการจำลองทางไฟฟ้าพลศาสตร์ของอนุภาคนาโนกึ่งตัวนำที่เป็นโลหะโดยใช้ทฤษฎีมิเอะแบบหลายอนุภาคทั่วไป เห็นปัญหาหรือไม่? ไม่ว่าโค้ดดัดแปลงจะเก่งแค่ไหนก็ตาม วิชานี้ต้องการความรู้ขั้นสูงเกี่ยวกับไฟฟ้าไดนามิกส์และสมการเชิงอนุพันธ์ย่อยขั้นสูง
นอกจากนี้ โค้ดการปรับโครงสร้างใหม่อาจต้องทำงานหนักมากแต่ได้ผลตอบแทนเพียงเล็กน้อย ยกตัวอย่างการวิเคราะห์หุ้นของเราด้วย VBA หากชุดข้อมูลที่หนึ่งกำลังทำงานอยู่นั้นยังคงอยู่ในลำดับความสำคัญที่เราจัดการที่นี่ การปรับโค้ดใหม่เพื่อให้ทำงานเร็วขึ้น 0.1 วินาทีอาจไม่ใช่สิ่งที่เราสนใจ อย่างไรก็ตาม หากเราต้องวิเคราะห์ภาคส่วนที่ใหญ่กว่าของหุ้น ประสิทธิภาพของตลาดหรือกองทุนเฮดจ์ฟันด์ การปรับเครื่องมือใหม่นี้อาจมีคุณค่าอย่างยิ่งเมื่อโค้ดเริ่มใช้เวลาดำเนินการสามสิบนาทีขึ้นไป
โค้ดการรีแฟคเตอร์ก็มีข้อดีหลายประการเช่นกัน โดยทั่วไป โค้ดการปรับโครงสร้างใหม่มักจะทำให้โค้ดดูสวยงาม มีประสิทธิภาพ และบางครั้งก็เข้าใจได้ง่ายขึ้นด้วยซ้ำ
หากใครสามารถจัดการโค้ดเพื่อให้บรรลุเป้าหมายเดียวกันโดยใช้บรรทัดน้อยลงและมีฟังก์ชันที่ทรงพลังมากขึ้น โดยทั่วไปโค้ดก็จะเข้าใจง่ายกว่าและมีแนวโน้มที่จะดำเนินการเร็วขึ้นเช่นกัน
นอกจากนี้ โค้ดการปรับโครงสร้างใหม่ยังช่วยให้เข้าใจได้อย่างลึกซึ้งยิ่งขึ้นว่าโค้ดมีไว้ทำอะไรตั้งแต่แรก และบรรลุเป้าหมายสุดท้ายได้อย่างไร เมื่อทำการรีแฟคเตอร์โค้ด เราจะต้องพิจารณาสคริปต์อีกครั้ง และตัดสินใจว่าแต่ละคำสั่งทำอะไร และจะทำให้โค้ดมีประสิทธิภาพมากขึ้นหรือไม่หรืออย่างไร ความรู้เกี่ยวกับโค้ดที่เพิ่มขึ้นนี้อาจหมายความว่าการแสดงความคิดเห็นเกี่ยวกับโค้ดที่ปรับโครงสร้างใหม่จะมีประโยชน์และเป็นคำอธิบายมากขึ้นในครั้งที่สอง
ข้อได้เปรียบที่ชัดเจนที่สุดสำหรับสคริปต์ VBA ที่ปรับโครงสร้างใหม่ของเราคือรันไทม์ ตามที่ระบุไว้ก่อนหน้านี้ สคริปต์ที่ปรับโครงสร้างใหม่จะรันเร็วกว่าสคริปต์ต้นฉบับประมาณหนึ่งในสิบวินาที
สคริปต์ที่ปรับโครงสร้างใหม่ของเรายังมีความคิดเห็นที่ดีขึ้นมาก เพื่อที่เราจะได้กลับมาดูโค้ดในภายหลังและเข้าใจสคริปต์ที่ปรับโครงสร้างใหม่ได้ดีกว่าที่เราจะเข้าใจสคริปต์ต้นฉบับมาก
นอกจากนี้ สคริปต์ที่ปรับโครงสร้างใหม่ของเรายังมีมาโครแบบรูทีนย่อยเดียวที่ทำได้ทั้งหมด ในขณะที่สคริปต์ต้นฉบับทำงานเดียวกันได้สำเร็จโดยใช้รูทีนย่อยหลายรายการ
สุดท้ายนี้ สคริปต์ที่ปรับโครงสร้างใหม่เป็นสคริปต์ที่สามารถแก้ไขได้ง่ายกว่าเพื่อทำงานที่คล้ายกันสำหรับการวิเคราะห์อื่นๆ ข้อมูลจะถูกจัดเก็บไว้ในอาร์เรย์ในมาโครแทนที่จะเติมเซลล์ในแผ่นงานในขณะที่ลูปทำงาน หากเราต้องปรับแต่งสคริปต์ต้นฉบับเพื่อจุดประสงค์อื่น เราแทบจะต้องเขียนลูปใหม่ทั้งหมด หากเราต้องปรับแต่งสคริปต์ที่ปรับโครงสร้างใหม่เพื่อวัตถุประสงค์อื่น เราเพียงแค่ต้องแก้ไขอาร์เรย์และใช้ฟังก์ชันการค้นหาและแทนที่เพื่ออัปเดตชื่ออาร์เรย์ในลูป