Category Archive บทความ

Byadmin

Overloading vs Overriding

ในเรื่องการทำ Polymorphism เรามักจะเจอ 2 คำคือ Overriding กับ Overloading ซึ่งบางครั้งสร้างความสับสนให้เราได้เหมือนกันว่า มันต่างกันอย่างไร แถมชื่อยังคล้ายๆกันเสียอีก ยิ่งบางครั้งเอาไปใช้สลับกันมั่วไปหมด

ความแตกต่างของ Overriding กับ Overloading

สิ่งที่เหมือนกันก็คือ สองอย่างนี้มันเป็นศัพท์ที่ใช้ตอนเขียน Method นะครับ

ส่วนสิ่งที่ต่างกันก็คือ

Method overriding – เป็นเรื่องของ Polymorphism มันต้องมีการสืบทอดเข้ามาเกี่ยวข้อง มีคลาสแม่ มีคลาสลูก การทำก็คือ ทำให้ method ของ class ลูก ทำงานต่างจาก ของ class แม่ ทั้งๆที่ ชื่อ กับพวกค่าที่ส่งเข้า Method เหมือนกันเด๊ะ

Method overloading –  เป็นเรื่องของการที่ Method ชื่อเดียวกัน แต่มีพวกค่าที่ส่งเข้า Method ต่างกัน จะเป็นเรื่องของ Class Class เดียวครับ บางคนบอกว่ามันไม่เกี่ยวกับเรื่อง Polymorphism แต่บางครั้งก็อาจจะถูกเรียกว่า Static polymorphism นะครับ

 

สวัสดี

 

อ้างอิง

http://www.c-sharpcorner.com/UploadFile/d0a1c8/object-oriented-programming-in-C-Sharp-net/

 

Byadmin

Polymorphism – ผ่าเหล่าผ่ากอ

ทบทวนกันก่อนเรื่อง Inherited ของ OOP โดย inherited มีประโยชน์ในการ reuse code คือมี code ต้นทางชุดเดียว แล้วสืบทอดมาที่คลาสของเรา ทำให้เราสามารถใช้ Data และ Method ของคลาสต้นทางได้

ทีนี้ถ้าเกิดว่า ถ้าเกิดเราไม่อยากให้ Method ที่สืบทอดมาทำงานเหมือนกับต้นแบบ การ inherited เพียงอย่างเดียวก็ไม่ตอบโจทย์เสียแล้ว

ดังนั้นจึงต้องใช้อีกความสามารถนึงของแนวคิดแบบ OOP คือ การทำ Polymorphism แปลๆกันมาว่าการมีหลายรูปแบบ แต่ผมขอเรียกแบบบ้านๆว่า การผ่าเหล่าผ่ากอ คือทำได้ไม่เหมือนวงศ์สาคณาญาติ (อาจจะดีกว่าหรือแย่กว่าก็ได้นะ)

ยกตัวอย่างให้เห็นภาพ สมมติ เราจะสร้างเกมล่าสัตว์ในอุทยานแห่งชาติ

อันดับแรก สมมติเราออกแบบให้มีคลาสหลักคือ Class GameObject โดย Gameobject  จะมีความสามารถในการเคลื่อนที่ ดังนั้น เราจะออกแบบคลาสนี้ให้มี Method ชื่อ Move

ต่อมาเราจะสร้าง Class ตัวละครในเกม 3 คลาส ได้แก่ เสือดำ(Panther), นายพราน(Hunter), ลูกปืน(Bullet) โดยทั้งสามคลาส สืบทอดมาจาก Class GameObject

ทั้งสามคลาสก็จะมี Method Move ที่สามารถใช้งานได้

ตัวอย่างการเรียกใช้

Panther.move()

Hunter.move()

Bullet.move()

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

ดังนั้นแต่ละตัวละคร มันมีการเคลื่อนที่ทำงานไม่เหมือนกัน การ inherited มาเพียงอย่างเดียว เลยยังไม่ตอบโจทย์ เพราะถ้าไม่ทำอะไรเพิ่ม การเคลื่อนที่ของทั้งสามก็จะเหมือนกัน คือใช้วิธีการเคลื่อนที่ตาม class ต้นทาง คือ GameObject.move()

ถ้าจะตอบโจทย์เราก็ต้องเอาความสามารถ Polymorphism เข้ามาช่วย

โดย Polymorphism พูดง่ายๆก็คือเราสามารถที่จะทำให้ Method ชื่อ Move ของแต่ละตัวละคร ทำงานต่างกันได้ โดยเขียน code ในแต่ละ class ตัวละคร ให้มันต่างกัน เราเรียกการทำแบบนี้ว่า Method overriding

ยกตัวอย่างเช่น

ในคลาส GameObject เราเขียน code ไว้ใน Method move ว่า เคลื่อนที่ได้ 10 km/hr

ทีนี้ในแต่ละคลาสตัวละคร ที่สืบทอดมา เราไม่ได้ต้องการให้เคลื่อนที่ได้ 10 km/hr ทุกตัว ดังนั้นเราต้องทำ Method overriding คือไม่ใช้ code จาก method move ของต้นแบบ แต่จะเขียนเอาเอง

ถ้าเป็นคลาสเสือดำ เราก็อาจจะเขียน Code ใน method move ของคลาสเสือดำ ว่า วิ่งได้ 50 km/hr แต่ถ้าเป็นนายพราน เราก็อาจจะเขียน code ใน method move ของคลาสนายพรานว่า ไม่ต้องเดิน นั่งเฉยๆ ก็ได้กินซุปเสือดำแล้ว

 

 

Byadmin

Inheritance – การสืบต่อเผ่าพันธ์

มนุษย์โปรแกรมเมอร์อย่างเรา มักจะขี้เกียจทำอะไรซ้ำๆ ถ้าต้องเขียนโค้ดเดิมๆ ซัก 2 – 3 รอบก็เบื่อละ แต่พอมีแนวคิดการเขียนโปรแกรมแบบ OOP มันก็ช่วยทำให้ชีวิตเราง่ายขึ้น

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

เพราะฉะนั้น การสืบทอดใน OOP พูดง่ายๆก็คือ การ reuse code โดยที่มี code ตั้งต้นชุดเดียว แล้วเอามาใช้ได้เรื่อยๆ นั่นเอง เช่น สมมติมี Class  A เชียนไว้โดยโปรแกรมเมอร์ชื่อนาย ก ทีนี้ เราเห็นว่า Class A ทำงานได้ดีชมัด เราอยากเอา Class A มาใช้ แทนที่เราจะ copy code มาวางในโปรแกรมเรา เราก็ทำงานสืบทอด Class A มาซะเลย ทีนี้ Class ของเราก็จะมีความสามารถจาก Class A  แถมเรายัง Modify ให้เก่งขึ้นได้อีกด้วย

 

 

Byadmin

Encapsulation – การห่อหุ้มข้อมูล

โดยปกติการเขียนโปรแกรมแบบ OOP ที่มองทุกอย่างเป็นวัตถุนั้น ภายในแต่ละวัตถุจะมี 2 ส่วน คือ Data กับ Method

ส่วนของข้อมูล(Data) บางครั้งมักจะถูกห่อหุ้มไว้ให้ใช้ได้ภายในวัตถุนั้นๆ เท่านั้น

ถ้าอยากจะเปลียนแปลงข้อมูล ก็ควรจะเรียกใช้ผ่าน Method

การป้องกันไม่ให้มาแก้ Data โดยตรงก็คือ การ encapsulation นั่นเอง คือหุ้ม Data ไว้ ให้เรียกใช้ผ่าน Method (รายละเอียดปลีกย่อยยังมีอีกเยอะ ผมจะเล่าแค่ conceptให้เข้าใจนะครับ ส่วนอื่นไปศึกษาต่อได้ไม่ยาก)

ยกตัวอย่าง

เราออกแบบและเขียนโปรแกรม วัตถุบัญชีธนาคาร

ในบัญชีธนาคารก็จะมี Data ก็คือ ยอดเงิน  กับ Method คือฝากถอน โดย Method ฝากถอน จะทำงานโดยบันทึกข้อมูลรายการเดินบัญชีลงใน statement + ปรับข้อมูลยอดเงิน

สมมติว่าเราทำงานกันเป็นทีมโปรแกรมเมอร์ เราก็ควรออกแบบวัตถุบัญชีธนาคารนี้ว่า

ห้ามมาปรับยอดเงินโดยไม่ผ่าน Method นะ ไม่งั้นมันจะไม่มีการบันทึก transaction ฝากถอนไง อยู่ดีๆ ยอดเงินก็เพิ่มขึ้นหรือลดลง โดยพอไปดู statement กลับไม่เจอรายการ

พอโปรแกรมเมอร์คนอื่นมาใช้วัตถุบัญชีธนาคารก็ต้องทำตามกฎที่เราออกแบบไว้

คือ ถ้าอยากจะเพิ่มหรือลดยอด ก็ควรทำผ่าน Method ฝากถอน แต่ถ้ามีโปรแกรมเมอร์บางคนดื้อดึง จะไปแก้ยอดเงินตรงๆ คือหัวชนฝาว่าจะทำ สมัยนี้ตัว Compiler มันเก่ง มันจะฟ้องเลยว่า เฮ้ยไม่ได้นะ คนเขียนส่วนวัตถุบัญชีธนาคารเค้าออกแบบมาแล้ว ไม่ให้ทำแบบนี้เฟ้ย

อย่างนี้เป็นต้น

ทีนี้ประโยชน์อีกอย่างหนึ่งสำหรับโปรแกรมเมอร์คนอื่นๆก็คือ

เค้าก็ไม่จำเป็นต้องรู้ว่าไอ้เจ้า Method ฝากถอน มันทำงานยังไง

จะต้องไปปรับยอด ไปลงบัญชี บลาๆๆๆ อย่างไร

เพราะเค้าเชื่อใจว่าเราออกแบบและเขียน Method ให้เค้ามาดีแล้ว

เค้าก็เรียกใช้ Method ที่เราออกแบบไว้ ก็จบเลย อย่างอื่นไม่ต้องไปแคร์

ถ้ามันผิด ก็งานเข้าเราที่ต้องแก้บั๊กเท่านั้นเอง

Byadmin

Type in C# – ว่าด้วยเรื่องชนิดของข้อมูล

ชนิดของข้อมูลในภาษา C# แบ่งออกเป็น 3 ประเภทใหญ่ๆ คือ

  1. Value Type
  2. Reference Type
  3. Pointer Type

 

1. Value Type ชนิดข้อมูลแบบเก็บค่าจริงๆ เช่นพวก Integer, Bool, Decimal, Floating point

Value Type ยังแบ่งออกเป็น 2 กลุ่มใหญ่ๆ อีกคือ

1.1 struct

โดยใน Struct ยังแบ่งออกเป็น 3 กลุ่มย่อยเข้าไปอีกคือ

1.1.1 Numeric Type พวกตัวเลข แบ่งออกเป็น 3 อีก คือ

1.1.1.1 Integral (จำนวนเต็ม)ได้แก่ sbyte, byte, char, short, ushort, int, uint, long, ulong

1.1.1.2 Floating Point (จำนวนทศนิยม) ได้แก่ float กับ double

1.1.1.3 Decimal (จำนวนจุดทศนิยมแบบแม่นยำมากๆ ใช้กับพวกการเงิน)

1.1.2 Bool Type ข้อมูลแบบถูกผิด True/False

1.1.3 User Define structs กำหนดเอง

1.2 Enumerations ข้อมูลแบบนับ แบบแจกแจง เช่น ชุดข้อมูลของวัน จันทร์ อังคาร พุธ ….

เวลาประกาศก็จะทำได้ว่า enum myDay = {Mon, Tue, Wed,Thu, Fri, Sat, Sun}

 

2. Reference Type  ข้อมูลประเภทอ้างอิง คือ ตัวมันไม่ได้เก็บค่า แต่ตัวมันจะเก็บการอ้างอิงไปหาค่าอีกทีนึง

Reference type จะมี Keyword ที่ใช้ประกาศประกอบด้วย

2.1 Class

2.2 Interface

2.3 Delegate

และมีแบบ built-in ไว้แล้วใช้ได้เลย ได้แก่

2.4 String

2.5 dynamic

2.6 object

3. Pointer Type ข้อมูลประเภทชี้เป้า จะคล้ายๆข้อมูลแบบอ้างอิง แต่จะเป็นแบบ Type Unsafe คือ type ที่ชี้ไปหาอาจจะไม่ตรงกับที่ต้องการใช้

แล้วมันอาจจะทำให้เกิด runtime error ขึ้นมาได้

สังเกตุชนิดข้อมูลแบบ Pointer ได้จากเวลาประกาศจะมีเครื่องหมาย ดาว ติดอยู่หลังชนิดข้อมูล

int* p1, p2;

Byadmin

Style sheet, CSS, Less, Saas

style sheet หรือชื่อเต็มๆ คือ cascade style sheet หรือย่อว่า css

เป็นไฟล์ที่เป็นส่วนประกอบของเว็บไซต์ เพื่อใช้ในการวาง Layout ของเว็บ

สมัยก่อนก็รู้จักแต่ CSS

แต่เดี๋ยวนี้เจอ 2 คำเพิ่มขึ้นมา คือ

  1. Sass (ไม่ใช่ software as a service – SaaS นะ ห้ามสับสน)
  2. Less

ความเป็นมา

Saas

Saas ถูกออกแบบโดย Hampton Catlin และพัฒนาโดย Natalie Weizenbaum ตั้งแต่ปี 2006

แต่พึ่งจะมี Stable release ออกมาเมื่อปี 2017 นี่เอง

Saas เป็น script language ที่จะถูกแปลถูก compile ไปเป็น CSS อีกที

Saas ทำให้การเขียน css ง่ายขึ้น เราสามารถประกาศตัวแปร จัดกลุ่ม code ต่างๆได้

แล้วค่อย compile เป็น css อีกที

Less

เกิดทีหลัง Saas โดยได้แรงบันดาลใจมาจาก Saas เพียงแต่ว่าออกแบบมาให้การเขียนโค้ดใกล้เคียงกับ CSS มากที่สุด

Less สามารถที่จะ real time compile ได้ อธิบายง่ายๆ คือปกติ เวลาใช้ Saas หรือ less เราจะเขียนได้ไฟล์นามสกุล .saas หรือ .less

แล้วเอาไปผ่าน compiler จะได้เป็นไฟล์ .css แล้วค่อย upload ไปไว้ในเว็บของเราอีกที

แต่ less มีความสามารถมากกว่านั้นหน่อยก็คือ สามารถเอาไฟล์ less.js ไปไว้ในเว็บของเรา แล้วเรียกใช้ ซึ่งทำให้ เราไม่ต้องไปทำให้เป็นไฟล์

.css ก่อนนั่นเอง

Byadmin

Web Framework

Web framework หรือ web application framework คือ software framework ที่ออกแบบมาเพื่อช่วยในการพัฒนาเว็บ

วัตถุประสงค์ของมันก็คือช่วยลดการที่ต้องทำงานซ้ำๆ ลง ตัวอย่างเช่น การเขียนติดต่อ database หรือ template ต่างๆ

web framework ก็จะเตรียม library ต่างๆไว้ให้คนพัฒนาโปรแกรมได้เรียกใช้ ทำให้ประหยัดเวลาในการเขียนโค้ดซ้ำๆ

ตัวอย่าง Web framework

Angular/AngularJS

jQuery

Backbone.js

Node.js

React