ความรู้มากมาย แต่เริ่มต้นเขียนโปรแกรมไม่ถูกซักที ตอนที่ 2 – การออกแบบ(2)

หลังจากที่หายไปนาน (ยุ่งๆ + ขี้เกียจ) เรามาต่อตอน 2 กันดีกว่า สำหรับซีรีส์  “ความรู้มากมาย แต่เริ่มต้นเขียนโปรแกรมไม่ถูกซักที” ของเรา

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

โจทย์

ต้องการเขียนโปรแกรมร้านเช่าหนังสือ โดยกำหนดคุณสมบัติของโปรแกรมดังนี้

  • หนังสือมี 3 ประเภท
    • Comic Book
      • Title
      • Volume
      • Publisher
      • Illustrator
      • Price
      • Barcode
      • ยืมได้ 1 วัน
    • Magazine
      • Title
      • Volume
      • Publisher
      • Price
      • Period (Weekly / Biweekly / Monthly / Other)
      • Barcode
      • ยืมได้ 3 วัน
    • Pocket Book
      • Title
      • ISBN
      • Publisher
      • Price
      • Author
      • Barcode
      • ยืมได้ 7 วัน
  • Feature
    • ทำการ List รายชื่อหนังสือในระบบออกมาแสดงได้
    • ค่าเช่า คิดเป็น 10% ของราคาหนังสือโดยปัดเศษลง
    • ยืมหนังสือโดยระบุหมายเลข ISBN
      • กรณีที่หนังสือถูกยืมไปแล้ว ให้แจ้งว่าหนังสือจะคืนภายในวันที่เท่าไร
      • กรณีที่หนังสือยังอยู่ ให้ทำการยืมหนังสือ และแจ้งว่าต้องมาคืนวันที่เท่าไร
    • คืนหนังสือโดยระบุหมายเลข ISBN
      • หากเกินวันที่ต้องคืน ให้ทำการเรียกเก็บค่าปรับเพิ่มเติม
  • Condition
    • ไม่ต้องเก็บข้อมูลใน Database
ซึ่งสิ่งที่เรายังคงติดค้างกันอยู่ ก็คือเรื่องของการออกแบบหนังสือนั่นเอง

การออกแบบหนังสือ
สังเกตุได้ว่า หนังสือของเรานั้น แบ่งเป็น 3 ชนิดด้วยกัน ก็คือ ComicBook, Magazine, PocketBook ซึ่งแต่ละชนิด เราก็ควรจะทำให้เป็น Class ของตัวเอง เพื่อช่วยให้เรามีความยืดหยุ่นในการทำงานขึ้น ซึ่งเรื่องของ Attribute ของแต่ละ Class นั้น จะไม่ขอพูดถึง เพราะคิดว่า น่าจะทำกันได้ไม่ยาก
แต่ปัญหาของการสร้าง Class ขึ้นมาหลายๆ Class ก็คือ เมื่อต้องอยู่ภายใต้การจัดการแบบเดียวกัน (ยืม, คืน หนังสือ) การที่เรามีหลาย Class เราก็จะต้องมีการจัดการที่หลากหลายด้วย เช่น สมมุติเราจะทำการยืมหนังสือ ด้วย Method Rent() โดยมี Parameter เป็นชนิดของหนังสือ Comic Book, Magazine, PocketBook โดยทำการ override กัน ซึ่งจะทำให้เราเหนื่อยมากในการทำงาน เพราะเราต้องมาเขียนอะไรซ้ำๆทุกรอบในแต่ละ Method และที่แย่กว่าคือ หากเราต้องการแก้ไขการทำงานใน Method ใดๆ แล้ว เราก็จะต้องตามหาและไปแก้ไขทุกที่ให้ครบ
จะดีกว่าไหม ถ้าเราจะยุบ Override ของ Rent(ComicBook), Rent(Magazine), Rent(PocketBook) ให้เหลือแค่ Rent(Book)
คำตอบก็คือ ทำได้ ซึ่งวิธีการก็คือ ให้เราสร้าง Class Book ขึ้นมาก่อน แล้วให้ Class ComicBook, Magazine, PocketBook ทำการสืบทอด Class Book อีกทีหนึ่ง ทีนี้ เราก็สามารถรับ Parameter เป็น Book อย่างเดียวได้แล้ว เพราะ “Derived is a Parent”
ลองมาดูตัวอย่างง่ายๆเช่นการแสดงชื่อหนังสือกันดีกว่า โดยกำหนด Class Book เป็นดังนี้
 (JAVA)public abstract class Book {
private String Name;

public Book(String Name){
this.Name = Name;
}

public String getName()
{
return this.Name;
}
}

สาเหตุที่ทำเป็น Abstract Class เพราะเราไม่ต้องการให้ใครประกาศ Object เป็น Book เฉยๆทีนี้ก็เอา Class ทั้ง 3 มาสืบทอดซะ

 (JAVA)

public class ComicBook extends Book {
public ComicBook(String Name) {
super(Name);
}
}


public class Magazine extends Book {
public Magazine(String Name) {
super(Name);
}
}


public class PocketBook extends Book {
public PocketBook(String Name) {
super(Name);
}
}

ทีนี้ ไม่ว่าเราจำทำงานอะไรกับเหล่าหนังสือของเรา เราก็สามารถทำได้ง่ายแล้ว ไม่ว่าจะเป็นการเก็บใน ArrayList หรือการเรียกใช้ผ่าน Method ต่างๆ ดังตัวอย่างดังนี้

import java.util.ArrayList;


public class MainClass {


static ArrayList bookList = new ArrayList();
public static void main(String[] args) {

bookList.add(new ComicBook(“Conan”));
bookList.add(new Magazine(“FHM”));
bookList.add(new PocketBook(“The Travel”));

for(int i = 0; i < bookList.size(); i++)
printName(bookList.get(i));
}

public static void printName(Book book)
{
System.out.println(book.getName());
}


}

สังเกตุได้ว่า เราสามารถเก็บหนังสือแต่ละชนิดไว้ที่เดียวกันได้ (bookList) และยังเรียกผ่าน Method เดียวกันได้อีก ซึ่งการออกแบบ Class ของหนังสือ ก็ได้จบลงเพียงเท่านี้ ส่วน Attribute การทำงานอื่นๆ ก็ขอให้ผู้ใช้แต่ละคนลองไปศึกษา และเขียนเพิ่มเติมกันเอง จะมีข้อสังเกตุให้เห็นเล็กน้อยคือ Attribute Period ของ Magazine ตรงนี้หากอยากให้จัดการได้ง่าย ไม่แนะนำให้ใช้เป็น String นะครับ แต่ให้ลองศึกษา Enum มาใช้งานจะดีกว่า

จริงๆแล้ว วิธีการของบทความนี้ ก็เป็นส่วนหนึ่งที่ได้จากการศึกษา บทความที่ผ่านมา นั่นเอง ฉะนั้น ความรู้ที่เราได้มาจากการศึกษาใดๆนั้น มันจะสามารถถูกนำมาใช้วันใดวันหนึ่งอย่างแน่นอน

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

One thought on “ความรู้มากมาย แต่เริ่มต้นเขียนโปรแกรมไม่ถูกซักที ตอนที่ 2 – การออกแบบ(2)

  1. import java.util.ArrayList; คือ import ไฟล์ไหนเข้าไปหรอครับ

Leave a Reply

Your email address will not be published. Required fields are marked *