Home / ພື້ນຖານ Desktop app / Design Pattern
OOP ຫຼືຊື່ເຕັມໆກໍຄື Object Oriented Programming ອ່ານແປງ່າຍໆກໍຄືການຂຽນໂປຣແກຣມເຊີງວັດຖຸ ຊຶ່ງເປັນແນວຄິດໃນການພັດທະນາຊອບແວຣ໌ທີ່ ແລະ ເປັນທີ່ຍອມຮັບ ເນື່ອງຈາກຊອບແວຣ໌ທີ່ຖືກພັດທະນາ ແລະ ໃຊ້ກັນຢູ່ນັ້ນ ນັບມື້ມີແຕ່ຈະຊັບຊ້ອນຫລາຍຍິ່ງຂຶ້ນ ຖ້າຫາກບໍ່ຈັດການກັບໂຄ້ດໃຫ້ດີພໍກໍອາດຈະເຮັດໃຫ້ການພັດທະນາລ່າຊ້າ ຫຼື ບໍ່ສຳເລັດໄດ້ OOP ຈຶ່ງອອກແບບມາໃຫ້ໂຄ້ດທີ່ເຮົາຂຽນມີແບບແຜນທີ່ເໝາະສົມພ້ອມໃຊ້ໃນການພັດທະນາທີ່ຊັບຊ້ອນໄດ້
ຢ່າງທີ່ບອກໄປວ່າ OOP ນັ້ນເເປັນການຂຽນໂປຣແກຣມເຊີງວັດຖຸ ເຮົາກໍຕ້ອງລອງທຽບກັບວັດຖຸໃນຊີວິດຈິງຂອງເຮົາເບິ່ງເຊັ່ນ ນົກ ໃນທີ່ນີ້ເຮົາຈະໃຫ້ນົກເປັນວັດຖຸ ໂດຍສິ່ງທີ່ນົກຕ້ອງມີກໍຄື “ຄຸນສົມບັດ” ເຊັ່ນ ສີຂຽວ, ປາກຢາວ ເປັນຕົ້ນ ແລະ ກໍຕ້ອງມີ “ພຶດຕິກຳ” ເຊັ່ນ ບິນ, ກິນອາຫານ ເປັນຕົ້ນ ການຂຽນໂປຣແກຣມກໍຕ້ອງເຮັດໃຫ້ໂຄ້ດຂອງເຮົາມີຄຸນສົມບັດ ແລະ ພຶດຕິກຳເຊັ່ນດຽວກັນກັບນົກ ແຕ່ວ່າຍັງບໍ່ນັບວ່າເປັນ OOP ເພາະວ່າ OOP ທີ່ແທ້ຈິງຢັງຕ້ອງມີ 4 ເສົາຫຼັກຂອງ OOP ຢູ່ໄດ້ແກ່ Encapsulation Abstraction Inheritance Polymorphism ຢ່າຫາກໍ່ງົງກັບສັບພວກນີ້ ດຽວເຮົາໄປເບິ່ງກັນວ່າແຕ່ລະຕົວນັ້ນແມ່ນຫຍັງ
1. Encapsulation ການຫຸ້ມຫໍ່ຂໍ້ມູນ / ການຊ່ອນຂໍ້ມູນ
ຫໍ່ຫຍັງ ? ຫຸ້ມແບບໃດ ? ອັນນີ້ກໍຕ້ອງຢ້ອນໄປທີ່ບອກຕອນທຳອິດວ່າໂປຣແກຣມເຊີງວັດຖຸມັນຕ້ອງມີ “ຄຸນສົມບັດ” ແລະ “ພຶດຕິກຳ” ຊຶ່ງສອງສິ່ງນີ້ກໍຄືສິ່ງທີ່ເຮົາຕ້ອງຫຸ້ມຫໍ່ເອົາໄວ້ນັ້ນເອງ ຄໍາຖາມຕໍ່ມາກໍຄືເປັນຫຍັງເຮົາເຖິງຕ້ອງຫຸ່ມເອົາໄວ້ ຫໍ່ແລ້ວຈະໄດ້ປະໂຫຍດຫຍັງ ລອງຄິດພາບເຖິງໂປຣແກຣມທີ່ມີ object ຢູ່ຫຼາຍຕົວຊຶ່ງແຕ່ລະຕົວກໍມີການຕິດຕໍ່ຮັບສົ່ງຂໍ້ມູນ ຖ້າບໍ່ມີການຫໍ່ຫຸ້ມເອົາໄວ້ ແຕ່ລະ object ເຂົ້າເຖິງ ແລະ ປ່ຽນແປງຄຸນສົມບັດຂອງ object ອື່ນໄດ້ທັງໝົດ ອາດຈະເຮັດໃຫ້ເກີດຄວາມຜິດພາດໃນການເຮັດວຽກງານໄດ້ຖ້າຖືກປ່ຽນແປງຄຸນສົມບັດໂດຍບໍ່ມີການຄວບຄຸມ
ໃນເລື່ອງນີ້ການຫຸ້ມຫໍ່ຈຶ່ງເຂົ້າມາຊ່ວຍນັ້ນເອງ ໂດຍການຫໍ່ຫຸ້ມຈະເຮັດໄດ້ເມື່ອແຕ່ລະວັດຖຸມີສິ່ງທີ່ມີສະຖານະເປັນ private ຢູ່ພາຍໃນ class ເຮັດໃຫ້ເຮົາຊ່ອນການເບິ່ງເຫັນ ຫຼື ການເຂົ້າເຖິງຈາກພາຍນອກໄດ້ລອງເບິ່ງຈາກຕົວຢ່າງ class ໄດ້ໂນເສົາຂອງເຮົາກັນ
ໃນພາບນີ້ຈະມີສ່ວນທີ່ຫໍ່ຫຸ້ມເອົາໄວ້ ກັບສ່ວນທີ່ເປີດໃຫ້ເຂົ້າເຖິງໄດ້ ສ່ວນທີ່ເຂົ້າເຖິງໄດ້ໄດ້ແກ່ ເຮົາໃຫ້ໄດ້ໂນເສົາຂອງເຮົາຮຽນ ແລະ ເຮົາໃຫ້ໄດ້ໂນເສົາຂອງເຮົາກັກຕົວ ຈະເຫັນວ່າສິ່ງທີ່ເຂົ້າເຖິງໄດ້ນັ້ນເຮົາບໍ່ໄດ້ປ່ຽນແປງຄຸນສົມບັດ ຫຼື ພຶດຕິກຳຂອງໄດໂນເສົາໂດຍກົງ ເຮົາພຽງແຕາເອີ້ນຄຳສັ່ງທີ່ໄດໂນເສົາຣ໌ເປີດໄວ້ໃຫ້ເທົ່ານັ້ນ ສ່ວນການຈັດການພາຍໃນນັ້ນໄດໂນເສົາຣ໌ເປັນຄົນຈັດການເອງໂດຍພາຍນອກບໍ່ຈຳເປ້ນຕ້ອງຮູ້ ຊຶ່ງການທີ່ object ຫຼື class ມີການຫຸ້ມຫໍ່ ແລະ ການເປີດເຜຍນັ້ນທັງຫມົດແລ້ວກໍຄືຫົວໃຈຂອງການ Encapsulation ນັ້ນເອງ
2. Abstraction ການຮູ້ແຕ່ທີ່ຈຳເປັນ
ໃນຂໍ້ນີ້ນັ້ນເອີ້ນໄດ້ວ່າເປັນຜົນພອຍໄດ້ມາຈາກ Encapsulation ເລີຍກໍວ່າໄດ້ ເພາະເປັນການທີ່ເຮົາເປີດໃຫ້ຄົນອື່ນ ຫຼື ກໍຄື object ອື່ນເອີ້ນໃຊ້ງານ object ຂອງເຮົາໄດ້ໂດຍທີ່ບໍ່ຈຳເປັນຕ້ອງຮູ້ການເຮັດວຽກງານ ຫຼື ລາຍລະອຽດຕ່າງໆທາງໃນເລີຍ ຢ່າງໃນຊີວິດປະຈຳວັນຂອງເຮົາກໍພົບກັບການ Abstraction ຢູ່ຕະຫລອດເວລາ ຢ່າງການຂັບລົດ, ການໃຊ້ງານຄອມພິວເຕີ, ການໃຊ້ສມາດໂຟນ ຫຼື ການໃຊ້ງານເວັບຕ່າງໆ ເຊັ່ນຕອນທີ່ເຮົາໃຊ້ Facebook ເຮົາພຽງແຕ່ເລື່ອນໜ້າຟີດ ກົດເບິ່ງແຈ້ງເຕືອນ ຕອບແຊດໝູ່ເພື່ອນ ປະມານນັ້ນ ຊຶ່ງເຮົາກໍສາມາດໃຊ້ງານໄດ້ງ່າຍໂດຍທີ່ເຮົາບໍ່ຮູ້ດ້ວຍວ່າເບື້ອງຫຼັງມັນເຮັດວຽກຫຍັງແດ່ ຕອນເຮົາພິມແຊດລົມກັບເພື່ອນ ການເຮັດວຽກງານຂ້າງຫຼັງຕ້ອງສົ່ງຂໍ້ມູນແບບໃດ ເຂົ້າລະຫັດແບບໃດ ຊຶ່ງລັກສະນະແບບນີ້ກໍຄື Abstraction
3. Inheritance ການສືບທອດຄຸນສົມບັດ
ຈາກສອງຂໍ້ທີ່ຜ່ານມາເຮົາສາມາດຄວບຄຸມການເຂົ້າເຖິງໄດ້ແລ້ວ ຕໍ່ໃຫ້ເປັນໂປຣແກຣມຂະໜາດໃຫຍ່ທີ່ມີຄວາມຊັບຊ້ອນ ຂໍ້ມູນ ແລະ ການເຮັດວຽກງານກໍຈະຍັງຖືກຕ້ອງຢູ່ ແຕ່ອີກສິ່ງທີ່ມັກຈະເກີດໃນການຂຽນໂປຣແກຣມກໍຄືການທີ່ມີຫຼາຍໆ class ເຮັດວຽກຄ້າຍໆກັນ ແຕ່ຖ້າຈະໃຫ້ທັງຫມົດໄວ້ນຳກັນກໍເຮັດບໍ່ໄດ້ເພາະບໍ່ໄດ້ຄືກັນທັງໝົດ ດັ່ງນັ້ນເຮົາຈຶ່ງຕ້ອງໃຊ້ການ Inheritance ເພື່ອທີ່ຈະແກ້ບັນຫາແບບນີ້ ໂດຍການສືບທອດຄຸນສົມບັດນັ້ນກໍກົງຕົວຄື ເປັນການເອົາຄຸນສົມບັດຂອງ class ໜຶ່ງໄປສ້າງເປັນອີກ class ໜຶ່ງ ແລະ ຍັງສາມາດເພີ່ມຄວາມສາມາດເຂົ້າໄປໄດ້ອີກ ຊຶ່ງກໍເປັນການ Reuse ໂຄ້ດທີ່ເປັນ class ນັ້ນເອງ
ເຊັ່ນເຮົາມີ class “ສັດສີ່ຂາ” ທີ່ມີຄຸນສົມບັດຄືມີ “ຂາ” ແລະ ມີພຶດຕິກໍາຄື “ຍ່າງ” ພໍເຮົາຈະສ້າງ class “ແມວ” ກັບ “ໝາ” ຂຶ້ນມາໃໝ່ ທັງແມວ ແລະ ໝາຕ່າງກໍເປັນສັດສີ່ຂາຄືກັນແທນທີ່ຈະສ້າງ ຂາ ກັບ ການຍ່າງ ຂຶ້ນມາໃໝ່ ເຮົາກໍໃຫ້ສືບທອດມາຈາກ class ສັດສີ່ຂາໄດ້ເລຍ ແລະ ກໍຍັງສາມາດເພິ່ມເຕິມຄຸນສົມບັດ ຫຼື ພຶດຕິກຳເພີ່ມຂຶ້ນໄດ້ອີກຢ່າງ “ຊື່ສັດ” ແລະ “ເຫົ່າ” ໃນໝາ ກັບ “ອ້ອນ” ໃນແມວ
4. Polymorphism "ຄວາມຫຼາກຫຼາຍ"
ມາເຖິງຂໍ້ສຸດທ້າຍຂອງແນວຄິດແບບ OOP ກັນແລ້ວ ນັ້ນຄື Polymorphism (ໂພລີໂມຣ໌ຟິຊຶມ) ແປອອກມາວ່າ "ຄວາມຫຼາກຫຼາຍ" ໃນບົດຄວາມທີ່ແລ້ວເຮົາເວົ້າເຖິງ Inheritance ຫຼື ການສືບທອດໄປແລ້ວຊຶ່ງເວົ້າເຖິງການສົ່ງຕໍ່ໂຄ້ດສ່ວນທີ່ຄືກັນລົງໄປທີ່ຄລາດລູກ ແລ້ວນຳຄລາດລູກໄປໃຊ້ໂດຍບໍ່ຕ້ອງຂຽນໂຄ້ດໃໝ່ທັງໝົດ ... ແຕ່ສຳລັບ Polymorphism ຈະເປັນຂະບວນທ່າຕໍ່ເນື່ອງມາອີກເທື່ອດ້ວຍມຸມມອງທີ່ກັບກັນ ຄືເຮົາຈະຂຽນ child-class ເພື່ອປັບປຸງການເຮັດວຽກງານຂອງ parent-class ແທນ ຕົວຢ່າງເຊັ່ນ ກຳນົດໃຫ້ເຮົາມີຄລາດຂອງວັດຖຸທີ່ສາມາດບິນໄດ້ ເອີ້ນວ່າ Flyable
class Flyable {
function fly(){
print "ບິນ"
}
}
ຕໍ່ມາ ເຮົາຢາກໄປຄລາດ ນົກ ເຄື່ອງບິນ ແລະ ໂດຣນ(?) ຊຶ່ງພວກນີ້ມັນບິນໄດ້ ຕາມຫຼັກການ Inheritance ຖ້າແມ່ນຫຍັງທີ່ມີຢູ່ແລ້ວເຮົາຈະບໍ່ຂຽນໃໝ່ ແຕ່ຂຽນເພີ່ມຈາກອັນເກົ່າແທນ
class Bird extends Flyable {
function fly(){
print "ນົກບິນ"
}
}
class Airplane extends Flyable {
function fly(){
print "ເຄື່ອງບິນບິນ"
}
}
class Drone extends Flyable {
function fly(){
print "ໂດຣນບິນ"
}
}
ແຕ່ ເອ໊ະ ... ເມື່ອທຸກຄລາດທີ່ເຮົາ extends ມາມັນມີການ fly ທີ່ບໍ່ຄືເກົ່າ ເຮົາກໍເລີຍຂຽນທັບລົງໄປ (method override) ກາຍເປັນວ່າທີ່ເຮົາ extends ຄາດແມ່ມາເພື່ອສືບທອດຄວາມສາມາດ
ຂະບວນທ່ານີ້ອາດຈະບໍ່ມີປະໂຫຍດຫຍັງກັບຄລາດລູກເລີຍ ແຕ່ສຳລັບຄລາດແມ່ແລ້ວ ມັນສາມາດເຮັດໃຫ້ມັນເຮັດ Polymorphism ໄດ້ແຕ່ເພື່ອຈະເຮັດເຊັ່ນນັ້ນເຮົາຈະຕ້ອງເບິ່ງຄລາດແມ່ເປັນ Abstract ໃຫ້ໄດ້
ແປລວ່າເຈົ້າຈະຕ້ອງບໍ່ເບິ່ງວ່າຄລາດລູກພວກນີ້ນ່ະ ມັນຄື Bird, Drone, Airplane ແຕ່ຕ້ອງເບິ່ງວ່າພວກມັນທັງໝົດເປັນຮ່າງອາວະຕານຂອງ "ສິ່ງທີ່ບິນໄດ້" (Flyable)