You are on page 1of 45

1

กิตติกรรมประกาศ

ขอขอบคุ ณ คุ ณ มนั ส ชั ย คุ ณ าเศรษฐ์ ที่ ใ ห้ ก ารช่ ว ยเหลื อ คอยแนะนำา ความรู้ เ บื้ อ งต้ น และ
กระบวนการทำางานของโปรแกรมคอนเคอร์เรนท์เวอร์ชั่นส์ซิสเต็มส์ทำาให้การเรียนรู้เข้าใจมากยิ่งขึน้
2

บทคัดย่อ

โครงการนี้เป็นการสร้างโปรแกรมเพื่อใช้แสดงข้อมูลเอกสารจากโปรแกรมไมโครซอฟต์ วิชวลซอร์ส
เซฟ (Microsoft Visual SourceSafe) ซึ่งเป็นระบบบันทึกประวัติการแก้ไข โดยโปรแกรมสามารถแสดง
ประวัติการแก้ไขเอกสารในรูปแบบของเอกสารเวอร์ชั่นล่าสุด โดยสามารถแสดงรายละเอี ยดในแต่ล ะ
บรรทัดว่าบรรทัดนั้นๆถูกเพิ่ม ลบและแก้ไขตั้งแต่ในเวอร์ชั่นใด
ทำางานโดยการเรียกใช้ออปเจ็คของไมโครซอฟต์ วิชวลซอร์สเซฟ ผ่านทางโดยวิธี OLE Automation
เพื่อดูข้อมูลเอกสารแต่ละเวอร์ชั่นในฐานข้อมูลของโปรแกรมไมโครซอฟต์ วิชวลซอร์สเซฟ โดยใช้ภาษา
Visual Basic ในการพัฒนาและใช้ภาษา C# พัฒนาในส่วนของการหาผลต่างระหว่างไฟล์เอกสารในแต่ละ
เวอร์ชั่น
3

Abstract

This project is program to view file data from Microsoft Visual SourceSafe. It is an
application which offers the users the ability to track and view the history of text files. The
application is capable of displaying the content of the file from present back to the day of
creation. It compares and show difference between 2 versions and more. The user will then be
able to view any modified version of the text file in latest version. This application is inspired
from and aimed at source code tracking system. However, the application can be used to keep
track of the history of any plain text file.
The process will call Visual SourceSafe’s object by OLE Automation. This project is
developing by Visual Basic and C# in path to find difference between another versions.
4

สารบัญ
กิตติกรรมประกาศ ก
บทคัดย่อ ข
Abstract ค
สารบัญ ง
สารบัญรูปภาพ จ
สารบัญตาราง ซ
บทที่ 1 บทนำา 1
1.1. ความสำาคัญและที่มาของโครงการ 1
1.2. วัตถุประสงค์ของโครงการ 1
1.3. ขอบเขตของโครงการ 2
1.4. แผนการดำาเนินการ 2
1.5. ผลทีค ่ าดว่าจะได้รับ 3
บทที่ 2 ทฤษฎีพื้นฐาน 4
2.1. วิธีและหลักการจัดเก็บข้อมูล 4
2.2. การนำาข้อมูลที่จัดเก็บไว้มาประมวลผล 7
2.3. การเรียกใช้ออปเจ็คของ Microsoft Visual SourceSafe 10
บทที่ 3 การออกแบบ 12
3.1. วิเคราะห์ความต้องการของผู้ใช้ 12
3.2. อินเตอร์เฟสเบื้องต้นของโปรแกรม 12
บทที่ 4 การพัฒนาโปรแกรม 14
4.1. การดึงข้อมูลจากฐานข้อมูลของ Microsoft Visual SourceSafe 14
4.2. การนำาข้อมูลทั้งหมดมาทำาการ Diff 21
บทที่ 5 26
5.1 บทสรุป 26
5.2 ปัญหาที่พบ 26
5.3 แนวทางการแก้ปัญหาและข้อเสนอแนะ 27
ภาคผนวก ก การติดตั้ง 28
ภาคผนวก ข การใช้งาน 29
บรรณานุกรม 32
5

สารบัญรูปภาพ

รูปที่ 2.1 ตัวอย่างกล่องผลิตภัณฑ์ 5


รูปที่ 2.2 ตัวอย่างการเช็คอินไฟล์ไปเก็บไว้ที่ซอร์สคอนโทรล 5
รูปที่ 2.3 ตัวอย่างล็อคไฟล์ 6
รูปที่ 2.4 ตัวอย่าง VSS ที่เป็น Plug-in ใน Eclipse IDE (VSS Plug-in version 1.6.1 for Eclipse 3.1) 6
รูปที่ 2.5 ตัวอย่างส่วนของโปรแกรม See Soft 7
รูปที่ 2.6 ตัวอย่างส่วนของโปรแกรม Diff tool 8
รูปที่ 2.7 ตัวอย่างผลการ Diff ของโปรแกรม diff tool 8
รูปที่ 2.8 ตัวอย่างส่วนของโปรแกรม RGDiff 8
รูปที่ 2.9 การผลการ Diff ของ RGDiff 8
รูปที่ 2.10 ตัวอย่างส่วนของโปรแกรม VDiff 9
รูปที่ 2.11 การผลการ Diff ของ VDiff 9
รูปที่ 2.12 ไลบราลีท่ ี่ต้องทำาการประกาศใช้ 10
รูปที่ 2.13 รายละเอียดของแต่ละออปเจ็ค 10
รูปที่ 2.14 รายละเอียดของแต่ละออปเจ็ค 11
รูปที่ 2.15 รายละเอียดของแต่ละออปเจ็ค 11
รูปที่ 3.1 หน้า Login 12
รูปที่ 3.2 ไฟล์ข้อมูลใน VSS 13
รูปที่ 3.3 ผลการ Diff 13
รูปที่ 4.1 Folder ทีส่ ร้างขึ้นมาเพื่อเก็บไฟล์ 20
รูปที่ 4.2 หน้าต่างที่ใช้แสดงผลการ Diff 21
รูปที่ 4.3 ผลการ Diff ทีละ 4 เวอร์ชั่นโดยมีเฉพาะกรณี Add ข้อมูล 23
รูปที่ 4.4 ข้อมูลที่นำามาทำาการ Diff ในรูปที่ 4.3 23
รูปที่ 4.5 ผลการ Diff ทีละ 4 เวอร์ชั่นโดยมีกรณี Add ข้อมูลและกรณี Change ข้อมูล 24
รูปที่ 4.6 ข้อมูลที่นำามาทำาการ Diff ในรูปที่ 4.5 24
รูปที่ 4.7 ผลการดิฟทีละ 2 เวอร์ชั่น 25
รูปที่ 4.8 ผลการดิฟทีละ 2 เวอร์ชั่น(เลื่อนเคอร์เซอร์ลงมา) 25
รูปที่ 4.9 ข้อมูลที่นำามาทำาการ Diff ในรูปที่ 4.7 และ 4.8 25
รูปที่ ก.1 เมื่อแตกไฟล์ COE2005-06_MVTVE.zip 28
รูปที่ ก.2 ภายในโฟลเดอร์ประกอบด้วยไฟล์ดังรูป 28
6

รูปที่ ข.1 เป็นหน้าล็อคอินเพื่อเข้าสู่ฐานข้อมูลของ Microsoft SourceSafe 29


รูปที่ ข.2 หน้าหลักของโปรแกรม 29
รูปที่ ข.3 เมื่อคลิกขวาที่ไฟล์ที่ต้องการจะแสดงผลต่างทุกเวอร์ชั่น 30
รูปที่ ข.4 หลังจากเลือก Show History จะขึ้นหน้าต่างดังรูป 30
รูปที่ ข.5 เมื่อกดปุ่ม Diff All ก็จะเป็นการแสดงผลต่างทุกๆเวอร์ชั่น 31
7

สารบัญตาราง

ตารางที่ 1.1 ระยะเวลาและแผนการดำาเนินงาน 2


ตารางที่ 4.1 แสดงแอคชั่นที่เกิดขึ้นขณะแยกผลต่างของไฟล์ข้อมูล 2 ไฟล์ 22
1

บทที่ 1
บทนํา

1.1.ความสําคัญและที่มาของโครงการ
เนื่องจาก การพัฒนาซอฟต์แวร์ มีปริมาณมากขึ้น ซึ่งซอฟต์แวร์ในปัจจุบันก็มีความซับซ้อนสูง และมัก
จะถูกพัฒนาโดยคนกลุ่มใหญ่ นอกจากนี้ ในซอฟท์แวร์หนึ่งๆ ยังมีการแยกออกเป็นหลายๆเวอร์ชั่น และหลายรี
วิสชัน่ ซึ่งทำาให้การจัดการซอฟต์แวร์ ให้มีความสอดคล้องกันในกลุ่มผู้พัฒนาเป็นสิ่งที่มีความจำาเป็นอย่างยิ่ง ซึ่ง
ในปัจจุบันก็ได้มี ซอฟต์แวร์ ที่ชว่ ยเหลือในการจัดการชุดคำาสั่ง (Source Code) ที่มีจำานวนมากได้ เช่นโปรแกรม
คอนเคอร์ เ รนท์ เ วอร์ ชั่ น ส์ ซิ ส เต็ ม ส์ (Concurrent Versions System), ซั บ เวอร์ ชั่ น (Subversion) และ
ไมโครซอฟต์ วิสชวลซอร์สเซฟ (Microsoft Visual SourceSafe) ซึ่งมีส่วนช่วยในการพัฒนาซอฟต์แวร์ ให้มี
ความถูกต้องและรวดเร็วมากยิ่งขึ้น แต่ก็ยังมีปัญหาการใช้งานเช่น
- ในการบันทึกความเปลี่ยนแปลงในลักษณะของการแสดงผล ยังไม่สามารถแสดงให้เห็นความ
เปลี่ยนแปลงที่ผ่านมาได้อย่างชัดเจน
- ไม่สามารถแยกแยะความแตกต่างระหว่างการย้ายประโยคกับการลบและเพิ่มได้
- มีความต้องการอีดิตเตอร์ (Editor) ที่ช่วยผู้ใช้ในการแก้ไขไฟล์ โดยสามารถดูข้อมูลที่ถูกแก้ไขใน
อดีตที่ผ่านมา ได้พร้อมๆกันได้
- มีความต้องการ โปรแกรมที่ช่วยในการวิเคราะห์ชุดคำาสั่งที่ถูกแก้ไขหลายๆ ครั้ง เพื่อให้ สามารถ
พิจารณาได้ง่ายขึ้น

1.2.วัตถุประสงค์ของโครงการ
สร้างโปรแกรมเพื่อใช้ในการอ่านข้อมูลเอกสารจากโปรแกรมไมโครซอฟต์ วิสชวลซอร์สเซฟ (Microsoft
Visual SourceSafe) ซึ่งเป็นระบบบันทึกประวัติการแก้ไข โดย โปรแกรมสามารถแสดงการแก้ไขของเอกสารได้
โดยแสดงแบบทั้งหมด, เฉพาะส่วน และสามารถนำาข้อมูลเก่ามาคัดลอกได้
โปรแกรม ควรสามารถแสดงในระดับตัวอักษรที่ถูกแก้ไขทั้งที่ถูกเพิ่มเติมหรือลบ และ แสดงการย้ายที่
ของข้อความ ณ วัน เวลาที่แก้ไขได้
2

1.3.ขอบเขตของโครงการ
โปรแกรมในรูปแบบที่เ ป็นวิวเวอร์ (Viewer) และอีดิตเตอร์ (Editor) แสดงการประวัติการแก้ไขของ
เอกสารได้ แสดงความแตกต่างระหว่างชุดคำา สั่งตั้งแต่ 2 เวอร์ชั่นขึ้นไป พร้อมๆกัน สามารถแก้ไขและคัดลอก
บันทึกแต่ละเวอร์ชั่นได้

1.4.แผนการดําเนินงาน
1. ศึกษาโปรแกรม VSS และ CVS
2. ศึกษาวิธีทำางานเบื้องต้นของโปรแกรม See Soft
3. ศึกษาและวิเคราะห์ความต้องการของผู้ใช้
4. ศึกษาการเรียกใช้และการเข้าถึง VSS
5. ออกแบบโครงสร้างของโปรแกรมเบื้องต้น
6. ศึกษารายละเอียด คำาสั่งที่เรียกใช้ Object ของ VSS
7. พัฒนาโปรแกรม พร้อมทั้งทดสอบการใช้งานจริง
8. สรุปผลการทำางานและเขียนคู่มือการใช้งาน

โครงงานเริ่มต้นเดือน มิถุนายน 2548 สิน้ สุดเดือนกุมภาพันธ์ 2549 รวมเป็นเวลา ทัง้ สิ้น 9 เดือน ดังนี้

ตารางที่ 1.1 ระยะเวลาและแผนการดำาเนินงาน

ระยะเวลาและแผนการดำาเนินงาน มิ.ย. ก.ค. ส.ค. ก.ย. ต.ค. พ.ย. ธ.ค. ม.ค. ก.พ.
1. ศึกษาโปรแกรม VSS และ CVS
2. ศึกษาวิธีทำางานเบื้องต้นของโปรแกรม See Soft
3. ศึกษาและวิเคราะห์ความต้องการของผู้ใช้
4. ศึกษาการเรียกใช้และการเข้าถึง VSS
5. ออกแบบโครงสร้างของโปรแกรมเบื้องต้น
6. ศึกษารายละเอียด คำาสั่งที่เรียกใช้ Object ของ
VSS
7. พัฒนาโปรแกรม พร้อมทั้งทดสอบการใช้งานจริง
3

8. สรุปผลการทำางานและเขียนคู่มือการใช้งาน
1.5.ผลที่คาดว่าจะได้รับ
- ได้ศึกษาระบบการทำางานของโปรแกรม Microsoft Visual SourceSafe
- ได้เรียนรู้การเขียนโปรแกรมด้วยภาษา Visual Basic
- ได้ศึกษาการเรียกใช้ออปเจ็คของโปรแกรม Microsoft Visual SourceSafe
- ได้ศึกษาการเขียนโปรแกรมเพื่อวิเคราะห์ข้อมูลการเปลี่ยนแปลงของเอกสาร
- ได้ศึกษาและออกแบบหาวิธีการในการแสดงผลข้อมูลทีได้ ในรูปแบบที่สะดวกต่อผู้ใช้
- ได้โปรแกรมแสดงประวัติการแก้ไขแฟ้มเอกสาร
4

บทที่ 2
ทฤษฎีพื้นฐาน

ในการพัฒนาโปรแกรมในโครงการนี้ จะนำาโปรแกรมที่มอี ยู่มาเป็นพื้นฐานในงานที่จะทำาการพัฒนาขึ้น


ซึ่งในการโครงการนี้ ได้มีสิ่งที่ได้ทำาการศึกษาแบ่งออกเป็นสามส่วนคือ
1) วิธีและหลักการในการจัดเก็บข้อมูล
2) การนำาข้อมูลที่จัดเก็บไว้มาประมวลผล
3) การเรียกใช้ออปเจ็คของไมโครซอฟต์ วิสชวลซอร์สเซฟ

2.1 วิธีและหลักการในการจัดเก็บข้อมูล
ในการจัดเก็บข้อมูลเกี่ยวกับประวัติการแก้ไขของแฟ้มข้อมูลนั้นมีโปรแกรมหลายตัวที่สามารถทำางานนี้
ได้ เช่ น โปรแกรม คอนเคอร์ เ รนท์ เ วอร์ ชั่ น ส์ ซิ ส เต็ ม ส์ (Concurrent Versions System), ซั บ เวอร์ ชั่ น
(Subversion) และ ไมโครซอฟต์ วิสชวลซอร์สเซฟ (Microsoft Visual SourceSafe หรือเรียกสั้นๆว่า VSS) ซึ่ง
ในที่นี้โปรแกรมที่เรานำาศึกษาคือ โปรแกรม คอนเคอร์เรนท์เวอร์ชั่นส์ซิสเต็มส์ และ ไมโครซอฟต์ วิสชวลซอร์ส
เซฟ และโปรแกรมที่ใช้วิเคราะห์แฟ้มข้อความได้แก่โปรแกรม ซีซอร์ฟ (See Soft)
2.1.1 Concurrent Version Control System (CVS)
CVS เป็นเครื่องมือที่สำาคัญที่ทำาให้เราสามารถพัฒนา ซอฟท์แวร์โดยผู้ ใช้หลายคนไปพร้อมๆกันได้ โดย
CVS นี้จะทำา งานอยู่บนพื้นฐานของ RCS CVS ใช้วิธีการเก็บข้อมูลประวัติของแฟ้มข้อมูลต่างๆไว้ในรูปแบบ
ของ RCS โดยจะเก็บแฟ้มประวัติเหล่านั้นไว้ที่เดียวเรียกว่า รีโพสซิทอร์รี่ (Repository) ซึ่งผู้ที่จะต้องการทำางาน
กับ แฟ้มข้อมูลจะต้องขอเช็คเอ้าท์ (Check Out) แฟ้มข้อมูลออกไป ซึ่งจะได้ สำาเนาของงานนั้นๆ เป็นภาพถ่าย
ของ แฟ้มข้อมูลต่างๆในเวลาที่ต้องการ จากนั้นเมื่อผู้ใช้ทำา การแก้ไขแล้ว ผู้ใช้ก็จะทำา การเช็คอิน (Check In)
แฟ้มข้อมูลเข้ามาใหม่
ในรีโพสซิทอร์รี่ แฟ้มข้อมูลในตัว CVSRoot นั้นจะเก็บค่าต่างๆที่เกี่ยวกับการทำา งานที่ผ่านมาทั้งหมด
อยู่ ใ นไฟล์ ต่า งๆ เช่ น ฮิ ส ทอร์ รี่ (History) จะเก็ บประวั ติ การทำา งานกั บไฟล์ต่ า งๆไม่ว่า จะเป็ น การโมดิ ฟ าย
(Modify ) , อัพเดท (Update) , เช็คเอ้าท์ ไว้ทั้งหมด, Val-tags เก็บชื่อ แท็ก(tag) ไว้ เป็นต้น ส่วนในแฟ้มข้อมูล
ของ โมดูล(Module) ที่ถูกอิมพอร์ต (Import) เข้ามา จะเก็บไฟล์ที่เราอิมพอร์ตมาทั้งหมดไว้ ซึ่งแต่ละไฟล์นั้น จะ
ทำาหน้าที่เก็บประวัติการเปลี่ยนแปลงของไฟล์ของตัวเอง จากการทำา งานของผู้ใช้ไว้ ว่าถูกแก้ไขปรับปรุงต่าง
จากผูใ้ ช้ ก่อนหน้ายังไง ซึ่งใช้หลักการทำางานของ RCS
5

CVS สามารถจดจำาประวัติของไฟล์ได้ โดยส่วนใหญ่เราจะใช้กับพวกชุดคำา สั่งต่างๆ ใน CVS จะเก็บ


เพียงความแตกต่างระหว่าง รีวิสชั่นของไฟล์ จะไม่เก็บทั้งไฟล์ตัวใหม่และตัวเก่า และ CVS ยังเก็บบันทึกการเข้า
ใช้งานของไฟล์ได้ว่าใครเป็นผู้แก้ไขเพิ่มเติมไฟล์และทำาไปเมื่อเวลาเท่าไร สาเหตุอะไรที่แก้ไข CVS มีส่วนช่วยใน
การจัดการกับเวอร์ชั่นของไฟล์ได้ และยังสามารถควบคุมการทำางานบนชุดคำาสั่งเดียวกันในผู้ใช้หลายๆคนได้.
CVS สามารถใช้งานได้กับภาษาหลายๆภาษาเช่น “C","C++", Java, Perl, HTML เป็นต้น
2.1.2 Microsoft Visual SourceSafe (VSS)

รูปที่ 2.1 ตัวอย่างกล่องผลิตภัณฑ์

VSS ใช้หลักการการเก็บข้อ มูลโดยมี เซอร์ฟ เวอร์ (Server) กลาง 1 ตัว โดยสร้าง ยูสเซอร์ล็อคอิน
(User Login) เข้าไปที่เซอร์ฟเวอร์ แล้วเช็คอินตัวชุดคำาสั่งไปเก็บไว้ที่ซอร์สคอนโทรล (Source Control) หรือที่
เซอร์ฟเวอร์ จากนั้นถ้าผู้ใช้ อื่นๆต้องการเอาชุดคำา สั่งออกมาปรับปรุงก็ทำา การ เก็ท เลสเทสซ์ เวอร์ชั่น (Get
Latest Version) ออกมา โดยที่ผู้ใช้ที่ต้องการปรับปรุงชุดคำา สั่งก็จะทำา การเช็คเอ้าท์ไฟล์ ออกไป จากนั้นตัว
VSS ก็จะทำาการล็อคไฟล์นั้นไว้ และระบบจะทำาการ สร้างล็อคไฟล์ชื่อของคนที่เช็คเอ้าท์ไฟล์ออกไป เวลาที่ทำา
เสร็จก็ทำา การเช็คอินไฟล์เข้าส่วนกลาง ทำา ให้ที่ซอร์สคอนโทรลเป็นชุดคำา สั่ง ที่อัพเดทล่าสุด เวลาที่ผู้ใช้อื่นๆ
ต้องการอัพเดท โซลูชั่น(Solution) ก็เข้าไปเพื่อเก็ท เลสเทสซ์ เวอร์ชั่น ออกมา โดยตัวอย่างกล่องผลิตภัณฑ์
แสดงในรูปที่ 2.1-4

รูปที่ 2.2 ตัวอย่างการเช็คอินไฟล์ไปเก็บไว้ที่ซอร์สคอนโทรล (Source Control)


6

รูปที่ 2.3 ตัวอย่างล็อคไฟล์

รูปที่ 2.4 ตัวอย่าง VSS ที่เป็น Plug-in ใน Eclipse IDE (VSS Plug-in version 1.6.1 for Eclipse 3.1)
2.1.3 See Soft
See Soft เป็นโปรแกรมที่ถูกพัฒนาขึ้นมาในโครงการการหาวิธีเพื่อช่วยในการวิเคราะห์โปรแกรมขนาด
ใหญ่, ซอร์สโค๊ด (Source Code) แสดงในรูปที่ 2.5 ซึ่งโปรแกรมที่ถูกนำามาวิเคราะห์ในการวิจัยนั้นมีขนาดใหญ่
มาก (ชุดคำา สั่งหลายล้านบรรทัด) และถูกพัฒนามาเป็นเวลานาน (เช่นสิบปี) โดยนักพัฒนาจำานวนมาก (ใน
บางโครงการใช้โปรแกรมเมอร์ถึงถึงหนึ่งพันคน)
See Soft ได้ถูกพัฒนาขึ้นมาเพื่อช่วยในการแสดงให้ผู้วิเคราะห์เห็นถึงคุณสมบัติต่างๆของชุดคำาสั่งดังนี้
7

­ ประวัติของการเปลี่ยนแปลงของชุดคำาสั่งในแต่ละเวอร์ชั่น
­ ความแตกต่างระหว่าง รุ่นที่ปล่อยออกสู่ท้องตลาด (Release)
­ คุณสมบัติต่างๆของคำาสั่ง ที่สามารถพิจารณาได้โดยไม่ต้องนำาคำาสั่งไปทดลองใช้งานจริง
­ การวิเคราะห์คำาสั่งและหาจุดที่ถูกเรียกใช้งานบ่อย

รูปที่ 2.5 ตัวอย่างส่วนของโปรแกรม See Soft

2.2 การนําข้อมูลที่จัดเก็บไว้มาประมวลผล
การนำาข้อมูลที่จัดเก็บไว้มาแสดงผล โดยนำาไฟล์ข้อมูลแต่ละเวอร์ชั่นมาทำาการลบกันเพื่อหาความแตก
ต่าง (Diff) หรือ การนำา มารวมกัน (Merge) นั้นมีอัลกอริทึมแตกต่างกันมาก ไม่ว่าจะเป็นการเทียบบรรทัดต่อ
บรรทัด การเทียบโดยตัดส่วนของการคอมเมท์ และอัลกอริทึมในการเลื่อนบรรทัด เพื่อให้ได้การแสดงผลความ
แตกต่างได้อย่างถูกต้องและมีประสิทธิภาพมากยิ่งขึ้น เราจึงจำาเป็นจะต้องศึกษากระบวนการดังกล่าวเพื่อนำา
มาใช้ในการพัฒนาโครงงานนี้อย่างละเอียด
โดยเราทำาการศึกษาเครื่องมือในการ Diff-Merge ที่เป็นโอเพ่นซอร์สที่น่าสนใจ 3 ตัวได้แก่
2.2.1 Diff tool
โปรแกรม Diff tool พั ฒ นาด้ ว ยภาษา C++ พั ฒนาโดย Stephane Rodriguez เป็ น โอเพ่ น ซอร์ ส ที่
สามารถนำา ซอร์สโค๊ดสองเวอร์ชั่นมา Diff เพื่อหาความแตกต่าง โดยจะแสดงผลการ Diff ผ่านทาง Internet
Explorer โดยใช้สีไฮไลท์บรรทัดที่มีการเปลี่ยนแปลง 3 สีได้แก่ เหลือง (เปลี่ยนแปลง) เขียว (เพิ่มขึ้นมาจาก
เวอร์ชั่นเดิม) และแดง (ถูกลบออกจากเวอร์ชั่นเดิม ) มีลักษณะคล้ายการแสดงผลของ VSS มากโดยแสดงในรูป
ที่ 2.6-7
8

รูปที่ 2.6 ตัวอย่างส่วนของโปรแกรม diff tool

รูปที่ 2.7 ตัวอย่างผลการ Diff ของโปรแกรม diff tool


2.2.2 RGDiff
โปรแกรม RGDiff นั้นพัฒนาด้วยภาษา C++ พัฒนาโดย Rob Groves เป็นโอเพ่นซอร์สที่สามารถนำา
ไฟล์ข้อมูลสองเวอร์ชั่นมา Diff เพื่อหาความแตกต่าง โดยจะแสดงผลการ Diff ผ่านทางหน้าต่างของโปรแกรม
ได้เลยโดยใช้สีไฮไลท์บรรทัดที่มีการเปลี่ยนแปลงเพียงสีเดียวโดยแสดงในรูปที่ 2.8-9

รูปที่ 2.8 ตัวอย่างส่วนของโปรแกรม RGDiff

รูปที่ 2.9 การผลการ Diff ของ RGDiff


9

2.2.3 VDiff
โปรแกรม VDiff พัฒนาด้ว ยภาษา C++ พัฒนาโดย Shankarp เป็นโอเพ่ นซอร์ส ที่สามารถนำา ไฟล์
ข้อมูลสองเวอร์ชั่นมา Diff เพื่อหาความแตกต่าง โดยจะแสดงผลการ Diff ผ่านทาง Internet Explorer เช่น
เดียวกับ Diff tool โดยใช้สีไฮไลท์บรรทัดที่มีการเปลี่ยนแปลง 3 สีได้แก่ นำ้าเงิน (เปลี่ยนแปลง) เขียว (เพิ่มขึ้น
มาจากเวอร์ชั่นเดิม) และแดง (ถูกลบออกจากเวอร์ชั่นเดิม) โดยแสดงในรูปที่ 2.10-11

รูปที่ 2.10 ตัวอย่างส่วนของโปรแกรม VDiff

รูปที่ 2.11 การผลการ Diff ของ VDiff


10

2.3 การเรียกใช้ออปเจ็คของ Microsoft Visual SourceSafe


จากศึกษารายละเอียด คำา สั่งที่เรียกใช้ Object ของ VSS ทำา ให้เราทราบถึงกระบวนการและคำา สั่ง
ต่างๆที่เราสามารถเรียกใช้ผ่าน VSS ได้ ซึ่งการที่เราจะเรียกใช้ VSS เราต้องทำาการ Add Library ดังต่อไปนี้
แสดงในรูปที่ 2.12

รูปที่ 2.12 ไลบราลีท่ ี่ต้องทำาการประกาศใช้

เมื่อเราทำาการเพิ่มไลบราลี่ของ VSS แล้วเราสามารถเลือกดูรายละเอียดของ Object ต่างๆได้


โดยไปที่ View -> Object Browse แสดงในรูปที่ 2.13-5

รูปที่ 2.13 รายละเอียดของแต่ละออปเจ็ค


11

รูปที่ 2.14 รายละเอียดของแต่ละออปเจ็ค

รูปที่ 2.15 รายละเอียดของแต่ละออปเจ็ค

และศึกษารายละเอียดเพิ่มเติมจาก MSDN ตามนี้


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvss/html/vssauto.asp
12

บทที่ 3
การออกแบบ

หลังจากที่เราสามารถที่จะนำาข้อมูลมาประมวลผลได้แล้ว เราจะต้องหาวิธีในการนำาเสนอข้อมูลเหล่านี้
แก่ผู้ใช้ โดยมีเป้าหมายดังต่อไปนี้
1. การแสดงผลที่เข้าใจง่าย แยกแยะความแตกต่างแต่ละเวอร์ชั่นได้อย่างชัดเจน
2. สามารถแสดงผลพร้อมๆกันทุกๆเวอร์ชั่น ไม่จำากัด โดยใช้เวอร์ชั่นใดเวอร์ชั่นหนึ่งเป็นหลัก สามารถระบุ

ว่า บรรทัดนั้นๆถูกแก้ไข,เพิ่มและลบ ตั้งแต่เวอร์ชั่นใด เพื่อให้สามารถหาบั๊กหรือวิเคราะห์ไฟล์ข้อมูลได้


ง่ายขึ้น
3. สามารถนำามาแก้ไข และ สร้างไฟล์ใหม่เป็นไฟล์ที่แก้ไขแล้วได้
4. มีระบบจัดการผู้ใช้ สามารถกำาหนดสิทธิการเข้าถึงไฟล์ข้อมูล และเข้าถึงได้ระดับใด

3.1 อินเตอร์เฟส
- มีระบบ Login เพื่อเข้าสู่ฐานข้อมูลของ VSS ซึ่งไฟล์ข้อมูลที่เราจะนำามาเปรียบเทียบจะถูกเก็บไว้ในฐาน
ข้อมูลนี้โดยแสดงในรูปที่ 3.1

รูปที่ 3.1 หน้า Login


- เมื่ อ Login เข้ า ไปจะมี อิ น เตอร์ เ ฟทคล้ า ย VSS โดยแสดงรายการไฟล์ ข้ อ มู ล ที่ อ ยู่ ใ น Account นั้ น ๆ
(SourceSafe Explorer) โดยแสดงในรูปที่ 3.2
13

รูปที่ 3.2 หน้าแสดงไฟล์ข้อมูลใน VSS

สิ่งที่เราเพิ่มเข้ามาก็คือการแสดงผลพร้อมๆกันทุกเวอร์ชั่น โดยใช้เวอร์ชั่นล่าสุดเป็นหลัก
สามารถแสดงผลว่า บรรทัดนั้นๆถูกเพิ่มตั้งแต่เวอร์ชั่นใด ถูกแก้ไขตั้งแต่เวอร์ชั่นใด ถูกลบไปตั้งแต่
เวอร์ชั่นใด โดยใช้รูปแบบที่สไี ฮไลท์แยกแต่ละเวอร์ชั่น เวอร์ชั่นละสีโดยแสดงในรูปที่ 3.3

รูปที่ 3.3 หน้าแสดงผลการ Diff


14

บทที่ 4
การพัฒนาโปรแกรม

หลังจากที่ได้ศึกษาหาความรู้ในการทำา โครงการนี้ ขั้นตอนต่อไปจะเป็นการพัฒนา โดยกระบวนการ


ทำางานมีการทำางานย่อยๆ 2 ส่วนได้แก่
1. การดึงข้อมูลจากฐานข้อมูลของ Microsoft Visual SourceSafe (VSS)

2. การนำาข้อมูลมาทำาการ Diff ด้วยอัลกอริทึมที่เราพัฒนาเพื่อให้ได้ตรงตามความต้องการ

4.1 การดึงข้อมูลจากฐานข้อมูลของ Microsoft Visual SourceSafe (VSS)


การดึงข้อมูลจาก VSS นั้น เราจะเรียกผ่าน Object ต่างๆของ VSS ซึ่งเราไม่สามารถรู้ได้ถึงลักษณะ
การเก็บข้อมูลของ VSS ได้ เราจีงไม่สามารถจะพัฒนาจาก VSS โดยตรงได้ เราจึงใช้ประโยชน์จาก VSS โดย
การนำาข้อมูลที่เก็บเวอร์ชั่นต่างๆในฐานข้อมูลมาทำาการหาผลต่างโดยมีวิธีการดังนี้

Dim X As Integer
Dim Version As Integer
Dim numVer As Integer
Dim tPathLen As Integer
Dim tPath As String
Dim objVSS As VSSItem
Dim lpBuffer As String * 100
Dim tFile As String
Dim sPath As String
numVer = ListView1.ListItems.Count
X = numVer
For Version = 1 To numVer
lpBuffer = String(100, Chr(0))

tPathLen = GetTempPath(100, lpBuffer)


15

tPath = Mid(lpBuffer, 1, tPathLen)

Set objVSS = objVSSObject.Version(X)

If Mid(tPath, Len(tPath), 1) = "\" Then


tPath = tPath + objVSS.Name
Else
tPath = tPath + "\" + objVSS.Name
End If

objVSS.Get Local:=tPath, iFlags:=VSSFLAG_REPREPLACE


SetAttr tPath, vbNormal
tFile = ReadStringFromFile(tPath)

sPath = "c:\test\v" & X & objVSS.Name


WriteStringToFile sPath, tFile
X=X-1
Next
จากโค้คเราเรียกใช้ ListView1.ListItems.Count เพื่อให้ทราบว่ามีการแก้ไขกี่ Version เพื่อเอามาทำา
การวนลูปเพื่อเก็บ Version ต่างๆไว้ใน Temp ทีเราสร้างขึ้นเพื่อนำาไปหาผลต่าง
objVSS.Name เป็น object ทีเ่ ก็บชื่อของไฟล์ที่มีการแก้ไขเอาไว้
objVSS.Get เป็น object ที่ทำา หน้าที่สร้ างไฟล์ Version ต่างๆที่เก็ บไว้ แล้วเราก็ไปเอามาเก็ บไว้ใ น
folder ที่เราสร้างขึ้นมาเพื่อเอาไปหาผลต่าง
ในส่วนของการอ่านและเขียนไฟล์ที่ objVss.Get สร้างขึ้นมา เราได้สร้าง Module FileApi ขึ้นมาโดยใน
Module เราได้ ส ร้ า ง Function ReadStringFromFile ขึ้ น มาเพื่ อ ทำา การอ่ า นไฟล์ เมื่ อ อ่ า นไฟล์ แ ล้ ว เราใช้
Function WriteStringToFile เพื่อทำาการเขียนไฟล์ที่เราได้อ่านมาลงใน Folder ที่เราต้องการเก็บไว้
Option Explicit
Private Const GENERIC_WRITE = &H40000000
16

Private Const GENERIC_READ = &H80000000


Private Const FILE_ATTRIBUTE_NORMAL = &H80
Private Const CREATE_ALWAYS = 2
Private Const OPEN_ALWAYS = 4
Private Const INVALID_HANDLE_VALUE = -1

Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, _


lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, _
lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" ( _


ByVal hObject As Long) As Long

Private Declare Function WriteFile Lib "kernel32" ( _


ByVal hFile As Long, lpBuffer As Any, _
ByVal nNumberOfBytesToWrite As Long, _
lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long

Private Declare Function CreateFile Lib "kernel32" _


Alias "CreateFileA" (ByVal lpFileName As String, _
ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, _
ByVal lpSecurityAttributes As Long, _
ByVal dwCreationDisposition As Long, _
ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) _
As Long

Private Declare Function FlushFileBuffers Lib "kernel32" ( _


ByVal hFile As Long) As Long
Public Function WriteStringToFile(FileName As String, ByVal TheData As String, _
17

Optional NoOverwrite As Boolean = False) As Boolean

Dim lHandle As Long


Dim lSuccess As Long
Dim lBytesWritten As Long, lBytesToWrite As Long
If NoOverwrite = True And Dir(FileName) <> "" Then Exit Function
lBytesToWrite = Len(TheData)
lHandle = CreateFile(FileName, GENERIC_WRITE Or GENERIC_READ, _
0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)

If lHandle <> INVALID_HANDLE_VALUE Then


lSuccess = WriteFile(lHandle, ByVal TheData, _
lBytesToWrite, lBytesWritten, 0) <> 0
If lSuccess <> 0 Then
'Flush the file buffers (not sure if this is necessary)
lSuccess = FlushFileBuffers(lHandle)
'Close the file.
lSuccess = CloseHandle(lHandle)
End If
End If
ErrorHandler:
WriteStringToFile = lSuccess <> 0
End Function

Public Function ReadStringFromFile(FileName As String) As String


On Error GoTo ErrorHandler
Dim lHandle As Long
Dim lSuccess As Long
Dim lBytesRead As Long
18

Dim lBytesToRead As Long


Dim bytArr() As Byte
Dim sAns As String

lBytesToRead = FileLen(FileName)
ReDim bytArr(lBytesToRead) As Byte
'Get a handle to file
lHandle = CreateFile(FileName, GENERIC_WRITE Or GENERIC_READ, _
0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
If lHandle <> INVALID_HANDLE_VALUE Then
'read file contents into a bytearray and convert to string
lSuccess = ReadFile(lHandle, bytArr(0), _
lBytesToRead, lBytesRead, 0)
sAns = ByteArrayToString(bytArr)
ReadStringFromFile = sAns
CloseHandle lHandle
End If
ErrorHandler:
End Function

Public Function ReadBytesFromFile(FileName As String) As Byte()


On Error GoTo ErrorHandler
Dim lHandle As Long
Dim lSuccess As Long
Dim lBytesRead As Long
Dim lBytesToRead As Long
Dim bytArr() As Byte
19

lBytesToRead = FileLen(FileName)
ReDim bytArr(lBytesToRead) As Byte
'Get a handle to file
lHandle = CreateFile(FileName, GENERIC_WRITE Or GENERIC_READ, _
0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
If lHandle <> INVALID_HANDLE_VALUE Then
lSuccess = ReadFile(lHandle, bytArr(0), _
lBytesToRead, lBytesRead, 0)

ReadBytesFromFile = bytArr
CloseHandle lHandle
End If
ErrorHandler:
End Function
Public Function WriteBytesToFile(FileName As String, TheData() As Byte, _
Optional NoOverwrite As Boolean = False) As Boolean
Dim lHandle As Long
Dim lSuccess As Long
Dim lBytesWritten As Long, lBytesToWrite As Long
If NoOverwrite = True And Dir(FileName) <> "" Then Exit Function
lBytesToWrite = UBound(TheData) - LBound(TheData)

lHandle = CreateFile(FileName, GENERIC_WRITE Or GENERIC_READ, _


0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)

If lHandle <> INVALID_HANDLE_VALUE Then


lSuccess = WriteFile(lHandle, TheData(0), _
lBytesToWrite, lBytesWritten, 0) <> 0
If lSuccess <> 0 Then
20

lSuccess = FlushFileBuffers(lHandle)
lSuccess = CloseHandle(lHandle)
End If
End If
ErrorHandler:
WriteBytesToFile = lSuccess <> 0
End Function
Private Function ByteArrayToString(bytArray() As Byte) As String
Dim sAns As String
Dim iPos As String
sAns = StrConv(bytArray, vbUnicode)
iPos = InStr(sAns, Chr(0))
If iPos > 0 Then sAns = Left(sAns, iPos - 1)
ByteArrayToString = sAns
End Function

รูปที่ 4.1 Folder ที่สร้างขึ้นมาเพื่อเก็บไฟล์


21

4.2 การนําข้อมูลทั้งหมดมาทําการ Diff


รูปแบบการแสดงผล Diff ของเราคือ แสดงในรูปแบบเวอร์ชั่นล่าสุด โดยแสดงผลได้ว่า บรรทัด
นั้นๆถูกเขียนเพิ่มมาตั้งแต่เวอร์ชั่นใด เคยมีข้อมูลใดถูกลบออกไปบ้างและถูกลบที่เวอร์ชั่นใด
ซึ่งอัลกอริทึมในการ Diff จะเป็นการนำา อัลกอริทึมที่ใช้ในการ Diff ทีละ 2 เวอร์ชั่นมาพัฒนา
เพิ่มเพื่อนำาผลการดิฟทีละ 2 เวอร์ชั่นนั้นมารวมกันให้สามารถดิฟได้พร้อมๆกันทุกๆเวอร์ชั่นที่มีในฐาน
ข้อมูลของ VSS

รูปที่ 4.2 หน้าต่างที่ใช้แสดงผลการ Diff


อธิบายรูปที่ 4.2 หมายเลข 1 : แสดงเลขบรรทัด
หมายเลข 2 : แสดงข้อความบรรทัดนั้นๆซึ่งมาจากข้อมูลเอกสารในเวอร์ชั่นล่าสุด
หมายเลข 3 : แสดงแอ็คชั่นที่เกิดแบ่งเป็น Add และ Delete
หมายเลข 4 : แสดงเลขเวอร์ชั่นว่าแอ็คชั่นดังกล่าวถูกกระทำาตั้งแต่เวอร์ชั่นใด
โดยการ Diff จะเทียบไปทีละบรรทัดซึ่งการแสดงผลนั้นเราอ้างอิงที่เวอร์ชั่นล่าสุดเพียงอย่างเดียว ดัง
นั้นการนำาอัลกอริทึม Diff ทีละ 2 เวอร์ชั่นมาประยุกต์ให้ก็จะเป็นการเทียบดังนี้
Diff2Version(ข้อมูลในเวอร์ชั่น 1,ข้อมูลในเวอร์ชั่นสุดท้าย);
Diff2Version(ข้อมูลในเวอร์ชั่น 2,ข้อมูลในเวอร์ชั่นสุดท้าย);
Diff2Version(ข้อมูลในเวอร์ชั่น 3,ข้อมูลในเวอร์ชั่นสุดท้าย); ไปเรื่อยๆจนครบทุกเวอร์ชั่น
โดยในกระบวนการ Diff ทีละ 2 เวอร์ชั่นซึ่งก็คือ Source File และ Destination File นั้นจะแยกเป็น 4
กรณีโดยจะรีเทริน Action ลงใน ArrayList
22

ArrayList retval = new ArrayList();


int dcount = _dest.Count();
int scount = _source.Count();

ตารางที่ 4.1 แสดงแอคชั่นที่เกิดขึ้นขณะแยกผลต่างของไฟล์ข้อมูล 2 ไฟล์


Action \ File Source File Destination File
Delete มีข้อความ ไม่มีข้อความใดๆ
if (dcount == 0){
if (scount > 0){ fg
fgsfgsretval.Add(DiffResultSpan.CreateDeleteSource(0,scount));
}
return retval;
}
Add Destination ไม่มีข้อความใดๆ มีข้อความ
if (scount == 0){

retval.Add(DiffResultSpan.CreateAddDestination(0,dcount));
return retval;
}
Replace มีแต่ข้อความในบรรทัดนั้นๆไม่เหมือนกัน (ถูกเปลี่ยนแปลง)
No Change มีเหมือนกันทั้ง 2 เวอร์ชั่น
จากตารางที่ 4.1 ซึ่งหากไม่ตรงกับ 2 กรณีแรกก็คือ Delete และ Add Destination แล้วก็จะเป็นการ
เปรียบเทียบถ้า
- มีข้อความเหมือนกันก็จะถือว่าเป็นการ Add จากเวอร์ชั่น Source
- ข้อความไม่เหมือนกันก็จะถือว่าเป็นการ Change จากเวอร์ชั่น Source
ซึ่งจะแสดงผลการ Diff ข้อมูลจริงๆจะแบ่งแอ็คชั่นทีเกิดออกเป็น 2 กรณีซึ่งก็คือ Add และ Delete
โดยที่มีกระบวนการพิจารณาดังต่อไปนี้
1. Add

จะพิจารณาว่าข้อมูลในบรรทัดนั้นๆในเวอร์ชั่นล่าสุดถูกเพิ่มมาตั้งแต่เวอร์ชั่นใดตัวอย่างเช่นแสดงในรูป
ที่ 4.3-4
ถ้ามีการแก้ไข(Change) ระหว่างเวอร์ชั่นก็จะอ้างอิงเวอร์ชั่นที่มีข้อมูลตรงกับเวอร์ชั่นล่าสุดเป็นหลัก
โดยจะเปลี่ยน Action เป็น Add เลขเวอร์ชั่นเป็นเวอร์ชั่นที่แก้ไขและมีค่าตรงกับข้อความในเวอร์ชั่นล่าสุดเช่น
แก้ไขบรรทัดแรกเวอร์ชั่นที่ 3 โดยเพิ่มข้อความว่า “, int numVersion” เข้ามาแสดงในรูปที่ 4.5-6
23

รูปที่ 4.3 ผลการ Diff ทีละ 4 เวอร์ชั่นโดยมีเฉพาะกรณี Add ข้อมูล

Version 1
private void TextDiff(string[] sFile, string dFile,int numVersion){
}
Version 2
private void TextDiff(string[] sFile, string dFile,int numVersion){
this.Cursor = Cursors.WaitCursor;
DiffList_TextFile[] sLF = new DiffList_TextFile[numVersion];
}
Version 3
private void TextDiff(string[] sFile, string dFile,int numVersion){
this.Cursor = Cursors.WaitCursor;
DiffList_TextFile[] sLF = new DiffList_TextFile[numVersion];
DiffList_TextFile dLF = null;
try{
}
Version 4
private void TextDiff(string[] sFile, string dFile,int numVersion){
this.Cursor = Cursors.WaitCursor;
DiffList_TextFile[] sLF = new DiffList_TextFile[numVersion];
DiffList_TextFile dLF = null;
try{
for(int f = 1;f < numVersion;f++){
sLF[f] = new DiffList_TextFile(sFile[f]);
}
dLF = new DiffList_TextFile(dFile);
}catch (Exception ex){
this.Cursor = Cursors.Default;
MessageBox.Show(ex.Message,"File Error");
return;
}
}
24

รูปที่ 4.4 ข้อมูลทีน่ ำามาทำาการ Diff ในรูปที่ 4.3

รูปที่ 4.5 ผลการ Diff ทีละ 4 เวอร์ชั่นโดยมีกรณี Add ข้อมูลและกรณี Change ข้อมูล
25

Version 1
private void TextDiff(string[] sFile, string dFile){
}
Version 2
private void TextDiff(string[] sFile, string dFile){
this.Cursor = Cursors.WaitCursor;
DiffList_TextFile[] sLF = new DiffList_TextFile[numVersion];
}
Version 3
private void TextDiff(string[] sFile, string dFile,int numVersion){
this.Cursor = Cursors.WaitCursor;
DiffList_TextFile[] sLF = new DiffList_TextFile[numVersion];
DiffList_TextFile dLF = null;
try{
}
Version 4
private void TextDiff(string[] sFile, string dFile,int numVersion){
this.Cursor = Cursors.WaitCursor;
DiffList_TextFile[] sLF = new DiffList_TextFile[numVersion];
DiffList_TextFile dLF = null;
try{
for(int f = 1;f < numVersion;f++){
sLF[f] = new DiffList_TextFile(sFile[f]);
}
dLF = new DiffList_TextFile(dFile);
}catch (Exception ex){
this.Cursor = Cursors.Default;
MessageBox.Show(ex.Message,"File Error");
return;
}
}

รูปที่ 4.6 ข้อมูลทีน่ ำามาทำาการ Diff ในรูปที่ 4.5


26

เนื่องจากเราพิจารณาข้อมูลในเวอร์ชั่นล่าสุดเป็นหลักจึงต้องการแค่ทราบว่าถูกเขียนมาตั้งแต่เวอร์ชั่น
ใดเท่านั้น จึงพิจารณากรณีที่เป็นการ Change ถือเป็นการ Add แทน
2. Delete
เป็นกรณีแสดงผลเพิ่มเติมว่าเคยมีข้อความใดถูกเพิ่มเข้ามาแต่ไม่มีอยู่ในเวอร์ชั่นล่าสุดแสดงในรูปที่
4.7

รูปที่ 4.7 ผลการดิฟทีละ 2 เวอร์ชั่น

Version 1
private void TextDiff(string[] sFile, string dFile,int numVersion){
this.Cursor = Cursors.WaitCursor;
DiffList_TextFile[] sLF = new DiffList_TextFile[numVersion];
}
Version 2
private void TextDiff(string[] sFile, string dFile,int numVersion){
this.Cursor = Cursors.WaitCursor;

รูปที่ 4.8 ผลการดิฟทีละ 2 เวอร์ชั่น(เลื่อนเคอร์เซอร์ลงมา)

รูปที่ 4.9 ข้อมูลที่นำามาทำาการ Diff ในรูปที่ 4.7 และ 4.8

เมื่อเลื่อนเคอร์เซอร์ลงมาดังแสดงในรูปที่ 4.9 จะเป็นการแสดงข้อความที่เคยมีอยู่ในเวอร์ชั่นก่อนและ


บอกด้วยว่าถูกลบที่เวอร์ชั่นใดตามเลขในคอลัมน์ Version ซึ่งข้อความดังกล่าวไม่มีในเวอร์ชั่นล่าสุด
27

ซึ่งในการนำาไปใช้พิจารณาจริงจะมองแค่ว่าถูกเพิ่มมาตั้งแต่เวอร์ชั่นใดดังนั้นเราจึงซ่อนข้อความที่เคย
ถูกลบไว้โดยจะแสดงก็ต่อเมื่อเอาเคอร์เซอร์ไปคลิกที่บรรทัดดังกล่าว
28

บทที่ 5
บทสรุปและข้อเสนอแนะ

5.1 บทสรุป

เนื่องมาจาก การพัฒนาซอฟต์แวร์หรือเอกสารในปัจจุบันล้วนเป็นงานขนาดใหญ่และพัฒนาโดยผู้
พัฒนาหลายบุคคล การนำาโปรแกรมจำาพวกจัดการเอกสารเช่น Microsoft Visual SourceSafe หรือ CVS มาใช้
ถือเป็นการเพิ่มความปลอดภัยและจัดการเอกสารได้ดียิ่งขึ้น ซึ่งถ้าเรามีซอฟต์แวร์ที่สามารถวิเคราะห์ข้อมูล
เอกสารทุกเวอร์ชั่นพร้อมๆกันก็ยิ่งทำาให้กระบวนการต่างๆมีมีประสิทธิภาพ ถูกต้องและรวดเร็วยิ่งขึ้น
เราได้พัฒนาโปรแกรมซึ่งมีความสามารถเหมือนโปรแกรม Microsoft Visual SourceSafe ที่สามารถที่
จะล็อคอินเข้า Account ที่มีอยู่ จัดการข้อมูล เรียกดูข้อมูลจากฐานข้อมูลของ Microsoft Visual SourceSafe
ได้เหมือนตัวโปรแกรม Microsoft Visual SourceSafe ทุกประการ โดยเราเพิ่มความสามารถที่จะแสดงผล Diff
ได้ทุกเวอร์ชั่นพร้อมๆกันในหน้าต่างแสดงผลเดียว ซึ่งจะแสดงผลการ Diff ในรูปแบบเวอร์ชั่นล่าสุด ว่าข้อมูลใน
บรรทัดนั้นๆถูกเพิ่มมาตั้งแต่เวอร์ชั่นใด เคยมีข้อมูลใดถูกลบออกไปบ้างในบรรทัดนั้นๆ
โดยเป้าหมายของการแสดงผลรูปแบบนี้ก็เพื่อให้สามารถนำาการแสดงผลรูปแบบดังกล่าวมาพิจารณา
ประสิ ท ธิ ภ าพ ความถู ก ต้ อ งและวิ เ คราะห์ ค วามก้ า วหน้ า ในระบบการพั ฒนาซอฟต์ แ วร์ ที่ ต้ อ งการการวั ด
ประสิทธิภาพ อีกทั้งนำาข้อมูลการแสดงผลนั้นมาตรวจสอบเช่น ถ้าเราพบบั๊กในซอฟต์แวร์ตั้งแต่เวอร์ชั่นใดเราก็
พิจารณาดูว่าในเวอร์ชั่นนั้นมีข้อมูลในถูกเพิ่มเข้าไปบ้าง ก็เป็นการทำาให้พิจารณาหาข้อผิดพลาดในซอฟต์แวร์
ได้ดียิ่งขึ้น

5.2 ปัญหาที่พบ
1.จากการดำาเนินงานมา ถือว่างานค่อนข้างล่าช้าเมื่อเทียบกับตัวโปรแกรมที่พัฒนาออกมาจริงๆเนื่อง
มาจากเข้าใจความต้องการผิดพลาดในช่วงการดำาเนินงานเทอมแรก และมีการเปลี่ยนแปลงตัวโปรแกรมหลาย
อย่างไม่ว่าจะเป็นช่วงแรกของการพัฒนาโปรแกรมจะที่ใช้ภาษา C++ ในการพัฒนาอัลกอริทึมแต่เนื่องด้วย
ประสิทธิภาพและการแสดงผลที่ดีกว่าจึงเปลี่ยนมาใช้อัลกอริทึมอีกตัวที่พัฒนาด้วยภาษา C# แทนจึงเสียเวลา
ในการศึกษาพอสมควร
2.การเรียกใช้ออปเจ็คของ Microsoft Visual SourceSafe นั้นออปเจ็คหลายตัวเป็นเหมือนแบล็คบ๊
อกซ์ที่ไม่สามารถแก้ไขภายในออปเจ็คได้ทำาให้เราเสียเวลาศึกษาและทำาความเข้าใจพอสมควร เราจึงพัฒนา
29

โดยใช้ออปเจ็คพื้นฐานที่เรียกใช้ได้บางตัวและนำามาประยุกต์ในแอปพริเคชั่นของเราเอง
3. การแสดงผลในรูปแบบของการลบ (Delete) นั้นมีข้อจำา กัดและข้อผิดพลาดได้ง่ายเนื่องความจา
กอัลกอริทึมที่ใช้ไม่สามารถแยกแยะคอมเม้นท์ เว้นวรรค แท็ป เลื่อนบรรทัดได้อย่างสมบูรณ์จึงทำาให้การแยก
ความแตกต่างมีข้อผิดพลาดได้ส่วนการแสดงผลการลบนี้

5.3 แนวทางการแก้ปญ
ั หาและข้อเสนอแนะ
1. ศึกษาอัลกอริทึมในการ Diff เพิ่มขึ้นหลายๆตัวเพื่อนำา มาพัฒนาให้มีความสามารถแยกความแตก
ต่างได้ถูกต้องยิ่งขึ้น
2. เปลี่ ย นแปลงโปรแกรมจั ด การเอกสารจาก Microsoft Visual SourceSafe เป็ น ทู ล ตั ว อื่ น ที่ เ ป็ น
โอเพ่นซอร์สเช่น CVS เพื่อให้สามารถนำาข้อมูลมาจัดการได้อย่างอิสระและพัฒนาได้ง่ายยิ่งขึ้น
30

ภาคผนวก ก
การติดตั้ง

การติดตั้งโปรแกรม Multi-Version Text Viewer / Editor นั้นต้องการซอฟต์แวร์ดังต่อไปนี้


1. Microsoft Visual SourceSafe ใช้ เ ป็ น ตั ว เวอร์ ชั่ น คอนโทรลและเป็ น ฐานข้ อ มู ล ของการเก็ บ แฟ้ ม
เอกสาร
2. Microsoft .NET Framework 2.0 ใช้เป็นตัวรันไทม์(Runtime)ในการรันโปรแกรม Multi-Version Text
Viewer / Editor
3. Microsoft Visual Basic Runtime 6.0 ใช้เป็นตัวรันไทม์(Runtime)ในการรันโปรแกรม Multi-Version
Text Viewer / Editor

เมื่อติดตั้งโปรแกรมดังกล่าวก็เป็นการติดตั้งโปรแกรม Multi-Version Text Viewer / Editor


โดยทำาการนำาไฟล์ COE2005-06_MVTVE.zip นี้แตกไฟล์ไว้ใน C:\Program Files\ แสดงในรูปที่ ก.1-
2

รูปที่ ก.1 เมื่อแตกไฟล์ COE2005-06_MVTVE.zip มาไว้ใน C:\Program Files\ จะได้โฟลเดอร์ดังรูป


31

รูปที่ ก.2 ภายในโฟลเดอร์ประกอบด้วยไฟล์ดังรูป


32

ภาคผนวก ข
การใช้งาน

การใช้งานตัว Multi-Version Text Viewer / Editor ทำาได้โดยดับเบิ้ลคลิกที่ไฟล์


VSS_multiversion.exe
ก็จะเข้าสู่การใช้งานแสดงในรูปที่ ข.1

รูปที่ ข.1 เป็นหน้าล็อคอินเพื่อเข้าสู่ฐานข้อมูลของ Microsoft SourceSafe

เมื่อทำาการล็อคอินเข้ามาแล้วจะเข้ามาสู่หน้าหลักของโปรแกรมซึ่งมีอินเตอร์เฟทเหมือนตัว Microsoft
SourceSafe
33

รูปที่ ข.2 หน้าหลักของโปรแกรม

โดยถ้า การใช้ งานจะเหมื อ นตั ว SSEXP.EXE ของ Microsoft SourceSafe ทุก อย่ า งโดยเราจะเพิ่ ม
ความสามารถในการแสดงผลต่างพร้อมๆกันทุกเวอร์ชั่นซึ่งเป็นเป้าหมายหลักของโครงการของเรา ซึ่งเข้าสู่การ
ใช้ ง านได้ โ ดยการคลิ ก ขวาที่ ไ ฟล์ ที่ ต้ อ งการจะแสดงผลต่ า งพร้ อ มๆกั น ทุ ก เวอร์ ชั่ น ที่ อ ยู่ ใ นฐานข้ อ มู ล ของ
Microsoft SourceSafe ในหน้าหลักของโปรแกรมดังรูปที่ ข.3

รูปที่ ข.3 เมื่อคลิกขวาที่ไฟล์ที่ต้องการจะแสดงผลต่างทุกเวอร์ชั่น

จากนั้นเลือก Show History และกดที่ปุ่ม Diff All โดยแสดงในรูปที่ ข.4-5


34

รูปที่ ข.4 หลังจากเลือก Show History จะขึ้นหน้าต่างดังรูป

รูปที่ ข.5 เมื่อกดปุ่ม Diff All ก็จะเป็นการแสดงผลต่างทุกๆเวอร์ชั่น

ข้อควรทราบ : ถ้ามีการแจ้ง Error ขึ้นขณะทำาการแสดงผลต่างทุกๆเวอร์ชั่นให้ทำาการลบโฟลเดอร์ test


ที่อยู่ในไดร์ฟ C:\test ออกก่อนที่จะทำาการรันโปรแกรมใหม่อีกครั้ง
35

บรรณานุกรม

http://msdn.microsoft.com/vstudio/previous/ssafe/productinfo/ ค้นคว้าเมื่อวันที่ 5 ก.ค. 2548


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvss/html/vssauto.asp
ค้นคว้าเมื่อวันที่ 5 ก.ค. 2548
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvss/html/msdn_vssole.asp
ค้นคว้าเมื่อวันที่ 5 ก.ค. 2548
http://support.microsoft.com/default.aspx?scid=kb;EN-US;169928 ค้นคว้าเมื่อวันที่ 5 ก.ค. 2548
http://www.codeproject.com/cpp/vdiff.asp ค้นคว้าเมื่อวันที่ 11 ธ.ค. 2548
http://www.codeproject.com/tools/difftool.asp ค้นคว้าเมื่อวันที่ 11 ธ.ค. 2548
http://www.codeproject.com/tools/rgdiff.asp ค้นคว้าเมื่อวันที่ 15 ธ.ค. 2548
http://www.thefreecountry.com/programming/versioncontrol.shtml ค้นคว้าเมื่อวันที่ 10 พ.ย. 2548

You might also like