วันอาทิตย์ที่ 26 กรกฎาคม พ.ศ. 2558

ชวนคุยจาวา part 14-1 : มาสร้าง DocumentLocker กันเถอะ

Java OOP Example
: DocumentLocker part 1/2

>> ได้หยิบยืมหนังสือของรุ่นน้องมาอ่าน เป็นหนังสือเก่าแล้ว หลายคนชอบ หลายคนว่าซับซ้อน หลายคนไม่เห็นคุณค่าดราม่าไปต่างๆนานา แต่สำหรับผมที่ต้องการตัวอย่าง ขึ้นชื่อว่าเป็นตัวอย่างไม่ว่าจะดีหรือแย่ ก็ดีกว่าไม่มีเลย สำคัญคือมันแจ๋วมากครับ

>> DocumentLocker ว่าด้วยเรื่องเอกสาร (document) ที่แบ่งออกเป็นสองประเภท
1) อ่านได้อย่างเดียว (read only)
2) กับอ่านและเขียนได้ (read write)
แน่ล่ะว่าเราต้องกำหนดกติกาของเอกสารขึ้นมาก่อน กติกาที่ว่านี้ก็คือ interface ครับ ให้ชื่อว่า Document เห็นไหม คิดถึงการออกแบบ พาไปหา interface ก่อนเลย

public interface Document {
String read();
void write(String content);
}

เจ้านี่ทำได้สองอย่าง อ่าน (read) กับเขียน (write) ตามแนวคิดแป๊ะซะ

>> ในระบบต้องมีเรื่องการแจ้งเตือนหรือแจ้งความผิดพลาดด้วย เผื่อว่าผู้ใช้ (user) บางคนเลือกเอกสารที่อ่านได้อย่างเดียวแล้วพยายามจะเขียนอะไรลงไป? (เขาทำแบบนั้นไปทำไมหว่า?) งั้นสร้างคลาสข้อความออกมารองรับสิ่งนี้ก็แล้วกัน

public class Messager {
public void showException(String exception) {
System.out.println("Exception: " + exception);
}

public void showNotification(String notification) {
System.out.println(notification);
}
}

คลาสนี้ทำอะไร คลาสนี้นำเสนอข้อความสองประเภท
1) exception หรือความผิดพลาด (บอกเลยว่าความผิดพลาดคนละเรื่องกับ error นะครับ เรารู้ว่าผิดพลาดยังแก้ไขได้ แต่ถ้า error นี่เงิบนะครับบอกตง)
2) notification หรือแจ้งให้ทราบ อย่างนั้นอย่างนี้ อะไรงี้

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

public abstract class AbstractDocument implements Document {
protected String content;
protected final Messager messager;

public AbstractDocument(String content) {
this.content = content;
messager = new Messager();
}
}

จะเห็นว่าคลาสนี้บรรจุคลาส Message พร้อมกับต้องการให้คลาสสืบทอดใส่เนื้อหา (content) เอกสารเข้ามา

>> เอกสารที่สามารถอ่านได้อย่างเดียว ตั้งชื่อว่า ReadOnlyDocument สืบทอดจากคลาส AbstractDocument ข้างต้นจ้า

public class ReadOnlyDocument extends AbstractDocument {

public ReadOnlyDocument(String content) {
super(content);
}

@Override
public String read() {
return content;
}

@Override
public void write(String content) {
messager.showException("This is read-only ducument, you cannot write to it.");
}
}

เมื่อพยายามจะเขียนเนื้อหาเข้าไปใหม่ ซึ่งตัวเอกสารไม่อนุญาต ก็จะได้ exception กลับไปว่า เอกสารนี้ไม่สามารถเขียนเนื้อหาเข้าไปนะจ๊ะ

>> เอกสารที่สามารถอ่านและเขียนได้ในหนึ่งเดียว ตั้งชื่อว่า ReadWriteDocument สืบทอดจากคลาส AbstractDocument เช่นกัน

public class ReadWriteDocument extends AbstractDocument {

public ReadWriteDocument(String content) {
super(content);
}

@Override
public String read() {
return content;
}

@Override
public void write(String content) {
this.content = content;
}
}

>> ดูเหมือนว่าทุกอย่างพร้อมทดสอบกันแล้ว แต่...เรามาสร้างตัวช่วยสร้างเอกสารกันดีกว่า เพื่อความสะดวกสะบาย เอาเป็นโรงงานผลิตเอกสาร ที่เพียงเราต้องการเอกสารประเภทไหน ก็แค่ระบุลงไปพร้อมกับเนื้อหาของเอกสารนั้น ใช่ครับผม กรณีนี้เข้าข่ายของ factory pattern

public class DocumentFactory {
public Document get(DocumentSpec documentSpec, String content) {
Document document = null;
switch (documentSpec) {
case READ_ONLY:
document = new ReadOnlyDocument(content);
break;
case READ_WRITE:
document = new ReadWriteDocument(content);
}

return document;
}
}

ส่วนค่าคงที่ที่ใช้ก็คือ enum ดังนี้จ๊ะ

public enum DocumentSpec {
READ_ONLY, READ_WRITE
}

>> สุดท้ายเราจึงสร้างคลาสทดสอบ โดยขอเอกสารจาก factory แล้วพยายามเขียนเนื้อหาลงไป ตามด้านล่างเลยฮับ

public class Program {
public static void main(String[] args) {
DocumentFactory factory = new DocumentFactory();

Document readOnlyDocument = factory.get(DocumentSpec.READ_ONLY, "AAA");
Document readWriteDocument = factory.get(DocumentSpec.READ_WRITE, "BBB");

readOnlyDocument.write("CCC");
System.out.println(readOnlyDocument.read());
System.out.println("--------------------");

readWriteDocument.write("CCC");
System.out.println(readWriteDocument.read());
System.out.println("--------------------");
}
}

>> ผลลัพธ์คือเอกสารที่อ่านได้อย่างเดียวมีเนื้อหาเป็น AAA แสดง exception ออกมา ส่วนเอกสารที่อ่านและเขียนได้มีเนื้อหาเป็น BBB เนื้อหาจะถูกเปลี่ยนเป็น CCC ครับ ตามนี้

Exception: This is read-only ducument, you cannot write to it.
AAA
--------------------
CCC
--------------------

>> part ต่อไปของเรื่องเดียวกันนี้จะเพิ่มความสามารถให้เอกสารทั้งสองประเภทสามารถเข้ารหัสได้ คือมีรหัสผ่าน ถ้าต้องการจะใช้ไม่ว่าจะอ่านหรือเขียนก็ต้องใส่รหัสให้ถูกต้องก่อน ถือว่าเป็นหัวใจของเรื่องนี้ คืนนี้สวัสดีครับ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น