ปกติแล้วเวลาเราเขียน method อะไรขึ้นมาเราก็มักจะสร้างมันจาก class diagram ที่มีคนออกแบบมาให้ หรือหากเราทำการ design class เอง แล้วก็สร้าง method ที่จำเป็นไว้ เราก็มักจะเขียนแค่ implementation ไว้ก่อน ถ้าเป็น non-void method เราก็มักจะเขียนประโยค return พร้อมค่าส่งกลับอะไรซักค่า เช่น 0 หรือ null เพื่อให้มันแค่ compile ผ่าน
public int Generate() {
return 0;
}
หรือ
public Shape Inflate(int dw) {
return null;
}
แต่ว่าถ้าเราเขียน method เยอะ ๆ แล้วลืมทำให้เสร็จ แล้วถ้ายิ่งเรายุบ(folding) นั้นไว้ด้วย พอเรา coding ไปซักพักจนเกือบเสร็จ เราก็มักจะเทสต์โปรแกรมของเรา แล้วถ้ามันเกิดผ่านขึ้นมา ก็จะปล่อยมันไปจนลืมว่าเรายัง implement ไม่ครบ
จริง ๆ แล้วเรามักจะไม่ลืมอะไรติงต๊องขนาดนั้นหรอกครับ แต่ถ้าเป็นแบบว่ามี condition เยอะ ๆ แล้วแบบว่าเขียนไป if นึงแล้วเว้นอีก if นึงเอาไว้ ดูเผิน ๆ ก็คงคิดว่าเสร็จแล้ว ประมาณว่า
public int Generate() {
int ret = 0;
if(isFull) {
/**********************
* 100+ lines of code *
**********************/
ret = (dim + last) / cnt;
} else {
// not implemented
}
return ret;
}
ถ้ารันแล้วเจอ bug กว่าจะ debug อันนี้เจอก็คงนานอยู่ ในหนังสือ The pratice of programming ของ Kernighan & Pike แนะนำว่าควรตั้งค่าตัวแปร int เป็นเลขฐาน 16 ตัวนึงคือ 0XDEADBEEF รับรองว่าตอน debug ไม่เห็นก็ให้มันรู้ไป
แต่สำหรับ .NET แล้วเรามีวิธีนึงที่ดีกว่านี้ครับ คือการเขวี้ยง ( throw) exception ตัวนึง ซึ่งมีไว้เฉพาะสำหรับการนี้เลย นั่นคือ
System.NotImplementedException
วิธีใช้ก็ง่ายครับ ก็สั่ง throw มันออกไปเลยดังนี้ครับ
public int Generate() {
int ret = 0XDEADBEEF;
if(isEditable) {
/**********************
* 100+ lines of code *
**********************/
ret = (dim + last) / cnt;
} else {
// not implemented
throw new NotImplementedException();
}
return ret;
}
แต่ถ้าจะให้ดีระบุสาเหตุลงไปด้วยก็ดีครับ เวลาดูด้วย debugger จะได้สื่อความหมายดังนี้
public Shape Inflate(int dw) {
throw new NotImplementedException("Method 'Shape Inflate()' have not complete");
return null;
}
อ้อ วิธีนี้จะใช้ได้ผลสำหรับพวกที่ไม่ได้ดัก exception แบบครอบจักรวาล แบบหนังสือไทยหลาย ๆ เล่มใช้กัน ดัง code ด้านล่างนี้นะครับ
จำไว้ว่าอย่าใช้นะครับ ไม่งั้นจะไม่แก้ปัญหาอะไรเลย เพราะ exception มีไว้เพื่อฟ้อง error ที่เกิดขึ้น
Shape s = new Shape(ShapeStyle.Oval, 5); //...
try {
s = s.Inflate(s.Size / 2);
//...
catch(Exception) {
// don't do anything
}
ไหน ๆ ก็กล่าวถึง exception กล้ว ถ้าไม่พลาด ตอนหน้าจะมาพูดถึงวิธีใช้งาน exception และวิธีการดัก exception เพื่อตรวจสอบปัญหาใน code ที่เขียนกัน
Google Search
Custom Search
ผลการค้นหา
วันอังคารที่ 10 กุมภาพันธ์ พ.ศ. 2552
สมัครสมาชิก:
ส่งความคิดเห็น (Atom)
ไม่มีความคิดเห็น:
แสดงความคิดเห็น