จากผู้แปล: น่าเสียดายที่ฉันไม่มีประสบการณ์สำคัญในการแปลภาษาอังกฤษ แม้ว่าฉันจะอ่านภาษาอังกฤษได้ค่อนข้างมากก็ตาม แต่ปรากฎว่าการอ่านและการแปลเป็นสองสิ่งที่แตกต่างกัน นอกจากนี้ โชคไม่ดีที่ฉันไม่มีประสบการณ์การเขียนโปรแกรมที่สำคัญ (ฉันเพิ่งสร้างเว็บแอปพลิเคชันอย่างง่ายใน Spring MVC และ Hibernate) ดังนั้นการแปลจึงแย่กว่าที่เคยเป็นมามาก ฉันใช้เสรีภาพในการแก้ไขตัวอย่างโค้ดที่ให้ไว้ในบทความเล็กน้อย เนื่องจากตัวอย่างเหล่านี้ไม่สอดคล้องกับแบบแผนการตั้งชื่อใน Java บางทีการแปลชื่อของรูปแบบบางอย่างอาจไม่คุ้ม (การแปลดังกล่าวไม่ได้ให้ความเข้าใจมากนัก) แต่ฉันคิดว่านี่เป็นสิ่งที่ชั่วร้ายน้อยกว่า เป็นเรื่องที่ควรกล่าวถึงแยกกันเกี่ยวกับ "การทำงานร่วมกันสูง" ว่าเป็นคำแปลของ "การทำงานร่วมกันสูง" ฉันเห็นด้วยไม่ใช่การแปลที่ดีที่สุด แต่ "การเชื่อมต่อที่แข็งแกร่ง" คือ "การเชื่อมต่อที่สูง" (แนวคิดที่สำคัญอีกประการหนึ่ง) และ "การเชื่อมโยงกัน" ไม่น่าจะเหมาะสมที่นี่ ฉันเปิดรับคำวิจารณ์และยินดีรับความคิดเห็นต่อบทความในรูปแบบใด ๆ การเขียนโปรแกรมเชิงวัตถุเป็นรูปแบบหนึ่งของการเขียนโปรแกรมซึ่งโปรแกรมประกอบด้วยส่วนประกอบที่สอดคล้องกับวัตถุในโลกแห่งความเป็นจริง วัตถุจริงใด ๆ มีคุณสมบัติบางอย่าง (ซึ่งอาจหรืออาจจะไม่เปลี่ยนแปลงเมื่อเวลาผ่านไป) และพฤติกรรม (ซึ่งอาจหรือไม่ก็ได้) เปลี่ยนแปลงขึ้นอยู่กับผู้อื่น) เงื่อนไข) ตัวอย่างเช่น ดินสอเป็นวัตถุในโลกแห่งความเป็นจริงที่มีคุณสมบัติดังต่อไปนี้:
- เป็นสีแดง (ซึ่งไม่เปลี่ยนแปลงเมื่อเวลาผ่านไป)
- ตอนนี้มีความยาว 10 เซนติเมตร (ซึ่งอาจเปลี่ยนแปลงได้หากเหลาดินสอ)
- มันจะทิ้งรอยไว้หากใช้อย่างถูกต้อง
- ร่องรอยอาจแตกต่างกันไปขึ้นอยู่กับแรงกดดัน (ขึ้นอยู่กับปัจจัยภายนอก)
- ความยาวจะสั้นลงหากลับให้คม (พฤติกรรมถาวร)
นามธรรม
นามธรรมถูกกำหนดให้เป็นคุณภาพของปฏิสัมพันธ์กับความคิดมากกว่าเหตุการณ์หรือกล่าวอีกนัยหนึ่งคืออิสรภาพจากคุณสมบัติการเป็นตัวแทน ซึ่งช่วยให้โปรแกรมเมอร์สามารถมุ่งความสนใจไปที่ว่าจะเขียนโปรแกรมอะไรมากกว่าจะ เขียนโปรแกรม อย่างไร สิ่งที่เป็นนามธรรมถือได้ว่าเป็นสัญญาที่เราจัดให้มีฟังก์ชันการทำงาน รายละเอียดการใช้งานอาจถูกซ่อนไว้เมื่อใช้แนวคิดนี้ ตัวอย่างเช่นหากเราต้องการคลาสที่เขียนเราต้องแน่ใจว่าคลาสนั้นมีเมธอด "write"abstract class writer { write (); }
เราทำอะไรไปบ้าง? เราได้ออกแบบคลาสระดับสูงที่เป็นนามธรรม กล่าวอีกนัยหนึ่งก็คือ มันรู้ว่าเราต้องการฟังก์ชันอะไร แต่วิธีการนำไปใช้นั้นอยู่นอกขอบเขตของคลาสนี้ สิ่งนี้มีประโยชน์มากมาย:
- เราเปิดเผยข้อมูลขั้นต่ำที่จำเป็นต่อหน่วยงานภายนอก ซึ่งช่วยให้เรามุ่งเน้นไปที่การคิดผ่านโปรแกรม (ซึ่งช่วยให้สามารถคิดอย่างมีสมาธิ) หลีกเลี่ยงความสับสน และหลีกเลี่ยงการให้คำมั่นสัญญาโดยไม่ตั้งใจ
- เราปล่อยให้มีช่องว่างสำหรับการปรับปรุงในอนาคตซึ่งจะไม่สามารถทำได้หากมีการเปิดเผยรายละเอียดการใช้งาน
มรดก
"มรดก" ในภาษาอังกฤษทั่วไปหมายถึง "ได้รับและส่งต่อ" คำนี้มีอยู่ในวัฒนธรรมของเรามาเป็นเวลานาน บรรพบุรุษได้มาซึ่งที่ดินผ่านการทำงานหนักและส่งต่อให้ลูกหลาน แม้แต่ธรรมชาติก็ยังสนับสนุนมรดกอีกด้วย คุณสมบัติของร่างกายทั้งหมด เช่น ส่วนสูง สีผิว/ตา/สีผม เป็นต้น ขึ้นอยู่กับยีนที่เราสืบทอดมาจากพ่อแม่ของเรา การสืบทอดช่วยป้องกันการสร้างวงล้อใหม่และเร่งความก้าวหน้า มันก็เหมือนกันใน OOP เราสร้างคลาสพาเรนต์ที่มีคุณสมบัติ/พฤติกรรมพื้นฐานบางประการ คลาสทั้งหมดที่สืบทอดมาจากพาเรนต์นี้จะมีคุณสมบัติ/พฤติกรรมเหมือนกับคลาสพาเรนต์ อย่างไรก็ตาม คลาสที่สืบทอดมาอาจได้รับคุณสมบัติ/พฤติกรรมเพิ่มขึ้น หรือเปลี่ยนแปลงการนำพฤติกรรมไปใช้class WritingInstrument { colour; write() { } } class Pen (child of parent) { inkcolour; }
ในตัวอย่างข้างต้น คลาสพาเรนต์ (WritingInstrument) มีคุณสมบัติ "สี" และลักษณะการทำงาน "เขียน" เมื่อมีการประกาศคลาสลูกหลาน (หมายเลขอ้างอิง) คุณสมบัติ "สี" และลักษณะการทำงาน "เขียน" ไม่จำเป็นต้องประกาศอีกครั้ง มีอยู่ในคลาส "handle" เนื่องจากการสืบทอด อย่างไรก็ตาม คลาสลูกหลานสามารถประกาศคุณสมบัติ/พฤติกรรมเพิ่มเติมของตนเองได้ เราจะใช้สิ่งนี้ในทางปฏิบัติได้อย่างไร? นักพัฒนาเราขี้เกียจมาก เราไม่อยากพิมพ์อะไรซ้ำแล้วซ้ำเล่า การมีอยู่ของรหัสเดียวกันหลายชุดไม่สนับสนุนเนื่องจากการพิจารณาดังต่อไปนี้:
- ยิ่งสำเนาโค้ดน้อยเท่าไร การดูแลรักษาก็จะยิ่งง่ายขึ้นเท่านั้น
- หากมีสำเนาโค้ดไม่มาก การเปลี่ยนแปลงในที่เดียวจะปรากฏทุกที่
- รหัสน้อยลงข้อผิดพลาดก็จะน้อยลง
- หากใช้รหัสเดียวในหลาย ๆ ที่ การวางนัยทั่วไปก็จะสำเร็จได้
- เราเน้นการเขียนโค้ด
- เราเน้นการทดสอบ
class WritingInstrument { } class Pen extends WritingInstrument { }
ความแตกต่าง
คำว่า "polymorphism" มาจากคำสองคำ: "Poly"คือ “หลาย” / “มากกว่าหนึ่ง” “morph”เช่น “รูปแบบ” ตามตัวอักษร คำว่า “ความหลากหลาย” หมายถึงความสามารถของวัตถุที่จะประพฤติในลักษณะที่แตกต่างกันขึ้นอยู่กับเงื่อนไข ในการเขียนโปรแกรม polymorphism สามารถนำไปใช้ได้หลายแห่ง:- ชั้นเรียน
- วิธีการ
- ผู้ประกอบการ
Class WritingObject { wrire() { // пишем, используя стандартные (по дефолту) цвета } } class Pencil extends WritingObject { write() { // пишем, используя серый цвет, написанный текст можно стереть } } class Pen extends WritingObject { write() { // пишем, используя голубой цвет, написанный текст нельзя стереть } } class Main { main() { WritingObject wr = new WritingObject(); wr.write(); // первый вызов WritingObject wr = new Pen(); wr.write(); // второй вызов WritingObject wr2 = new Pencil(); wr2.write(); // третий вызов } }
ตัวอย่างด้านบนมีการใช้งานเริ่มต้นใน WritingObject ซึ่งได้รับการขยาย/แทนที่โดยปากกาและปากกาคลาสที่สืบทอด เมธอด write() ถูกเรียกสามครั้งในคลาส Main แต่ละครั้งที่มีการเรียกใช้การใช้งานที่แตกต่างกัน ขึ้นอยู่กับออบเจ็กต์ที่เรียกใช้เมธอด ในกรณีนี้ เมธอด write() มีพฤติกรรมหลายประเภทเนื่องจากเป็นแบบโพลีมอร์ฟิก
การห่อหุ้ม
การห่อหุ้มหมายถึงการรวบรวมข้อมูล/ฟังก์ชันการทำงานที่เกี่ยวข้องในหน่วยเดียว ซึ่งช่วยในการอำนวยความสะดวกในการเข้าถึง/แก้ไขข้อมูล ตัวอย่างเช่น หากเราต้องการพิมพ์คุณสมบัติทั้งหมดที่ผู้ใช้กำหนด เรามีทางเลือกดังต่อไปนี้:printUserProperties(userName, userId, firstname, lastname, email, phone, … … ….)
เราสร้างวิธีการที่นำคุณสมบัติทั้งหมดมาพิมพ์ทีละรายการ เมื่อจำนวนองค์ประกอบในรายการเพิ่มขึ้น จะไม่สามารถระบุฟิลด์ที่ถูกต้องได้อีกต่อไป และการเพิ่ม/ลบฟิลด์หนึ่งฟิลด์จะเปลี่ยนลายเซ็นวิธีการ ดังนั้นเราจึงจำเป็นต้องแทนที่ผู้ใช้ทั้งหมดของวิธีนี้ แม้ว่าพวกเขาจะไม่ต้องการฟิลด์ที่เพิ่มล่าสุดก็ตาม เพื่อให้โค้ดอ่านง่ายขึ้นและทำให้การแก้ไขในอนาคตง่ายขึ้น เราได้สรุปคุณสมบัติในคลาสและเปลี่ยนให้เป็นวัตถุแบบรวม อ็อบเจ็กต์ class User { userName userId firstname lastname email phone .. .. .. } printUserProperties(user) {}
คือชุดซอฟต์แวร์ของตัวแปรและวิธีการที่เกี่ยวข้อง คุณสามารถแสดงวัตถุในโลกแห่งความเป็นจริงได้โดยใช้วัตถุของโปรแกรม คุณสามารถจินตนาการถึงสุนัขตัวจริงในโปรแกรมแอนิเมชั่น หรือจักรยานจริงเป็นวัตถุซอฟต์แวร์ภายในจักรยานออกกำลังกาย ใน OOP คลาสคือเทมเพลตที่ขยายได้ (เทมเพลตโค้ดโปรแกรม) สำหรับการสร้างออบเจ็กต์ โดยจัดให้มีสถานะเริ่มต้น (ตัวแปร) และพฤติกรรมการใช้งาน (ฟังก์ชัน วิธีการ) ตัวย่อ SOLID ได้รับการประกาศเกียรติคุณโดย Michael Feather สำหรับ "หลักการห้าประการแรก" ซึ่งตั้งชื่อโดย Robert C. Martin ในช่วงต้นทศวรรษ 2000 เป้าหมายของหลักการเมื่อนำไปใช้ร่วมกันคือเพื่อเพิ่มโอกาสที่โปรแกรมเมอร์จะสร้างระบบที่ง่ายต่อการบำรุงรักษาและขยาย หลักการ SOLIDเป็นแนวทางในการพัฒนาโปรแกรมที่จำเป็นในการลบโค้ดที่ "เน่าเสีย" ออกด้วยการปรับโครงสร้างใหม่ ซึ่งส่งผลให้โค้ดสามารถอ่านและขยายได้ง่าย นี่เป็นส่วนหนึ่งของกลยุทธ์การเขียนโปรแกรมแบบคล่องตัวและปรับเปลี่ยนได้
หลักการความรับผิดชอบเดียว
ใน OOP หลักการความรับผิดชอบเดียวระบุว่าแต่ละคลาสควรรับผิดชอบส่วนหนึ่งของฟังก์ชันการทำงานที่ได้รับจากโปรแกรม และความรับผิดชอบนั้นควรถูกห่อหุ้มโดยคลาสนั้นโดยสมบูรณ์ ฟังก์ชั่นทั้งหมดควรเกี่ยวข้องอย่างใกล้ชิดกับความรับผิดชอบนี้หลักการเปิด/ปิด
ใน OOP หลักการเปิด/ปิดระบุว่า “เอนทิตีซอฟต์แวร์ (คลาส โมดูล วิธีการ ฯลฯ) ควรเปิดให้ขยาย แต่ปิดเพื่อเปลี่ยนแปลง” กล่าวอีกนัยหนึ่ง เอนทิตีต้องอนุญาตให้ขยายลักษณะการทำงานโดยไม่ต้องเปลี่ยนซอร์สโค้ดหลักการทดแทนลิสคอฟ
การทดแทนเป็นหลักการใน OOP โดยระบุว่าถ้า S ในโปรแกรมคอมพิวเตอร์เป็นชนิดย่อยของ T ดังนั้นวัตถุประเภท T จะต้องสามารถถูกแทนที่ด้วยวัตถุประเภท S ได้ (เช่น วัตถุประเภท S สามารถถูกแทนที่ด้วยวัตถุประเภท T) โดยไม่เปลี่ยนแปลง โปรแกรมคุณสมบัติที่จำเป็น (ความแม่นยำ ความสมบูรณ์ของงาน ฯลฯ)หลักการแยกส่วนต่อประสาน
หลักการของการแยกส่วนต่อประสานระบุว่าโปรแกรมเมอร์ไคลเอนต์ไม่ควรถูกบังคับให้ขึ้นอยู่กับวิธีการที่ไม่ได้ใช้ ตามหลักการนี้จำเป็นต้องแบ่งอินเทอร์เฟซขนาดใหญ่ออกเป็นส่วนเล็ก ๆ และเฉพาะเจาะจงมากขึ้นเพื่อให้โปรแกรมเมอร์ไคลเอนต์รู้เฉพาะวิธีการที่น่าสนใจสำหรับเขาเท่านั้น วัตถุประสงค์ของหลักการแยกส่วนอินเทอร์เฟซคือเพื่อให้ระบบแยกส่วน ซึ่งจะทำให้ง่ายต่อการปรับโครงสร้างใหม่ ทำการเปลี่ยนแปลง และปรับใช้ใหม่หลักการผกผันการพึ่งพา
ใน OOP หลักการของการผกผันการพึ่งพาหมายถึงรูปแบบเฉพาะของการตัดการเชื่อมต่อของโมดูลโปรแกรม โดยการปฏิบัติตามหลักการนี้ ความสัมพันธ์การพึ่งพามาตรฐานที่สร้างขึ้นจากโมดูลระดับสูงที่สร้างสถาปัตยกรรมแอปพลิเคชัน (การตั้งค่านโยบาย) ไปยังโมดูลระดับต่ำที่ขึ้นต่อกันจะถูกกลับด้าน (กลับรายการ) เพื่อให้โมดูลระดับสูงที่ถูกแก้ไขกลายเป็นอิสระจากรายละเอียดการใช้งานของ โมดูลระดับต่ำ หลักการนี้ระบุว่า:- โมดูลระดับสูงไม่ควรขึ้นอยู่กับโมดูลระดับต่ำ โมดูลทั้งสองประเภทต้องขึ้นอยู่กับนามธรรม
- นามธรรมไม่ควรขึ้นอยู่กับรายละเอียดการใช้งาน รายละเอียดจะต้องขึ้นอยู่กับนามธรรม
หลักการของ GRASP
รูปแบบซอฟต์แวร์มอบหมายความรับผิดชอบทั่วไป (GRASP) ให้แนวทางในการกำหนดความรับผิดชอบให้กับคลาสและอ็อบเจ็กต์ในการออกแบบเชิงวัตถุคอนโทรลเลอร์
รูปแบบตัวควบคุมกำหนดความรับผิดชอบในการโต้ตอบกับเหตุการณ์ของระบบให้กับคลาสที่ไม่ใช่ GUI ซึ่งเป็นตัวแทนของสถานการณ์ทั้งระบบหรือกรณีการใช้งาน ตัวควบคุม:- นี่คือออบเจ็กต์ที่ไม่ได้โต้ตอบกับผู้ใช้โดยตรง และมีหน้าที่รับผิดชอบในการรับและตอบสนองต่อเหตุการณ์ของระบบ
- ต้องใช้เพื่อจัดการกับเหตุการณ์ระบบทั้งหมดของกรณีการใช้งานหนึ่ง (หรือหลายกรณีที่เกี่ยวข้องกัน)
- เป็นวัตถุแรกที่อยู่เบื้องหลัง GUI ที่ควบคุมการทำงานของระบบ
- เขาไม่จำเป็นต้องทำงานเอง งานของเขาคือควบคุมการไหลของเหตุการณ์
ผู้สร้าง
งานของคลาส Creator คือการสร้างและเริ่มต้นวัตถุเพื่อใช้ในภายหลัง โดยจะรู้พารามิเตอร์การเริ่มต้น รวมถึงออบเจ็กต์ที่จะถูกสร้างขึ้น บางครั้งคลาสผู้สร้างจะสร้างวัตถุและวางไว้ในแคช และจัดให้มีอินสแตนซ์หนึ่งรายการเมื่อจำเป็นการทำงานร่วมกันสูง
การทำงานร่วมกันสูงเป็นรูปแบบการประเมิน โดยมีจุดประสงค์เพื่อรักษาวัตถุให้อยู่ในสภาพที่มุ่งเป้าไปที่การปฏิบัติงานที่ชัดเจนเพียงงานเดียว ควบคุมและเข้าใจได้ง่าย High Coupling มักใช้เพื่อรองรับ Low Coupling ความสอดคล้องกันสูงหมายความว่าความรับผิดชอบขององค์ประกอบที่กำหนดได้รับการกำหนดไว้อย่างชัดเจน (เกี่ยวข้องกันอย่างมากและมุ่งเน้นอย่างมาก) การแบ่งโปรแกรมออกเป็นคลาสและระบบย่อยเป็นตัวอย่างของการดำเนินการที่เพิ่มการทำงานร่วมกันของคุณสมบัติของระบบ ในทางกลับกัน การคัปปลิ้งแบบหลวมคือสถานการณ์ที่องค์ประกอบมีงานที่ไม่เกี่ยวข้องมากเกินไป องค์ประกอบที่อยู่คู่กันอย่างหลวมๆ มักจะเข้าใจยาก นำกลับมาใช้ใหม่ ดูแลรักษายาก และเปลี่ยนแปลงได้ยากทางอ้อม
รูปแบบวงเวียนรักษาการเชื่อมต่อแบบหลวมๆ (และการนำกลับมาใช้ใหม่ได้) ระหว่างสององค์ประกอบโดยมอบหมายความรับผิดชอบสำหรับการโต้ตอบระหว่างองค์ประกอบเหล่านั้นกับวัตถุที่อยู่ตรงกลาง ตัวอย่างคือการแนะนำตัวควบคุมเพื่อเป็นสื่อกลางระหว่างข้อมูล (โมเดล) และการแสดงผล (มุมมอง) ในรูปแบบ Model-View-Controller (MVC)ผู้เชี่ยวชาญด้านข้อมูล
ผู้เชี่ยวชาญด้านข้อมูล (รวมถึงหลักการของผู้เชี่ยวชาญหรือผู้เชี่ยวชาญ) เป็นหลักการที่ใช้ในการกำหนดว่าใครจะมอบหมายความรับผิดชอบให้ ความรับผิดชอบรวมถึงวิธีการ เขตข้อมูลจากการคำนวณ ฯลฯ เมื่อใช้หลักการนี้เมื่อมอบหมายความรับผิดชอบ แนวทางหลักคือลำดับการดำเนินการต่อไปนี้: การวิเคราะห์ความรับผิดชอบ การระบุข้อมูลที่จำเป็นในการตอบสนอง และสุดท้ายคือการกำหนดตำแหน่งของข้อมูลนี้ การใช้หลักการผู้เชี่ยวชาญด้านข้อมูลส่งผลให้มีการมอบหมายความรับผิดชอบให้กับชั้นเรียนที่มีข้อมูลมากที่สุดในการดำเนินการคลัปต่ำ
การมีเพศสัมพันธ์แบบหลวมเป็นรูปแบบการประเมินที่ระบุวิธีการกำหนดความรับผิดชอบ: การมีเพศสัมพันธ์แบบหลวมระหว่างคลาสต่างๆ การเปลี่ยนประเภทหนึ่งควรมีผลกระทบน้อยที่สุดต่ออีกประเภทหนึ่ง และเพิ่มความสามารถในการนำกลับมาใช้ใหม่ได้สูงสุดความแตกต่าง
ตามความหลากหลาย ความแปรผันของพฤติกรรมตามประเภทถูกกำหนดให้กับประเภทที่การเปลี่ยนแปลงนี้เกิดขึ้น ซึ่งสามารถทำได้โดยการใช้การดำเนินการแบบโพลีมอร์ฟิกรูปแบบที่ได้รับการคุ้มครอง
รูปแบบการเปลี่ยนแปลงที่ได้รับการป้องกันช่วยปกป้ององค์ประกอบจากการเปลี่ยนแปลงองค์ประกอบอื่นๆ (ออบเจ็กต์ ระบบ ระบบย่อย) โดยการห่อจุดเน้นของความไม่เสถียรในอินเทอร์เฟซ และใช้ความหลากหลายเพื่อสร้างการใช้งานที่แตกต่างกันของอินเทอร์เฟซนั้นการผลิตที่บริสุทธิ์
โครงสร้างที่แท้จริงเกี่ยวข้องกับคลาสที่ไม่ได้แสดงถึงแนวคิดในโดเมนของปัญหา และได้รับการออกแบบมาโดยเฉพาะเพื่อให้บรรลุการมีเพศสัมพันธ์แบบหลวม การมีเพศสัมพันธ์ที่สูง และดังนั้นจึงมีศักยภาพในการนำกลับมาใช้ใหม่สูงสุด (โซลูชันที่นำเสนอโดยรูปแบบผู้เชี่ยวชาญด้านข้อมูลไม่บรรลุผลในสิ่งนี้) คลาสดังกล่าวมักเรียกว่า “บริการ” ในการออกแบบที่ขับเคลื่อนด้วยโดเมนการวิพากษ์วิจารณ์
การวิจัยโดย Potok และคณะ ไม่พบความแตกต่างที่มีนัยสำคัญระหว่าง OOP และแนวทางขั้นตอนการเปรียบเทียบ OOP อย่างมีวิจารณญาณกับเทคโนโลยีอื่นๆ โดยเฉพาะเทคโนโลยีเชิงสัมพันธ์ เป็นเรื่องยากเนื่องจากขาดคำจำกัดความของ OOP ที่เข้มงวดและเป็นที่ยอมรับอย่างกว้างขวาง (Christopher J. Date)
เมื่อเปรียบเทียบกับภาษาอื่น (ภาษาถิ่น LISP ภาษาที่ใช้งานได้ ฯลฯ ) ภาษา OOP ไม่มีข้อได้เปรียบเฉพาะตัวและสร้างความซับซ้อนที่ไม่จำเป็น (ลอว์เรนซ์ ครับเนอร์)
ฉันพบว่าการเขียนโปรแกรมเชิงวัตถุนั้นบอบบางในทางเทคนิค มันพยายามแยกย่อยโลกออกเป็นส่วน ๆ ในแง่ของอินเทอร์เฟซที่แตกต่างกันไปในประเภทเดียว เพื่อจัดการกับปัญหาที่แท้จริง คุณต้องมีพีชคณิตที่มีการจัดเรียงหลายแบบ - กลุ่มอินเทอร์เฟซที่ขยายออกไปหลายประเภท ฉันพบว่าการเขียนโปรแกรมเชิงวัตถุนั้นไม่ดีต่อสุขภาพ ระบุว่าทุกสิ่งเป็นวัตถุ แม้ว่าสิ่งนี้จะเป็นเรื่องจริง แต่ก็ไม่น่าสนใจนัก การจะบอกว่าทุกสิ่งเป็นเพียงวัตถุคือการไม่พูดอะไรเลย (อเล็กซานเดอร์ สเตปานอฟ)
ความนิยมของ OOP ในกลุ่มบริษัทขนาดใหญ่นั้นเกิดจาก "กลุ่มโปรแกรมเมอร์ธรรมดาๆ ขนาดใหญ่ (และเปลี่ยนแปลงบ่อย)" วินัยที่กำหนดโดย OOP ป้องกันไม่ให้โปรแกรมเมอร์ทำ "อันตรายมากเกินไป" (พอล เกรแฮม)
การเขียนโปรแกรมเชิงวัตถุให้ความสำคัญกับคำนามเป็นอันดับแรกและสำคัญที่สุด เหตุใดจึงต้องใช้มาตรการที่รุนแรงเช่นนี้และวางส่วนหนึ่งของคำพูดไว้บนแท่น? เหตุใดแนวคิดหนึ่งจึงมีความสำคัญเหนือแนวคิดอื่น เป็นไปไม่ได้ที่ OOP จะทำให้คำกริยามีความสำคัญน้อยลงต่อความคิดของเราในทันที นี่เป็นมุมมองที่บิดเบี้ยวอย่างน่าประหลาด (สตีฟ เย็กจ์)Rick Hickey ผู้สร้าง Clojure อธิบายว่าระบบวัตถุเป็นแบบจำลองที่เรียบง่ายอย่างยิ่งในโลกแห่งความเป็นจริง เขาเน้นย้ำว่า OOP ไม่สามารถจำลองเวลาได้อย่างถูกต้อง ซึ่งสร้างปัญหาใหญ่เมื่อมัลติเธรดกลายเป็นเรื่องปกติในโปรแกรม Eric S. Raymond โปรแกรมเมอร์ Unix และผู้สนับสนุนซอฟต์แวร์โอเพ่นซอร์ส วิจารณ์คำกล่าวอ้างที่ว่า OOP คือ "The One Solution" และเขียนว่า OOP สนับสนุนโปรแกรมแบบหลายชั้น ซึ่งเป็นอุปสรรคต่อความโปร่งใส ในทางตรงกันข้าม Raymond ได้ยกตัวอย่าง Unix และ C.
GO TO FULL VERSION