การเขียนโปรแกรมตามขั้นตอน / ฟังก์ชั่นนั้นไม่ได้อ่อนแอไปกว่า OOPแม้จะไม่มีข้อโต้แย้งทัวริงก็ตาม (ภาษาของฉันมีพลังทัวริง ที่จริงแล้วเทคนิคเชิงวัตถุถูกทดลองครั้งแรกในภาษาที่ไม่ได้มีในตัว ในแง่นี้การเขียนโปรแกรม OO เป็นลักษณะเฉพาะของการเขียนโปรแกรมตามขั้นตอนเท่านั้น แต่มันช่วยบังคับใช้สาขาวิชาเฉพาะเช่นโมดูลย่อย, นามธรรมและการซ่อนข้อมูลที่จำเป็นสำหรับความเข้าใจโปรแกรมและการบำรุงรักษา
กระบวนทัศน์การเขียนโปรแกรมบางอย่างวิวัฒนาการมาจากวิสัยทัศน์ทางทฤษฎีของการคำนวณ ภาษาอย่าง Lisp วิวัฒนาการมาจากแลมบ์ดาแคลคูลัสและความคิดเกี่ยวกับmeta-circularityของภาษา (คล้ายกับการสะท้อนแสงในภาษาธรรมชาติ) ฮอร์นส่วนคำสั่งบิดาและการเขียนโปรแกรม จำกัด ตระกูลอัลกอลเป็นหนี้ของแลมบ์ดาแคลคูลัส แต่ไม่มีการสะท้อนกลับในตัว
เสียงกระเพื่อมเป็นตัวอย่างที่น่าสนใจเนื่องจากมันได้รับการทดสอบนวัตกรรมทางภาษาโปรแกรมจำนวนมาก
อย่างไรก็ตามภาษามีวิวัฒนาการขึ้นมาบ่อยครั้งภายใต้ชื่อใหม่ ปัจจัยสำคัญของวิวัฒนาการคือการฝึกปฏิบัติการเขียนโปรแกรม ผู้ใช้ระบุวิธีการเขียนโปรแกรมที่ปรับปรุงคุณสมบัติของโปรแกรมเช่นความสามารถในการอ่านการบำรุงรักษาการพิสูจน์ความถูกต้อง จากนั้นพวกเขาพยายามเพิ่มคุณลักษณะหรือข้อ จำกัด ด้านภาษาที่จะสนับสนุนและบางครั้งบังคับใช้แนวทางปฏิบัติเหล่านี้เพื่อปรับปรุงคุณภาพของโปรแกรม
สิ่งนี้หมายความว่าการปฏิบัติเหล่านี้เป็นไปได้แล้วในภาษาโปรแกรมเก่า แต่ใช้ความเข้าใจและมีระเบียบวินัยในการใช้ การรวมไว้ในภาษาใหม่เป็นแนวคิดหลักที่มีไวยากรณ์เฉพาะทำให้การปฏิบัติเหล่านี้ง่ายต่อการใช้และเข้าใจได้ง่ายโดยเฉพาะอย่างยิ่งสำหรับผู้ใช้ที่มีความซับซ้อนน้อยกว่า (เช่นส่วนใหญ่) นอกจากนี้ยังทำให้ชีวิตง่ายขึ้นเล็กน้อยสำหรับผู้ใช้ที่มีความซับซ้อน
อย่างใดอย่างหนึ่งก็คือการออกแบบภาษาสิ่งที่โปรแกรมย่อย / ฟังก์ชั่น / ขั้นตอนคือโปรแกรม เมื่อมีการระบุแนวคิดที่มีประโยชน์จะได้รับชื่อ (อาจ) และไวยากรณ์เพื่อให้สามารถใช้งานได้อย่างง่ายดายในทุกโปรแกรมที่พัฒนาด้วยภาษานั้น และเมื่อประสบความสำเร็จจะรวมอยู่ในภาษาในอนาคตด้วย
ตัวอย่าง: การสร้างการวางแนววัตถุใหม่
ตอนนี้ฉันพยายามที่จะแสดงให้เห็นว่าในตัวอย่าง วัตถุประสงค์ของตัวอย่างนี้ไม่ได้แสดงให้เห็นว่าโปรแกรมเชิงวัตถุสามารถเขียนได้ในรูปแบบการเขียนโปรแกรมตามขั้นตอนซึ่งอาจมีค่าใช้จ่ายในการมองเห็นและการบำรุงรักษา ผมค่อนข้างจะพยายามที่จะแสดงให้เห็นว่าบางภาษาโดยไม่ต้องสิ่งอำนวยความสะดวก OO จริงสามารถใช้ฟังก์ชั่นการสั่งซื้อที่สูงขึ้นและโครงสร้างข้อมูลจริงสร้างวิธีการที่จะเลียนแบบได้อย่างมีประสิทธิภาพปฐมนิเทศวัตถุเพื่อที่จะได้รับประโยชน์จากคุณสมบัติเกี่ยวกับองค์กรโปรแกรมรวมทั้งต้นแบบนามธรรมและที่หลบซ่อนข้อมูล .
ดังที่ฉันพูด Lisp เป็นตัวอย่างของวิวัฒนาการทางภาษามากมายรวมถึงกระบวนทัศน์ของ OO (แม้ว่าสิ่งที่อาจถือได้ว่าเป็นภาษา OO แรกคือ Simula 67 ในตระกูล Algol) เสียงกระเพื่อมง่ายมากและรหัสสำหรับล่ามพื้นฐานของมันน้อยกว่าหนึ่งหน้า แต่คุณสามารถทำการเขียนโปรแกรม OO ใน Lisp สิ่งที่คุณต้องการคือฟังก์ชั่นการสั่งซื้อที่สูงขึ้น
ฉันจะไม่ใช้ไวยากรณ์เสียงกระเพื่อมลึกลับ แต่ค่อนข้างหลอกรหัสเพื่อให้งานนำเสนอง่ายขึ้น และผมจะพิจารณาเป็นปัญหาที่สำคัญง่าย: หลบซ่อนตัวข้อมูลและต้นแบบ การกำหนดคลาสของวัตถุในขณะที่ป้องกันผู้ใช้จากการเข้าถึง (ส่วนใหญ่) การใช้งาน
สมมติว่าฉันต้องการสร้างคลาสที่เรียกว่าเวกเตอร์ซึ่งเป็นตัวแทนเวกเตอร์ 2 มิติด้วยวิธีการ ได้แก่ : การบวกเวกเตอร์, ขนาดเวกเตอร์และการขนาน
function vectorrec () {
function createrec(x,y) { return [x,y] }
function xcoordrec(v) { return v[0] }
function ycoordrec(v) { return v[1] }
function plusrec (u,v) { return [u[0]+v[0], u[1]+v[1]] }
function sizerec(v) { return sqrt(v[0]*v[0]+v[1]*v[1]) }
function parallelrec(u,v) { return u[0]*v[1]==u[1]*v[0]] }
return [createrec, xcoordrec, ycoordrec, plusrec, sizerec, parallelrec]
}
จากนั้นฉันสามารถกำหนดเวกเตอร์ที่สร้างให้กับชื่อฟังก์ชั่นจริงที่จะใช้
[เวกเตอร์, xcoord, ycoord, vplus, vsize, vparallel] = vectorclass ()
ทำไมถึงซับซ้อน? เพราะฉันสามารถกำหนดในฟังก์ชั่นตัวกลาง vectorrec สร้างที่ฉันไม่ต้องการที่จะมองเห็นได้ในส่วนที่เหลือของโปรแกรมเพื่อที่จะรักษาแบบแยกส่วน
เราสามารถสร้างคอลเล็กชันอื่นในพิกัดเชิงขั้วได้
function vectorpol () {
...
function pluspol (u,v) { ... }
function sizepol (v) { return v[0] }
...
return [createpol, xcoordpol, ycoordpol, pluspol, sizepol, parallelpol]
}
แต่ฉันอาจต้องการใช้การปรับใช้ทั้งสองอย่างโดยไม่สนใจ วิธีหนึ่งที่จะทำคือการเพิ่มองค์ประกอบประเภทให้กับค่าทั้งหมดที่กำหนดฟังก์ชั่นทั้งหมดข้างต้นในสภาพแวดล้อมเดียวกัน: จากนั้นฉันสามารถกำหนดฟังก์ชั่นที่ส่งคืนเพื่อที่จะทดสอบประเภทพิกัดก่อนจากนั้นจึงใช้ฟังก์ชันเฉพาะ สำหรับมัน.
function vector () {
...
function plusrec (u,v) { ... }
...
function pluspol (u,v) { ... }
...
function plus (u,v) { if u[2]='rec' and v[2]='rec'
then return plusrec (u,v) ... }
return [ ..., plus, ...]
}
สิ่งที่ฉันได้รับ: ฟังก์ชั่นที่เฉพาะเจาะจงยังคงมองไม่เห็น (เนื่องจากการกำหนดขอบเขตของตัวระบุ) และโปรแกรมที่เหลือสามารถใช้ได้เฉพาะนามธรรมที่ถูกส่งกลับโดยการเรียกไปยังเวกเตอร์คลาส
ข้อคัดค้านอย่างหนึ่งคือฉันสามารถกำหนดฟังก์ชั่นนามธรรมแต่ละรายการในโปรแกรมโดยตรง จากนั้นก็จะถูกซ่อนไว้เช่นกัน นั่นเป็นความจริง แต่จากนั้นโค้ดสำหรับแต่ละประเภทพิกัดจะถูกตัดเป็นชิ้นเล็ก ๆ กระจายไปทั่วโปรแกรมซึ่งสามารถทำซ้ำได้และซ่อมบำรุงได้น้อย
ที่จริงแล้วฉันไม่จำเป็นต้องตั้งชื่อพวกเขาและฉันก็สามารถเก็บค่าฟังก์ชันการทำงานที่ไม่ระบุชื่อไว้ในโครงสร้างข้อมูลที่จัดทำดัชนีโดยประเภทและสตริงที่เป็นตัวแทนของชื่อฟังก์ชั่น โครงสร้างนี้เป็นแบบโลคอลกับฟังก์ชันเวกเตอร์ซึ่งจะมองไม่เห็นจากส่วนที่เหลือของโปรแกรม
เพื่อให้การใช้งานง่ายขึ้นแทนที่จะส่งกลับรายการฟังก์ชันฉันสามารถส่งคืนฟังก์ชันเดียวที่เรียกว่าการใช้เป็นอาร์กิวเมนต์เป็นค่าประเภทและสตริงอย่างชัดเจนและใช้ฟังก์ชันที่มีประเภทและชื่อที่เหมาะสม ดูเหมือนว่าจะเป็นการเรียกใช้เมธอดสำหรับคลาส OO
ฉันจะหยุดที่นี่ในการสร้างสิ่งอำนวยความสะดวกเชิงวัตถุ
สิ่งที่ฉันพยายามทำคือการแสดงให้เห็นว่ามันไม่ยากเกินไปที่จะสร้างการวางแนววัตถุที่ใช้งานได้ในภาษาที่ทรงพลังอย่างเพียงพอรวมถึงการสืบทอดและคุณสมบัติอื่น ๆ Metacircularity ของล่ามสามารถช่วย แต่ส่วนใหญ่อยู่ในระดับประโยคซึ่งยังห่างไกลจากเล็กน้อย
ผู้ใช้คนแรกของการวางแนววัตถุได้ทำการทดลองแนวคิดด้วยวิธีดังกล่าว และโดยทั่วไปแล้วจะเป็นจริงในการปรับปรุงภาษาการเขียนโปรแกรมจำนวนมาก แน่นอนว่าการวิเคราะห์เชิงทฤษฎีก็มีบทบาทและช่วยให้เข้าใจหรือปรับปรุงแนวคิดเหล่านี้
แต่ความคิดที่ว่าภาษาที่ไม่มีคุณสมบัติ OO นั้นจะล้มเหลวในบางโปรเจ็กต์ หากจำเป็นพวกเขาสามารถเลียนแบบการใช้งานคุณสมบัติเหล่านี้ได้อย่างมีประสิทธิภาพ หลายภาษามีพลังวากยสัมพันธ์และความหมายในการปรับทิศทางของวัตถุอย่างมีประสิทธิภาพแม้ว่าจะไม่ได้ติดตั้งไว้ภายในก็ตาม และนั่นเป็นมากกว่าการโต้แย้งของทัวริง
OOP ไม่ได้ระบุถึงข้อ จำกัด ของภาษาอื่น ๆ แต่สนับสนุนหรือบังคับใช้วิธีการเขียนโปรแกรมที่ช่วยให้เขียนโปรแกรมได้ดีขึ้นซึ่งจะช่วยให้ผู้ใช้ที่มีประสบการณ์น้อยลงสามารถปฏิบัติตามแนวทางปฏิบัติที่ดีที่โปรแกรมเมอร์ขั้นสูงกว่าเคยใช้
ผมเชื่อว่าหนังสือที่ดีที่จะเข้าใจทั้งหมดนี้อาจจะAbelson & Sussman:โครงสร้างและการแปลความหมายของโปรแกรมคอมพิวเตอร์