Class based
Class-based OOP
คือ OOP มั่งมีพวก object-based กับ class-based พวกที่เป็น object-based คือ object ไม่มี relation อะไรกับ class, ไม่มี class
ก็สร้าง object ได้ เช่น javascript ที่เป็น prototype-based ส่วน class-based ก็มี class ซึ่งเป็น _ static _ นั่นก็แปลว่า class
จะเป็น definition ที่ประกาศที่ compile-time
type ก็คือ _ static _ thing มีการ declare กัน compile-time (ไม่เกี่ยวอะไรกับ dynamic type, พวก dynamic type คือ
type ของ variable หรือ object จะเปลี่ยนแปลงได้ที่ run-time )
static language อย่าง Java, object หรือ variable จะไม่เปลี่ยนแปลง type ที่ compile time คืออาจจะมีการ upcast หรือ
subsume ไปเป็น Parent type แต่ type ของ object จะไม่มีการหาย ไม่มีการมา add method ที่
runtime
ถ้ามองง่ายๆ _ class เป็น implementation ของ type _ นั่นเอง การสร้าง class เป็นการสร้าง type ใหม่ ซึ่งการสร้าง type ใน
java นั้น สร้างได้โดยใช้ interface นั่นเป็นที่มา ของเวลาเขียน _ classs xxx implements AnInterface _
ดังนั้นการที่อยู่ดีๆ เขียนโปรแกรม โดยการสร้าง _ public _ class ที่ไม่ได้ implements interface ใดๆขึ้นมาลอยๆ มันคือการเสล่อ
ดังนั้นจะเห็นว่าถ้าใช้ dynamic language โดยมากแล้วมันจะไม่มี concept ของการ declare type,
interface ของ dynamic language ทั้งหลาย อย่าง php, python มันเลยไม่ค่อยมีความหมายอะไรเท่าไหร่
ปล. คำว่า declare กับ define นี่ต่างกัน การ declare คือการประกาศเฉยๆ แต่ยังไม่มี definition ส่วนการ define คือการใส่ definition
ในสิ่งที่ประกาศไปแล้ว เปรียบเสมือน implement
โอเค เรามี type มี class แล้ว อะไรอยู่ใน type อยู่ใน class บ้างหละ
type ถ้าตีความกัน ก็คือ ประเภท ของสิ่งๆหนึ่ง สิ่งๆนั้นทำเชี่ยอะไรได้บ้าง type จึงต้องมี method เช่น object ที่มี type Phone ควรจะ
มีความสามารถในการ _ โทรเข้า _ และ _ โทรออก _ ได้, type ไม่ควรมี state มีแต่ behavior ดั้งนั้น type ไม่ควรมี member field หรือบางท่าน
จะเรียกว่า member variable, member data ก็ว่ากันไปในที่นี้ใช้คำว่า _ field _
ดังนั้นใน java เราเลยประกาศ field ลงไปใน interface ไม่ได้ (หรือได้ว่ะ แต่รู้สึกไม่ได้เอาไปใช้อะไร ?) เพราะมันไม่ make sense ใน concept ของ type, interface ใน java จึง contain
เพียงแค่ signature ของ method ของ type นั้น
object สามารถมี state ได้ เช่น counter object มี integer ที่เป็น counter อยู่ในภายใน ถ้า client
มาเรียก increaseCounter, state ของ counter object ก็จะเปลี่ยน
เนื่องจาก class เป็น implementation ของ type ดังนั้น เราจึงมี method และ field เวลา define class นั่นเอง
เพื่อให้ _ object _ ซึ่งเป็น instance ของ class ได้รับทั้ง behavior และ state
method ก็คือ function, function สามารถ มี input ได้หลายตัว แต่จะ return output ออกมาตัวเดียว พวก script language ที่ return output
ออกมาได้หลายๆตัวจาก function จริงๆก็ไม่มีอะไรมาก คิดซะกว่ามัน return output ออกมาเป็น array ตัวหนึ่ง นั่นคือ function
รับ input ได้หลายตัว return ออกมาตัวหนึ่ง
field ก็คือ object ภายใน object, เปรียบเสมือน state ของ object, client จะใช้ method ในการเปลี่ยนแปลงหรือ access field,
การที่ java อนุญาตให้ client access field ใน object ได้นั้นเพื่อความสะดวก จริงๆแล้ว ถ้าว่ากันด้วย concept ของ type,
state ของ object ไม่สามารถ ถูก access ได้โดยตรง ต้อผ่าน method พวก getSomething
คือเอาง่ายๆ สมมุติ มี class ตัวหนึ่ง NNN implement interface KKK, NNN มี field _ nnn _, เวลา object ของ NNN ถูก pass เข้า function ที่รับ
argument เป็น type KKK เช่น _ void xxx(KKK k) _ , client จะไม่สามารถ access k.nnn ได้ ซึ่งไม่จะไม่สวย มันจะเสล่อ เหมือนกับ nnn เป็น fied
ที่จะ access ได้เฉพาะ type NNN
ใน java, class กับ type มันไม่ผูกขาดคือ เวลาเราสร้าง class NNN implements KKK เราจะได้ type มาสองตัวคือ KKK และ NNN ซึ่งจะว่าไป
มันคือการเสล่อ แต่เนื่องจาก java มันมีระบบ package และ access control คนเลยสามารถ เอา class ไปเป็น private ใน package และให้ client
access ที่ interface อย่างเดียว เช่น
package MMM;
public interface KKK {
}
class NNN implements KKK {
}
public class MMMFactory {
private classMMMFactory {}
public static KKK createKKK() {
return new NNN();
}
}
ไม่แน่ใจว่าเขียนถูกรึเปล่า แต่เท่านั้นคนภายนอก ก็ไม่สามารถ อ้างถึง NNN ได้แล้ว ที่คนจะใช้ได้คือ MMMFactory ซึ่งเป็นตัวสร้าง NNN แต่ให้คน
refer ถึงได้แค่ KKK ซึ่งเป็น interface ของ package
นี่บางคนเรียกว่า static factory pattern เป็น pattern ที่ต้องมี package + access control ด้วยถึงจะใช้การใช้ เป็นสิ่งที่คนทำกันใน java หรือ C#