Implementation Inheritance #4 : .Net Example

    ผมเริ่มเบื่อทฤษฎีแล้ว เขียนมาตั้งยาวเรื่อง Implementation Inheritance ผมว่าคุณก็คงเบื่อเหมือนผม ผมก็เลยคิดว่าหาตัวอย่างที่มันเห็นถึงการประยุกต์ใช้ Implementation Inheritance ผมว่ามันยากนะที่จะหาตัวอย่างที่ไม่ง่ายจนเกินไป จนไม่เห็นประโยชน์ของมัน แต่ก็ต้องไม่ยากเกินไป คุณจะได้ไม่ต้องพะวงในเนื้อหาที่ไม่เกี่ยวกับ Implementation Inheritance ผมนั่งนึกอยู่นาน จนมาเปิดดูนิตยสารคอมพิวเตอร์ของไทยเล่มหนึ่ง มีแนะนำโปรแกรม Freeware ชวน download ที่ชื่อว่า Convert 4.10 มันเป็นโปรแกรมที่สามารถแปลงจากหน่วยวัดหนึ่งเป็นอีกหน่วยวัดหนึ่ง มีให้เลือกได้เยอะเลย ผมเลยได้แนวคิดว่าเอาเรื่องการแปลงหน่วยนี่แหละ เป็นตัวอย่างที่ดีเลย แถมยังผมจะแสดงให้เห็นถึงศักยภาพของ .Net ที่ยังไม่เคยมีใครทำได้มาก่อน ตัวอย่างเดียว ได้สองเรื่องเลย

ไปดูบริษัท คิดลึกละมุนภัณฑ์ จำกัด

    เรามาสมมุติกันหน่อยดีกว่า ว่าคุณสุภาพทำงานให้กับบริษัทคิดลึก บริษัทนี้เป็น Software House (ชื่อก็บอกอยู่แล้ว) เขียน Software เป็น Package ขาย มุ่งเน้นตลาด .Net อย่างเดียว ไม่จับจดเอาทุกอย่าง เครื่องมือที่ใช้ก็เป็น VB.Net ใช้ตัวนี้อย่างเดียวจนเป็นเซียน

    วันหนึ่งทีมงานมีโครงการพัฒนา Software Package ตัวใหม่ ยังไม่ค่อยมีใครทำ เกี่ยวกับระบบ Logistics คือระบบจัดการส่งสินค้าให้ถึงมือผู้รับ คาดว่าคงขายได้ดี คุณสุภาพซึ่งเป็นโปรแกรมเมอร์ utility (จับฉ่าย) ได้รับมอบหมายให้เขียน class ในการแปลงหน่วยจากหน่วยหนึ่งไปยังอีกหน่วยหนึ่ง ซึ่งระบบนี้ต้องใช้  คุณสุภาพได้โจทย์แล้วก็กลับไปนั่งโต๊ะแล้วบรรเลงมาเป็น code ชื่อ unit.vb  คุณสุภาพ compile โปรแกรมนี้ด้วย

 

DOS Prompt

C:\cs>vbc /target:library unit.vb
Microsoft (R) Visual Basic.NET Compiler version 7.00.9030
for Microsoft (R) .NET Framework Common Language Runtime version 1.00.2204.21
Copyright (C) Microsoft Corp 2000. All rights reserved.


C:\cs>dir unit.*
Volume in drive C has no label.
Volume Serial Number is 037D-11D2

Directory of C:\cs

03/09/2001      12:42p     1,072      unit.vb
03/09/2001      02:59p     3,584      unit.dll

2 File(s) 4,656 bytes
0 Dir(s) 6,753,353,728 bytes free

C:\cs>

    ผลลัพธ์ที่ได้จะเป็น assembly ใหม่ที่ชื่อว่า unit.dll และ assembly นี้เองสามารถเอาไปใช้กับโปรแกรมอะไรก็ได้ โดยการ compile แล้วเติม command line /r:unit.dll

 ในที่สุดก็สมใจระบบ Logistics ก็บรรลุวัตถุประสงค์ขายได้ แต่ก็ไม่มากเท่าที่อยากให้เป็น นั่นก็เป็นเพราะระบบนี้กลุ่มเป้าหมายค่อนข้างเล็ก ต้องเป็นบริษัทขนาดกลางถึงใหญ่เท่านั้นถึงจะใช้ได้ ยิ่งมี software จากต่างประเทศที่ดูน่าเชื่อถือกว่าอีก ก็เลยสู้ไม่ค่อยไหว

    วันหนึ่งมีการประชุมเครียดได้ข้อสรุปว่า เราน่าจะ Shareware ขายดีกว่าเอาตลาดชาวบ้านดีกว่า ตอนนี้เรื่องสุขภาพน่าจะเป็นเรื่องที่ผู้คนสนใจ ทางบริษัทจึงวางแผนการเขียนโปรแกรม วิเคราะห์การออกกำลังกาย เช่น วิ่ง ว่ายน้ำ หรือ ปั่นจักรยาน น่าจะไปได้สวย ในการนี้ code ของคุณสุภาพที่เคยเขียนไว้ unit.vb ถูกนำเอามาใช้ใหม่ได้โดยไม่ต้องแก้เลย นี่คือความสามารถอย่างหนึ่งของ OOP คือความสามารถในการ re-use code ได้

   เมื่อโปรแกรมถูกเขียนเสร็จ บริษัทคิดลึกก็ทำตัว installer เป็น hcalc.exe แล้วแจกไปใน Internet

กลับมาที่บ้านของคุณ

    คุณเองนั่งอยู่หน้าจอมาหลายปีแล้ว เขียนโปรแกรมแลกข้าว ยิ่งนั่งยิ่งรู้สึกว่าเก้าอี้ทำไมมันชักจะเล็กลง อะไรๆ มันดูอึดอัดไปหมด น้ำหนักขึ้นไปอีกสิบกิโล อย่ากระนั้นเลยมาออกกำลังกายกันดีกว่า คุณในฐานะคนคอมพิวเตอร์ จะออกกำลังกายทั้งที ต้องมีหลักการไปหาใน Internet (โลกมันเป็นขนาดนั้นแล้วหรือ?) ไปพบโปรแกรมน่าสนใจชื่อ hcalc.exe คุณเลยสนใจเอามา install พอ install มันแตกตัวมันเองออกเป็นหลาย files หนึ่งในนั้นคือ unit.dll คุณรู้ได้โดยญานว่ามันเป็น assembly เก็บเรื่องการแปลงหน่วยด้วย คุณเองก็กำลังรับงานเขียนโปรแกรมเก็บ stock อะไหล่อยู่ ดีทีเดียวเอามาใช้เลย คุณเขียนโปรแกรมทดสอบด้วย C# ดังนี้ครับ (copy unit.dll มาที่ directory ของคุณก่อน อย่าลืม)

test_unit.cs

using System;
class Start
{
	public static void Main()
	{
		Unit unit = new Unit();
		unit.FromYard(15);
		Console.WriteLine(unit.ToInch());
	}
}

DOS Prompt

C:\cs>csc /r:unit.dll test_unit.cs
Microsoft (R) Visual C# Compiler Version 7.00.9030 [CLR version 1.00.2204.21]
Copyright (C) Microsoft Corp 2000. All rights reserved.


C:\cs>test_unit
539.99837136

C:\cs>

    วาว! 15 หลามี 540 นิ้วนั่นเองเพิ่งรู้ เห็นรึยังครับบน .Net คุณเขียนโปรแกรมจากภาษาหนึ่ง แล้วเอาไปใช้ในภาษาใดๆ ที่อยู่บน .Net ด้วยกันได้  (หมายเหตุ จะเห็นได้ว่าตัวเลขมันไม่ลงตัว มันเป็นปกติของ ตัวแปรประเภท double อยู่แล้ว ซึ่งไม่แม่นร้อยเปอร์เซ็น เอาไว้ถ้ามีเวลาผมจะคุยเรื่องตัวเลขเพี้ยนแบบนี้)

    คุณก็ใช้ unit.dll ผสมเข้าไปในโปรแกรมของคุณ สองเดือนต่อมา คุณก็ไปที่บริษัทกะจะรับทรัพย์ แต่ก็ต้องหงายผึ่งครับเพราะ นอกจาก Bug ที่เจอเป็นตันแล้ว ยังมาเจอว่า unit.dll มันไม่รองรับงานของคุณ อะไหล่บางตัวดันเก็บโดยใช้หน่วย หุน ซึ่งบริษัทคิดลึกเองก็ยังคิดลึกไม่พอ หน้ามืดครับ ไอ้การที่จะไปขอ source code ของบริษัทคิดลึกมันก็คงเป็นไปไม่ได้เขาคงไม่ให้แน่ ถ้าจะเขียน class นี้เองก็คงจะม้วยแน่ คิดหนักทั้งคืน กว่าจะหลับได้ก็เอาเข้าไปตีสาม ...แล้วก็ฝันว่าครูสมัยอนุบาล มาชี้ให้อ่านกอไก่ แต่ในบนกระดานมีภาษาอังกฤษคำว่า Implementaion Inheritance แล้วก็ต้องสะดุ้งตื่นครับ เพราะหนวกหูเสียงรถเก็บขยะหน้าบ้าน

    เมื่อนึกทบทวนความฝัน คุณรู้ตัวดีว่าต้องจดไว้ก่อน มิฉะนั้นถ้าเข้าห้องน้ำล้างหน้าแปรงฟันจะลืมหมด หลังจากกินข้าวเช้าแหล้วหัวแล่น เราน่าจะทำ Implementation Inheritance เลยดีกว่า คุณก็เลยเขียน class MyUnit.cs  ซึ่ง compile ด้วย

DOS Prompt

C:\cs>csc /r:unit.dll /target:library myunit.cs
Microsoft (R) Visual C# Compiler Version 7.00.9030 [CLR version 1.00.2204.21]
Copyright (C) Microsoft Corp 2000. All rights reserved.


C:\cs>

จากนั้นคุณก็เขียน code ทดสอบดังนี้

test_unit.cs

using System;
class Start
{
	public static void Main()
	{
		MyUnit unit = new MyUnit();
		unit.FromYard(1);
		Console.WriteLine(unit.ToHun());
	}
}

DOS Prompt

C:\cs>csc /r:unit.dll  /r:myunit.dll test_unit.cs
Microsoft (R) Visual C# Compiler Version 7.00.9030 [CLR version 1.00.2204.21]
Copyright (C) Microsoft Corp 2000. All rights reserved.
C:\cs>test_unit
287.999131392

C:\cs>

  คุณก็เอาไปใช้งานได้รับทรัพย์สมดังตั้งใจ ในตัวอย่างที่ผมยกให้คุณดูนี้ คุณจะเห็นได้ว่า ผมสามารถเพิ่มเติมความสามารถของ Unit จาก VB ได้ โดยใช้ภาษาอื่น ในที่นี้คือ C# เมื่อคุณเพิ่ม หุน วา ศอก เข้าไปใน class ที่ derived มา คุณก็สามารถใช้งานมันได้กลมกลืนกับชุดเดิม คุณสามารถแปลงไปและแปลงกลับ จากหุนเป็นหน่วยอะไรก็ได้ และหน่วยอะไรก็ได้เป็นหุน หวังว่าจากตัวอย่างนี้คงเห็นแนวคิดนะครับว่าจะประยุกต์ Implementation Inheritance ใช้งานได้อย่างไร