partially coding

posted on 10 Oct 2005 17:47 by tidno1 in csharp-and-dotnet

ปกติแล้วเวลาเราเขียน 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 ที่เขียนกัน

Comment

Comment:

Tweet

Reading posts like this make surfing such a <a href="http://kvmgdjy.com">plauesre</a>

#12 By h7kQdAtxR83 (37.59.146.183) on 2013-08-10 04:22

Full of salient points. Don't stop benlveiig or writing!

#11 By J4We9j2Rc (192.168.1.4, 62.73.112.167) on 2013-07-29 21:22

Google is the best search engine

#10 By CDUdXijBhm (85.255.113.78) on 2007-03-02 19:39

#9 By นุช (124.120.21.243) on 2006-12-10 21:07

#8 By นึช (124.120.21.243) on 2006-12-10 21:06

#7 By (124.120.21.243) on 2006-12-10 21:06

หนังสือเล่มนี้ดีมั๊กๆ อ่านแล้วทำตามได้หมด
โปรแกรมที่เขียนคงจะอ่านได้ง่ายมาก ช่วงนี้เพิ่งจะกลับมาอ่านรอบ 2

#6 By kaze on 2005-10-11 11:34

โห สุดยิด มีด้วย

#5 By plynoi แว่วศรี on 2005-10-10 23:00

โห เจ๊
คอมพร้อมปั๊บ ก็สาระเริ่มเลย

#4 By #G~nap# on 2005-10-10 22:25

เออ จะว่าไปตอนเขียนโปรแกรมเด๋วนี้ ไม่ค่อยคิดถึง exception เท่าไหร่เลยแฮะ ต้องมาฝึกใช้บ้างซะหน่อยแย้ว

#3 By zkan on 2005-10-10 21:41

ดักครอบจักรวาล..อืม

#2 By P.S. on 2005-10-10 18:16

เออ บทความคุณภาพว่ะอันนี้ เต็มสิบ

#1 By ลิ่ว on 2005-10-10 17:51