ในภาคการศึกษาแรกเราได้รับการแนะนำให้รู้จักกับแนวคิดของ OOP เช่นการห่อหุ้มการซ่อนข้อมูลการแยกส่วนการสืบทอดและอื่น ๆ ผ่านทาง Java และ UML (Java เป็นภาษาโปรแกรมแรกของฉัน)
สิ่งเหล่านี้ไม่ใช่แนวคิดของ OOP พวกเขาทั้งหมดอยู่นอก OO เป็นอิสระจาก OO และหลายคนถูกคิดค้นขึ้นมาก่อน OO
ดังนั้นถ้าคุณคิดว่าที่เป็นสิ่งที่ OO คือทั้งหมดที่เกี่ยวแล้วบทสรุปของคุณขวา: คุณสามารถทำได้ทั้งหมดของผู้ที่อยู่ในภาษาขั้นตอนเพราะพวกเขาไม่มีอะไรจะทำอย่างไรกับ OO
ตัวอย่างหนึ่งของเอกสารน้ำเชื้อใน Modularity เป็นเกณฑ์ที่จะใช้ในระบบการย่อยสลายเป็นโมดูล ไม่มีการกล่าวถึง OO ในนั้น (มันถูกเขียนในปี 1972 ตอนนั้น OO ยังคงเป็นโพรงที่คลุมเครือแม้จะมีอายุมากกว่าหนึ่งทศวรรษแล้วก็ตาม)
ในขณะที่Data Abstractionมีความสำคัญใน OO มันเป็นผลมาจากคุณสมบัติหลักของ OO (Messaging) มากกว่าคุณสมบัติที่กำหนดไว้ นอกจากนี้เป็นสิ่งสำคัญที่ต้องจำไว้ว่ามีนามธรรมของข้อมูลที่แตกต่างกัน ทั้งสองชนิดที่พบบ่อยที่สุดของนามธรรมข้อมูลที่ใช้อยู่ในปัจจุบัน (ถ้าเราไม่สนใจ "นามธรรมใด ๆ" ซึ่งอาจจะยังคงใช้มากกว่าอีกสองคนรวมกัน) เป็นชนิดข้อมูลนามธรรมและวัตถุ ดังนั้นเพียงแค่พูดว่า "การซ่อนข้อมูล", "Encapsulation" และ "Data Abstraction" คุณไม่ได้พูดอะไรเกี่ยวกับ OO เนื่องจาก OO เป็นเพียงรูปแบบหนึ่งของ Data Abstraction และทั้งสองมีความแตกต่างกันโดยพื้นฐาน:
- กับชนิดข้อมูลนามธรรมกลไกสำหรับนามธรรมเป็นระบบการพิมพ์ ; เป็นระบบชนิดที่ซ่อนการนำไปใช้งาน (ระบบประเภทไม่จำเป็นต้องเป็นแบบคงที่) ด้วย Objects การนำไปใช้งานจะถูกซ่อนไว้ด้านหลังส่วนต่อประสานงานขั้นตอนซึ่งไม่ต้องการประเภท (ตัวอย่างเช่นสามารถใช้กับการปิดได้เช่นเดียวกับที่ทำใน ECMAScript)
- ด้วยประเภทข้อมูลนามธรรมอินสแตนซ์ของ ADT ที่แตกต่างกันนั้นถูกห่อหุ้มจากกันและกัน แต่อินสแตนซ์ของADT เดียวกันนั้นสามารถตรวจสอบและเข้าถึงการเป็นตัวแทนของกันและกันและการนำไปใช้ส่วนตัว วัตถุที่มีการเสมอห่อหุ้มจากทุกอย่าง เพียงวัตถุที่ตัวเองสามารถตรวจสอบการเป็นตัวแทนของตัวเองและการเข้าถึงการใช้งานส่วนตัว ไม่มีวัตถุอื่น ๆแม้แต่วัตถุชนิดเดียวกันอินสแตนซ์อื่นของคลาสเดียวกันวัตถุอื่นที่มีต้นแบบเดียวกันโคลนของวัตถุหรืออะไรก็ตามที่ทำได้ ไม่มีเลย
สิ่งนี้มีความหมายว่าใน Java ชั้นเรียนไม่ได้มุ่งเน้นวัตถุ สองอินสแตนซ์ของคลาสเดียวกันสามารถเข้าถึงการเป็นตัวแทนของกันและกันและการใช้งานส่วนตัว ดังนั้นอินสแตนซ์ของคลาสไม่ใช่วัตถุ แต่เป็นอินสแตนซ์ ADT จริง interface
อย่างไรก็ตามJava จะให้ข้อมูลเชิงวัตถุที่เป็นนามธรรม ดังนั้นในคำอื่น ๆ : อินสแตนซ์ของอินเทอร์เฟซเท่านั้นเป็นวัตถุใน Java อินสแตนซ์ของคลาสไม่
โดยทั่วไปสำหรับประเภทคุณสามารถใช้อินเตอร์เฟสได้เท่านั้น นี่หมายถึงประเภทพารามิเตอร์ของวิธีการและตัวสร้างประเภทวิธีการส่งกลับประเภทของเขตข้อมูลอินสแตนซ์, สนามคงที่และเขตท้องถิ่นการโต้แย้งไปยังinstanceof
ผู้ประกอบการหรือผู้ประกอบการหล่อและอาร์กิวเมนต์ประเภทสำหรับตัวสร้างประเภททั่วไปจะต้องอินเตอร์เฟซ คลาสสามารถใช้ได้เฉพาะหลังจากnew
โอเปอเรเตอร์เท่านั้นไม่มีที่อื่น
ตัวอย่างเช่นสำหรับ modularity เราสามารถแบ่งโปรแกรมออกเป็นโปรแกรมขนาดเล็กจำนวนมากที่ทำงานได้ดีซึ่งมีรหัสอยู่ในไฟล์แยกต่างหาก โปรแกรมเหล่านี้จะโต้ตอบซึ่งกันและกันผ่านอินพุตและเอาต์พุตที่กำหนดไว้อย่างดี ไฟล์อาจได้รับการปกป้อง (เข้ารหัส?) เพื่อให้ได้การห่อหุ้ม สำหรับการใช้รหัสซ้ำเราสามารถเรียกไฟล์เหล่านั้นได้ทุกเมื่อที่ต้องการในโปรแกรมใหม่ สิ่งนี้ไม่ได้จับทุกสิ่งที่เป็น OOP หรือฉันขาดสิ่งที่ชัดเจนมากไป?
สิ่งที่คุณอธิบายคือ OO
นั่นเป็นวิธีที่ดีในการคิดถึง OO ในความเป็นจริงมันเป็นสิ่งที่นักประดิษฐ์ดั้งเดิมของ OO มีอยู่ในใจ (อลันเคย์ก้าวไปอีกขั้นหนึ่ง: เขานึกภาพคอมพิวเตอร์เล็ก ๆ จำนวนมากส่งข้อความถึงกันผ่านเครือข่าย) สิ่งที่คุณเรียกว่า "โปรแกรม" มักจะเรียกว่า "วัตถุ" และแทนที่จะเป็น "โทร" เรามักจะพูดว่า "ส่งข้อความ" "
การวางแนววัตถุนั้นเกี่ยวกับการส่งข้อความ ( การจัดส่งไดนามิก ) คำว่า "Object Oriented" จัดทำโดย Dr. Alan Kay ผู้ออกแบบหลักของ Smalltalk และเขานิยามดังนี้:
OOP สำหรับฉันหมายถึงเพียงการส่งข้อความการเก็บรักษาในท้องถิ่นและการป้องกันและการซ่อนกระบวนการของรัฐและการผูกมัดปลายสุดของทุกสิ่ง
มาทำลายมันกันเถอะ:
- ส่งข้อความ ("การกระจายวิธีการเสมือน" หากคุณไม่คุ้นเคยกับ Smalltalk)
- กระบวนการของรัฐควรจะเป็น
- เก็บไว้ในเครื่อง
- มีการป้องกัน
- ซ่อนเร้น
- สุดขีดผูกพันทุกสิ่ง
การนำไปใช้งานอย่างชาญฉลาดการรับส่งข้อความเป็นการเรียกโพรซีเดอร์ล่าช้าและหากการเรียกโพรซีเดอร์ล่าช้าคุณไม่สามารถรู้ได้ในขณะออกแบบสิ่งที่คุณกำลังจะเรียกดังนั้นคุณจึงไม่สามารถทำการตั้งสมมติฐานใด ๆ ดังนั้นจริงๆแล้วมันเกี่ยวกับการส่งข้อความการผูกมัดล่าช้าคือการใช้การส่งข้อความและการห่อหุ้มเป็นผลมาจากมัน
ในภายหลังเขาชี้แจงว่า " ความคิดใหญ่คือ 'การส่งข้อความ' " และรู้สึกเสียใจที่ได้เรียกมันว่า "เชิงวัตถุ" แทนที่จะเป็น "ข้อความเชิง" เพราะคำว่า "เชิงวัตถุ" ให้ความสำคัญกับสิ่งที่ไม่สำคัญ (วัตถุ ) และเบี่ยงเบนความสนใจจากสิ่งที่สำคัญจริงๆ (การส่งข้อความ):
เพียงเตือนความทรงจำเบา ๆ ว่าฉันเอาความเจ็บปวดที่ OOPSLA สุดท้ายเพื่อพยายามเตือนทุกคนว่า Smalltalk ไม่เพียง แต่ไม่ได้เป็นไวยากรณ์หรือไลบรารีของชั้นเรียนเท่านั้น ฉันขอโทษที่ฉันนานมาแล้วประกาศเกียรติคุณคำว่า "วัตถุ" สำหรับหัวข้อนี้เพราะมันทำให้คนจำนวนมากมุ่งเน้นไปที่ความคิดน้อย
แนวคิดหลักคือ "การส่งข้อความ" - นั่นคือสิ่งที่ kernal ของ Smalltalk / Squeak เป็นเรื่องเกี่ยวกับ (และเป็นสิ่งที่ไม่เคยเสร็จสมบูรณ์ในระยะ Xerox PARC ของเรา) ภาษาญี่ปุ่นมีคำขนาดเล็ก - มา - สำหรับ "สิ่งที่อยู่ระหว่าง" - อาจเทียบเท่าภาษาอังกฤษที่ใกล้ที่สุดคือ "คั่นระหว่างหน้า" กุญแจสำคัญในการทำให้ระบบที่ยอดเยี่ยมและเติบโตได้นั้นมีมากขึ้นในการออกแบบว่าโมดูลสื่อสารได้อย่างไรมากกว่าคุณสมบัติและพฤติกรรมภายในของมัน คิดถึงอินเทอร์เน็ต - เพื่อการมีชีวิตอยู่ (ก) ต้องอนุญาตให้มีความคิดและการรับรู้ที่แตกต่างหลากหลายซึ่งอยู่นอกเหนือมาตรฐานเดียวและ (b) เพื่อให้การทำงานร่วมกันอย่างปลอดภัยระหว่างความคิดเหล่านี้มีระดับแตกต่างกัน
(แน่นอนวันนี้ผู้คนส่วนใหญ่ไม่ได้สนใจวัตถุ แต่เรียนซึ่งผิดยิ่งกว่า)
การส่งข้อความเป็นพื้นฐานของ OO ทั้งในฐานะคำอุปมาและเป็นกลไก
หากคุณส่งข้อความถึงใครบางคนคุณไม่รู้ว่าพวกเขาทำอะไรกับมัน เพียงสิ่งที่คุณสามารถสังเกตคือการตอบสนองของพวกเขา คุณไม่ทราบว่าพวกเขาประมวลผลข้อความด้วยตนเอง (เช่นถ้าวัตถุมีวิธีการ) ถ้าพวกเขาส่งต่อข้อความไปยังบุคคลอื่น (การมอบหมาย / การมอบฉันทะ) หากพวกเขาเข้าใจ นั่นคือสิ่งที่ encapsulation เกี่ยวกับนั่นคือสิ่งที่ OO เป็นเรื่องเกี่ยวกับ คุณไม่สามารถแยกความแตกต่างของพร็อกซีจากของจริงได้ตราบใดที่มันตอบสนองตามที่คุณคาดหวัง
คำว่า "ทันสมัย" มากกว่าสำหรับ "การส่งข้อความ" คือ "การกระจายวิธีการแบบไดนามิก" หรือ "การเรียกใช้วิธีการเสมือน" แต่นั่นทำให้คำอุปมาเสียและมุ่งเน้นไปที่กลไก
ดังนั้นมีสองวิธีในการดูคำจำกัดความของ Alan Kay: หากคุณมองมันด้วยตนเองคุณอาจสังเกตว่าการส่งข้อความนั้นเป็นการเรียกขั้นตอนที่ล่าช้าและการผูกปลายหมายถึงการห่อหุ้มดังนั้นเราจึงสามารถสรุปได้ว่า # 1 และ # 2 ซ้ำซ้อนจริง ๆ และ OO นั้นเกี่ยวกับการผูกสาย
อย่างไรก็ตามในภายหลังเขาชี้แจงว่าสิ่งสำคัญคือการส่งข้อความและเพื่อให้เราสามารถดูได้จากมุมที่แตกต่าง: การส่งข้อความนั้นล่าช้า ตอนนี้ถ้าการส่งข้อความเป็นเพียงสิ่งที่เป็นไปได้แล้ว # 3 จะนิด ๆ เป็นจริง: หากมีเพียงสิ่งหนึ่งและสิ่งที่เป็นปลายที่ถูกผูกไว้แล้วทุกสิ่งที่มีขอบล่าช้า และอีกครั้ง encapsulation ตามมาจากการส่งข้อความ
ประเด็นที่คล้ายกันนี้จัดทำขึ้นในการทำความเข้าใจเกี่ยวกับข้อมูลที่เป็นนามธรรม RevisitedโดยWilliam R. Cookและข้อเสนอของเขาสำหรับประยุกต์คำจำกัดความที่ทันสมัยของ "Object" และ "Object Oriented" :
การจัดส่งแบบไดนามิกของการดำเนินการเป็นลักษณะสำคัญของวัตถุ หมายความว่าการดำเนินการที่จะเรียกใช้เป็นคุณสมบัติแบบไดนามิกของวัตถุเอง ไม่สามารถระบุการดำเนินการแบบสแตติกได้และไม่มีวิธีใดที่จะทราบ [การดำเนินงาน] ว่าการดำเนินการใดที่จะดำเนินการเพื่อตอบสนองต่อคำขอที่ได้รับยกเว้นโดยการเรียกใช้ สิ่งนี้เหมือนกับฟังก์ชั่นชั้นหนึ่งซึ่งจะถูกส่งแบบไดนามิกเสมอ
ใน Smalltalk-72 ไม่มีแม้แต่วัตถุใด ๆ ! มีเฉพาะสตรีมข้อความที่แยกวิเคราะห์เขียนใหม่และเปลี่ยนเส้นทางใหม่ วิธีมาก่อน (วิธีมาตรฐานในการแยกวิเคราะห์และเปลี่ยนเส้นทางสตรีมข้อความ) มาวัตถุในภายหลัง (การจัดกลุ่มของวิธีการที่ใช้ร่วมกันบางรัฐส่วนตัว) การสืบทอดมามากในภายหลังและชั้นเรียนได้รับการแนะนำเป็นเพียงวิธีการในการสนับสนุนการสืบทอด หากกลุ่มวิจัยของเคย์รู้เรื่องต้นแบบแล้วพวกเขาอาจจะไม่เคยเข้าชั้นเรียนตั้งแต่แรก
เบนจามินเพียร์ซในประเภทและการเขียนโปรแกรมภาษาระบุว่าการกำหนดคุณสมบัติของวัตถุปฐมนิเทศคือเปิด Recursion
ดังนั้นตาม Alan Kay, OO คือทั้งหมดที่เกี่ยวกับการส่งข้อความ ตามที่ William Cook, OO เป็นข้อมูลเกี่ยวกับวิธีการจัดส่งแบบไดนามิก (ซึ่งเป็นสิ่งเดียวกันจริงๆ) ตามข้อมูลของเบนจามินเพียร์ซ OO เป็นข้อมูลเกี่ยวกับ Open Recursion ซึ่งโดยทั่วไปหมายความว่าการอ้างอิงตนเองนั้นได้รับการแก้ไขแบบไดนามิก (หรืออย่างน้อยนั่นก็เป็นวิธีคิด) หรือพูดอีกอย่างคือการส่งข้อความ
อย่างที่คุณเห็นคนที่เป็นคนบัญญัติศัพท์คำว่า "OO" นั้นมีมุมมองทางอภิปรัชญาค่อนข้างสูงบนวัตถุ Cook มีมุมมองเชิงปฏิบัติมากกว่าและเพียร์ซมีมุมมองทางคณิตศาสตร์ที่เข้มงวดมาก แต่สิ่งที่สำคัญคือนักปรัชญานักปฏิบัตินิยมและนักทฤษฎีล้วนเห็นด้วย! การส่งข้อความเป็นเสาหลักเดียวของ OO ระยะเวลา
โปรดทราบว่าไม่มีการกล่าวถึงมรดกที่นี่! การสืบทอดไม่จำเป็นสำหรับ OO โดยทั่วไปภาษา OO ส่วนใหญ่มีวิธีการนำไปใช้งานใหม่ แต่ไม่จำเป็นต้องสืบทอด มันอาจเป็นรูปแบบของการมอบหมายบางอย่างเช่น ในความเป็นจริงสนธิสัญญาออร์แลนโดกล่าวถึงการมอบอำนาจให้เป็นทางเลือกแทนมรดกและรูปแบบที่แตกต่างกันของการมอบอำนาจและการสืบทอดนำไปสู่จุดการออกแบบที่แตกต่างกันภายในพื้นที่การออกแบบของภาษาเชิงวัตถุ (โปรดทราบว่าจริง ๆ แล้วแม้ในภาษาที่รองรับการสืบทอดเช่น Java คนได้รับการสอนให้หลีกเลี่ยงจริง ๆ อีกครั้งแสดงว่าไม่จำเป็นสำหรับ OO)