# OOP

ผมเชื่อว่าหลายคนที่เขียนโค้ดมาได้ซักระยะก็จะได้ยินคำว่าการเขียนโปรแกรมแบบ **Object-Oriented Programming** หรือที่เรียกกันติดปากว่า **OOP** นั่นเอง หรือบางคนก็เคยเรียนผ่านมาบ้างแต่ก็อาจจะยังไม่แน่ใจว่าสิ่งที่เขียน สิ่งที่ใช้อยู่นั้นมันถูกต้องตามหลักของ OOP หรือยัง ดังนั้นในคอร์สนี้เราจะมาทำความเข้าใจกันว่า จริงๆแล้ว OOP มันคืออะไร ใช้งานยังไง และ มันสำคัญหรือเปล่า กันครัช

## 🤨 เคลียความเข้าใจกันนิส

ตั้งแต่เริ่มเรียนเขียนโค้ดครั้งแรก ผมเชื่อว่า 99.99% ทุกคนน่าจะได้ทำโจทย์หลายๆแบบ เช่น ตัดเกรด คำนวณหาพื้นที่ หรืออะไรก็ตามแต่ที่จะช่วยฝึกให้เราเข้าใจคำสั่งต่างๆ เช่น if..else, switch..case, loop บลาๆ กันมาใช่ไหม? แล้วพอผ่านมาซักระยะเราก็จะได้รับโจทย์ที่ยากขึ้น เช่นเขียนโปรแกรมเครื่องคิดเลข ทำระบบจองโรงแรม หรืออะไรก็ตามที่ไม่ได้เขียนจบภายในไฟล์เดียวอีกต่อไป

จากที่ยกตัวอย่างไป อยากจะบอกว่าส่วนใหญ่ที่เราเขียนนั้น มันจะทำให้เรารู้จักสิ่งที่เรียกว่า ตัวแปร และ ฟังก์ชั่น ต่างๆ ซึ่งหลักในการคิดพวกนั้นจะเป็นสิ่งที่เราเรียกว่า **Procedural Programming** นั่นเอง

## 🤔 Procedural Programming คือไย ?

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

ยกตัวอย่าง เราจะเขียน **โปรแกรมส่งจดหมาย** เราก็จะคิดเป็นขั้นตอนว่า

1. จะสร้างจดหมายขึ้นมา
2. ทำการส่งหมายผ่าน function A ตัวนี้
3. function A ก็จะส่งข้อมูลต่อไปให้กับ function B เพื่อติดต่อออกไปผ่าน SMTP
4. บลาๆ

ซึ่งวิธีการเขียนโค้ดแบบ **Procedural Programming** นั้นมันจัดการอะไรต่างๆค่อนข้างยาก เวลาอยากจะแก้ไขอะไรซักอย่างก็ต้องไปไล่หาว่ามันอยู่ขั้นตอนไหน และแต่ละขั้นตอนก็อาจจะไปพันกับอีกขั้นตอน ทำให้แก้จุดนี้ก็มีผลกระทบกับจุดอื่นๆด้วย ดังนั้นเลยมีการคิดวิธีการเขียนโปรแกรมอีกแบบที่เรียกว่า **Object-Oriented Programming** ขึ้นมา

{% hint style="info" %}
**สรุปสั้นๆ**\
หลักในการคิดของ **Procedural Programming** คือ คิดเป็นขั้นตอน สั่งงานตามขั้นตอนที่คิดไว้ โดยเราจะทำการ สร้าง step ต่างๆเอาไว้เรียกใช้นั่นเอง
{% endhint %}

## 🤔 Object-Oriented Programming คือไย ?

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

ยกตัวอย่าง เราจะเขียน **โปรแกรมส่งจดหมาย** เราก็จะคิดออกมาว่ามันมีองค์ประกอบอะไรบ้าง เช่น

* ถ้าจะส่งจดหมายได้จะต้องมี **ซองจดหมาย** ที่ระบุคนรับคนส่ง
* ถ้าจะส่งจดหมายจะต้องมี **ตัวส่งจดหมาย** ที่จะสามารถเก็บ **จดหมาย** ไว้ข้างในได้
* บลาๆ

ซึ่งจากตัวอย่างเราจะเห็นว่า **การเขียนโปรแกรมแบบ OOP นั้นใกล้เคียงกับโลกของความเป็นจริง** มากกว่าการเขียนแบบ Procedural Programming ดังนั้นถ้าเหล่า developer เขียนโค้ดโดยใช้หลักของ OOP มันก็จะทำให้เราสามารถเข้าใจกันได้เร็วขึ้น และโค้ดมีการแบ่งงานกันชัดเจน เวลาแก้ไขปัญหาก็พอจะรู้ว่าจะต้องไปแก้ที่จุดไหน

{% hint style="info" %}
**สรุปสั้นๆ**\
หลักในการคิดของ **Object-Oriented Programming** คือ มองของต่างๆเป็นเรื่องๆ ที่สอดคล้องกลับปัญหาที่เราจะแก้ไข
{% endhint %}

## 🤼 เคลียกันรอบสุดท้าย

การเขียนโปรแกรมไม่ว่าจะเป็น **Procedural Programming** หรือ **Object-Oriented Programming** สุดท้ายมันก็เป็นแค่**วิธีการเขียนโปรแกรมแบบหนึ่งเท่านั้น** และในโลกของการเขียนโปรแกรมก็ไม่ได้มีแค่นี้นะ เพราะในสมัยนี้มันมีอีกยั้วเยี้ยเลยให้เราเลือกศึกษา ซึ่งแต่ละวิธีก็จะมีข้อดีข้อเสียของมันเองทั้งนั้น

## 🥺 แล้วจะรู้เรื่อง OOP ไปทำไม ?

แม้ว่า OOP จะเป็นแค่หนึ่งในวิธีการคิดในการเขียนโปรแกรม แต่มันก็เป็นวิธีที่คนทั่วโลกนิยมใช้กัน แหละมันเหมือนกับเป็นเกณฑ์ตัวแรกเลยที่เขาวัดว่าเขาจะรับเราเข้าร่วมงานหรือเปล่าก็ว่าได้ ดังนั้นเรียนเจ้าตัวนี้ไปก็ไม่เสียหายหรอก เพราะสุดท้ายถ้าเราเข้าใจหลักในการเขียน OOP อย่างถ่องแท้แล้ว มันก็จะ**ช่วยเป็น guideline ให้เราออกแบบโค้ดได้อย่างมีประสิทธิภาพและเป็นมืออาชีพในวงการนี้มากยิ่งขึ้น**ครับ 👍

## 😁 เข้าเรื่องของ OOP กัน

ในการเขียนโค้ดโดยใช้หลักของ OOP นั้น เราจะต้องดูก่อนว่าภาษาที่เราใช้อยู่มันรองรับ OOP หรือเปล่าด้วย ซึ่งโดยปรกติภาษาส่วนใหญ่จะทำ OOP ได้อยู่แล้วนะดังนั้นสบายใจได้ (C# รองรับ OOP 100%) โดยวิธีการดูว่าภาษาของเรารองรับ OOP หรือเปล่าคือ มันจะต้องทำ **4 เสาหลัก** หรือเราเรียกว่า **4 Pillars** ด้านล่างนี้ได้

## 💖 4 Pillars of OOP

4 เสาหลักที่เป็นตัววัดว่าภาษานั้นรองรับการทำ OOP หรือเปล่า และเป็นตัว guideline ในการออกแบบโค้ดที่เราจะนำมาใช้ในการแก้ปัญหาคือ

1. Abstraction
2. Encapsulation
3. Inheritance
4. Polymorphism

ซึ่งแต่ละเรื่องผมจะขออธิบายแยกเป็นเรื่องๆของมันไปเน่อ ดังนั้นสนใจเรื่องไหนก็ลองไปจิ้มอ่านเอาที่ตัวด้านล่างได้

## 🧭 เนื้อหาทั้งหมดของคอร์สนี้

{% hint style="info" %}
ใครที่ไม่อยากพลาดอัพเดทบทความใหม่ๆ สามารถเข้าไปกด Like เพื่อรับข่าวสารใหม่ๆจาก [**Facebook Blog: Mr.Saladpuk**](https://www.facebook.com/mr.saladpuk) ได้นะครับ 😍
{% endhint %}

{% content-ref url="/pages/-Lu55Q6LJZrwT2F4CSNz" %}
[Abstraction](/beginner-1/oop/abstraction.md)
{% endcontent-ref %}

{% content-ref url="/pages/-Lu5\_XuliBDVowQzRwxJ" %}
[Encapsulation](/beginner-1/oop/encapsulation.md)
{% endcontent-ref %}

{% content-ref url="/pages/-LuAJPjiPk8bg5dMUgWr" %}
[Abstraction & Encapsulation](/beginner-1/oop/abs-n-enc.md)
{% endcontent-ref %}

{% content-ref url="/pages/-Lu7ydL1JjiViwDoPhJl" %}
[Inheritance](/beginner-1/oop/inheritance.md)
{% endcontent-ref %}

{% content-ref url="/pages/-LuDDbz3kx9OpeYWfK4i" %}
[Polymorphism](/beginner-1/oop/polymorphism.md)
{% endcontent-ref %}

{% content-ref url="/pages/-Lua6g1qlhgBA9s6FsWm" %}
[Inheritance & Polymorphism](/beginner-1/oop/inh-n-poly.md)
{% endcontent-ref %}

{% content-ref url="/pages/-LueCzNREgPDeOjUS7Ap" %}
[ลองเขียน OOP ดูดิ๊](/beginner-1/oop/example.md)
{% endcontent-ref %}

{% content-ref url="/pages/-LumjNRC5\_7Edecf9AUb" %}
[OOP + Power of Design](/beginner-1/oop/oop-n-design.md)
{% endcontent-ref %}

{% content-ref url="/pages/-Lv07SL8Za-tEmXZXxGv" %}
[เทคนิคในการออกแบบ](/beginner-1/oop/tips.md)
{% endcontent-ref %}

{% hint style="danger" %}
**คำเตือน**\
การศึกษาเรื่อง OOP เป็นเรื่องที่ดี แต่**การที่เราจะเข้าใจมันได้อย่างถ่องแท้นั้น เราจะต้องลองฝึกออกแบบ ลองเจอโจทย์เยอะๆ ลองผิดลองถูกจนถึงจุดหนึ่ง แล้วประสบการณ์เหล่านั้นมันจะช่วยทำให้เรากลับมาอ่าน concept พวกนี้แล้วถึงจะบรรลุหลักการพวกนี้อย่างแท้จริง** ไม่อย่างนั้นแล้วเราก็จะเข้าตามตัวอักษร อาจเอาไปใช้ตอบเพื่อให้ผ่าน certificate ได้ แต่สุดท้ายเมื่อเจอโจทย์ในงานจริง คุณก็จะงูๆปลาๆอยู่ดี
{% endhint %}

{% hint style="info" %}
**แนะนำให้อ่าน**\
สำหรับเพื่อนๆที่สนใจในการออกแบบโค้ด เพื่อให้โค้ดของเรามันดียิ่งขึ้น เป็นมืออาชีพมากขึ้นไปอีก สามารถไปศึกษาได้จากลิงค์ด้านล่างพวกนี้ได้เลยครัช

* 🧪[ Test-Driven Development (TDD)](https://saladpuk.gitbook.io/learn/software-testing/tdd101)
* 🧪[ ตัวอย่างการทำ Test First](https://saladpuk.gitbook.io/learn/software-testing/test-first-design)
* 📐[ หลักในการออกแบบที่ต้องรู้ SOLID Design](https://saladpuk.gitbook.io/learn/basic/solid)
* 📐[ การแก้ปัญหาด้วย Design Patterns](https://saladpuk.gitbook.io/learn/software-design/designpatterns)
  {% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.saladpuk.com/beginner-1/oop.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
