ระดับต่อไปของสิ่งที่เป็นนามธรรมคืออะไร? [ปิด]


15

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

มีอะไรที่เป็นนามธรรมมากกว่าชั้นเรียนหรือยังมีอีกบ้าง?


17
คุณดูเหมือนว่าเป็นความก้าวหน้าเชิงเส้นโดยมีการจัดลำดับ ("X เป็นนามธรรมมากกว่า Y เป็นนามธรรมมากกว่า Z") ฉันขอแตกต่าง

2
เป็นความคิดที่ดีที่จะพูดว่าทำไมคุณถึงแตกต่าง ;) (อ่าน: ฉันสนใจ!)
sergserg

3
ฉันเสนอ "นามธรรม" ที่ดีที่สุด: ทำในสิ่งที่ฉันคิดไม่ใช่สิ่งที่ฉันพิมพ์ ;)
Izkata

1
@Delnan: สิ่งที่เป็นนามธรรมไม่แนะนำลำดับทั้งหมด แต่มันเป็นไปได้ที่จะพูดว่า "นามธรรมมากขึ้น", "นามธรรมน้อย" ตัวอย่างเช่นการใช้งานทั่วไปของการเรียงลำดับการผสานเป็นนามธรรมมากกว่าการใช้การเรียงลำดับการผสานที่ใช้งานได้เฉพาะสำหรับจำนวนเต็ม
Giorgio

2
Bros เรียนรู้ทฤษฎีหมวดหมู่บางอย่างของคุณ จากนั้นเราสามารถพูดคุยกันว่านามธรรมหมายถึงอะไรเหมือนคนที่มีอารยธรรม
davidk01

คำตอบ:


32

ฉันคิดว่าคุณมีความเข้าใจผิดเกี่ยวกับประวัติของการคำนวณ

สิ่งแรกที่เป็นนามธรรม (ในปี 1936) คือในความเป็นจริงแลมบ์ดาของแลมบ์ดาคริสตจักรของอลองโซซึ่งเป็นรากฐานสำหรับแนวคิดของฟังก์ชั่นระดับสูงและภาษาที่ใช้งานได้ทั้งหมดที่ตามมา มันเป็นแรงบันดาลใจโดยตรง Lisp (ภาษาการเขียนโปรแกรมระดับสูงที่เก่าแก่ที่สุดเป็นอันดับสองสร้างขึ้นในปี 1959) ซึ่งจะเป็นแรงบันดาลใจให้ทุกอย่างตั้งแต่ ML ถึง Haskell และ Clojure

สิ่งที่เป็นนามธรรมที่สองคือการเขียนโปรแกรมขั้นตอน มันออกมาจากสถาปัตยกรรมคอมพิวเตอร์ของ von Neumann ที่เขียนโปรแกรมตามลำดับครั้งละหนึ่งคำสั่ง ฟอร์แทรน (ภาษาเขียนโปรแกรมขั้นสูงระดับสูงที่เก่าแก่ที่สุดปี 1958) เป็นภาษาระดับสูงคนแรกที่ออกมาจากกระบวนทัศน์กระบวนงาน

สิ่งที่เป็นนามธรรมที่สามน่าจะเป็นโปรแกรมเชิงประกาศจริง ๆ เป็นครั้งแรกสุดขั้วโดย Absys (1967) และจากนั้นในภายหลัง Prolog (1972) มันเป็นรากฐานของการเขียนโปรแกรมเชิงตรรกะที่มีการประเมินผลการแสดงออกโดยการจับคู่ชุดของการประกาศหรือกฎมากกว่าการดำเนินการชุดของคำสั่ง

สิ่งที่เป็นนามธรรมที่สี่นั้นคือการเขียนโปรแกรมเชิงวัตถุซึ่งทำให้ปรากฏตัวครั้งแรกในโปรแกรม Lisp ในยุค 60 แต่ต่อมาเป็นแบบสุดขั้วโดย Smalltalk ในปี 1972 (แม้ว่าจะดูเหมือนว่าจะมีการถกเถียงกันว่า One abstraction เชิงวัตถุหนึ่งฉันจะไม่แตะต้องนั้น)

abstractions อื่น ๆ ทั้งหมดโดยเฉพาะในสถาปัตยกรรมคอมพิวเตอร์ von Neumann แบบดั้งเดิมนั้นมีความหลากหลายในสี่ธีม ฉันไม่เชื่อว่ามีสิ่งที่เป็นนามธรรมนอกเหนือจากสี่สิ่งเหล่านั้นที่ไม่ได้เป็นเพียงการเปลี่ยนแปลงหรือการรวมกันของพวกเขา

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

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


4
Aspect Oriented Programming ถือเป็นรูปแบบหนึ่งของนามธรรมหรือไม่?
Shivan Dragon

การเขียนโปรแกรมเชิงวัตถุมาจาก LISP ในยุค 60 หรือไม่ [ต้องการอ้างอิง] ครั้งใหญ่ ทุกสิ่งที่ฉันเคยได้ยินบอกว่ามันออกมาจากSimulaในยุค 60 ซึ่งเป็นทายาทโดยตรงของ ALGOL ซึ่งเป็นภาษาที่จำเป็นซึ่งไม่มีส่วนเกี่ยวข้องกับ Lisp Smalltalk เกิดขึ้นโดยการนำแนวคิดที่ Simula นำมาใช้และบิดพวกเขาไปรอบ ๆ เพื่อรู้สึก "lispy" มากขึ้น
Mason Wheeler

3
@MasonWheeler: มันอยู่ในคู่มือ Lisp 1 และ 1.5 และเป็นเรื่องปกติที่ได้ยิน Lispers พูดถึงการทำโปรแกรมเชิงวัตถุโดยเฉพาะพวกที่แก่ พวก AI นั้นใหญ่ในการทำระบบวัตถุใน Lisp ในเวลานั้น
greyfade

2
@ShivanDragon: ฉันจะบอกว่าไม่ มันเป็นเพียงวิธีหนึ่งในการจัดทำรายการโปรแกรมขั้นตอนเป็นอย่างอื่นด้วยสายรัดเพิ่มเติม มันไม่ได้เป็นแบบจำลองอัลกอริธึมจริง ๆ และดูเหมือนจะไม่มีผลต่อการออกแบบโครงสร้างข้อมูล
greyfade

4
ที่จริงแล้วแคลคูลัสของ SKI นั้นมีทั้งแคลคูลัสแลมบ์ดาและทัวริง
Jörg W Mittag

4

สำหรับหลาย ๆ คนรูปแบบที่ชัดเจนที่สุดของการใช้รหัสนามธรรมในยุคปัจจุบันของการเขียนโปรแกรมไบนารีคือ "ฟังก์ชั่นลำดับสูงกว่า" โดยพื้นฐานแล้วฟังก์ชั่นนั้นจะถือว่าเป็นข้อมูลและหน้าที่ของฟังก์ชั่นถูกกำหนดไว้มากเท่าที่คุณจะเห็นพวกเขาในสมการทางคณิตศาสตร์กับผู้ประกอบการกำหนดผลของตัวถูกดำเนินการและลำดับการดำเนินการที่กำหนดไว้ล่วงหน้า คณิตศาสตร์มีโครงสร้างคำสั่งที่จำเป็นน้อยมาก ตัวอย่างที่สองที่ฉันนึกได้คือ "ให้ x มีค่าบางอย่างหรือเป็นค่าใด ๆ ที่สอดคล้องกับข้อ จำกัด " และ "ฟังก์ชันตามลำดับ" ซึ่งอินพุตกำหนดนิพจน์ที่จำเป็นในการสร้างเอาต์พุต โครงสร้างเหล่านี้สามารถใช้แทนฟังก์ชันของตัวเองได้อย่างง่ายดาย "function" x จะส่งคืน 1 เสมอและ "overloads" ฟังก์ชั่นที่กำหนดไว้ในแง่ของสิ่งที่ถูกส่งไปยังพวกเขา (ซึ่งแตกต่างจากวัตถุที่เกินพิกัดสามารถกำหนดได้ตามค่าอินพุต) ช่วยให้การประเมิน "ชิ้นส่วน" ของกลุ่มชื่อฟังก์ชั่นแม้ในแง่ของตัวเอง ด้วยเหตุนี้โปรแกรมจึงออกไปพร้อมกับแนวคิดเกี่ยวกับความจำเป็นในระดับต่ำและแทนที่จะมุ่งเน้นไปที่ "การประเมินตนเอง" ซึ่งได้รับข้อมูลอินพุต

ฟังก์ชันที่มีลำดับสูงกว่าเหล่านี้ก่อให้เกิดกระดูกสันหลังของ "ภาษาที่ใช้งานได้"; สิ่งที่โปรแกรมทำในแง่ของ "บริสุทธิ์ฟังก์ชั่น" (หนึ่งหรือมากกว่าหนึ่งอินพุตหนึ่งหรือมากกว่าเอาท์พุทไม่มีผลข้างเคียงหรือ "สถานะที่ซ่อนอยู่") ซึ่งซ้อนกันและประเมินความจำเป็น ในกรณีเช่นนี้ "ตรรกะเชิงบังคับ" ส่วนใหญ่ถูกแยกออกไป รันไทม์จัดการกับการเรียกใช้ฟังก์ชันจริงและเงื่อนไขใด ๆ ที่หนึ่งหรือโอเวอร์โหลดอื่น ๆ ของฟังก์ชั่นอาจจะต้องมีการเรียก ในโปรแกรมดังกล่าวรหัสไม่ได้คิดว่าเป็น "กำลังทำอะไร" มันคิดว่าเป็น "กำลัง" บางสิ่งและสิ่งที่มันถูกกำหนดเมื่อโปรแกรมรันการป้อนข้อมูลเริ่มต้น

ฟังก์ชั่นการเรียงลำดับที่สูงขึ้นนั้นเป็นส่วนสำคัญของภาษาที่จำเป็นมากมายเช่นกัน คำสั่งแลมบ์ดาของ. NET นั้นอนุญาตให้มีฟังก์ชั่น "ไม่ระบุชื่อ" ในฟังก์ชั่นอื่น "(นำไปใช้อย่างจำเป็น แต่ในทางทฤษฎีแล้วมันไม่จำเป็นต้องมี) ดังนั้นจึงอนุญาตให้ ผลลัพธ์ที่ต้องการ

สิ่งที่เป็นนามธรรมอีกอย่างหนึ่งที่พบเห็นได้ทั่วไปในภาษาการเขียนโปรแกรมรอบล่าสุดคือการพิมพ์ตัวแปรแบบไดนามิกตามแนวคิดของ "การพิมพ์แบบเป็ด"; ถ้ามันดูเหมือนเป็ดว่ายน้ำเหมือนเป็ดแมลงวันเหมือนเป็ดและ quacks เหมือนเป็ดคุณสามารถเรียกมันว่าเป็ด ไม่สำคัญว่ามันจะเป็นเป็ดน้ำหรือผืนผ้าใบ มันอาจจะสำคัญว่าจะเป็นจริงหรือห่านหงส์ แต่แล้วอีกครั้งมันอาจจะไม่ว่าถ้าสิ่งที่คุณดูแลเกี่ยวกับการที่จะว่ายน้ำและแมลงวันและครับดูเหมือนเป็ด นี่ถือเป็นสุดยอดในการสืบทอดวัตถุ คุณไม่สนใจว่ามันคืออะไรยกเว้นจะให้ชื่อ; สิ่งที่สำคัญมากขึ้นคือสิ่งที่มันไม่. ในภาษาดังกล่าวมีเพียงสองประเภทเท่านั้น "อะตอม" ซึ่งเป็นองค์ประกอบเดียวของข้อมูล (หนึ่ง "ค่า"; ตัวเลข, ตัวอักษร, ฟังก์ชั่น, อะไรก็ตาม) และ "tuple" ประกอบด้วยอะตอมและ "ตัวชี้" กับทุกสิ่งใน tuple วิธีการใช้งานของประเภทเหล่านี้ในไบนารีโดยรันไทม์นั้นไม่เกี่ยวข้องโดยตรง การใช้สิ่งเหล่านี้คุณสามารถบรรลุการทำงานของแทบทุกประเภทที่คุณคิดได้ตั้งแต่ประเภทค่าอย่างง่ายไปจนถึงสตริงไปจนถึงคอลเลกชัน (ซึ่งเนื่องจากค่าอาจเป็น "ประเภท" ที่แตกต่างกัน


1
"การพิมพ์เป็ด" (อย่างน้อยก็ตามที่คุณอธิบาย) ไม่ได้แปลกใหม่หรือ จำกัด เฉพาะภาษาที่พิมพ์แบบไดนามิก มันถูกใช้เป็นเวลานานในภาษาที่พิมพ์แบบคงที่ในฐานะ "โครงสร้างการพิมพ์ย่อย" ซึ่งเห็นได้ดีที่สุดใน OCaml
Tikhon Jelvis

2

หนึ่งอาจพิจารณาโดเมนเฉพาะภาษาเช่น SQL เป็นลำดับที่สูงขึ้นของนามธรรม SQL เป็นภาษาที่มีการกำหนดเป้าหมายเป็นอย่างมากซึ่งทำให้การดำเนินงานที่เป็นนามธรรมเช่นการจัดเก็บข้อมูลและมีฟังก์ชั่นระดับสูงตามทฤษฎีเซต พิจารณาว่าภาษากระแสหลักจำนวนมากในวันนี้ไม่ได้กำหนดเป้าหมายสถาปัตยกรรมเฉพาะ แต่เป็นเครื่องเสมือน (เช่น JVM หรือ. NET CLR) สำหรับตัวอย่าง C # ถูกคอมไพล์เป็น IL ซึ่งถูกตีความ (หรือบ่อยครั้งกว่า JIT - Just In Time Compiled - เพื่อการปรับใช้แบบเนทีฟ) โดยเอ็นจิ้นรันไทม์แบบเนทีฟ

มีข่าวดีมากมายเกี่ยวกับแนวคิดของ DSL ที่ใช้ในการสร้างภาษาระดับสูงมากที่สามารถใช้ได้โดยไม่มีประสบการณ์ด้านเทคนิคมากในการสร้างโปรแกรมทำงาน คิดว่าถ้ามีคนสามารถอธิบายเอนทิตีและการโต้ตอบใกล้เคียงกับภาษาอังกฤษธรรมดาและสภาพแวดล้อมการทำงานจัดการทุกอย่างตั้งแต่การนำเสนอ UI ที่เรียบง่ายไปจนถึงการจัดเก็บข้อมูลในฐานข้อมูลบางประเภท เมื่อการดำเนินการเหล่านั้นกลายเป็นนามธรรมคุณสามารถจินตนาการได้ว่าการเขียนโปรแกรมอย่างง่ายดายสามารถกลายเป็นอย่างไร

มีบางอย่างที่มีอยู่ในปัจจุบันเช่นJetBrains MPS (ซึ่งเป็นชุดเครื่องมือสำหรับอธิบาย DSL หรือเครื่องมือสร้างภาษา) Microsoft มีการจู่โจมสั้น ๆ (และฉันหวังว่าจะเพิ่ม) ลงในพื้นที่นี้ด้วยภาษา M (ภาษา M นั้นเสร็จสมบูรณ์จนภาษานั้นถูกกำหนดเป็น M)

นักวิจารณ์ของแนวคิดที่ชี้ไปที่ความพยายามที่ล้มเหลวก่อนหน้านี้ในการลบโปรแกรมเมอร์ออกจากงานของการพัฒนาโปรแกรมความแตกต่างของ DSL workbenches (ตามที่ฟาวเลอร์เรียกพวกเขา) คือนักพัฒนาจะยังคงมีส่วนร่วมในการกำหนดแนวคิดต่างๆ ความต้องการของโดเมนของพวกเขา เช่นเดียวกับผู้ขายระบบปฏิบัติการและภาษาที่สร้างเครื่องมือที่เราใช้สำหรับการเขียนโปรแกรมเราจะใช้ DSL เพื่อมอบเครื่องมือสำหรับผู้ใช้ทางธุรกิจ หนึ่งอาจนึกภาพ DSL ที่อธิบายข้อมูลและตรรกะในขณะที่นักพัฒนาสร้างล่ามที่เก็บและดึงข้อมูลและใช้ตรรกะที่แสดงใน DSL


1

ฉันจะยืนยันว่า meta-structure โมดูลเฟรมเวิร์กแพลตฟอร์มและบริการทั้งหมดเป็นการจัดกลุ่มคุณลักษณะระดับสูงกว่าคลาส ลำดับชั้นของนามธรรมของระบบการเขียนโปรแกรม:

  • บริการ
  • แพลตฟอร์มโซลูชั่นสแต็ค
  • กรอบ
  • โมดูลแพคเกจ
  • โครงสร้างเมตา: เมตาคลาส, ฟังก์ชันลำดับที่สูงขึ้น, ข้อมูลทั่วไป, เทมเพลต, ลักษณะ, แง่มุม, นักตกแต่ง
  • วัตถุชั้นเรียนประเภทข้อมูล
  • ฟังก์ชั่นขั้นตอนการรูทีนย่อย
  • โครงสร้างการควบคุม
  • บรรทัดของรหัส

Meta โครงสร้างเช่นmetaclasses , ฟังก์ชั่นการสั่งซื้อที่สูงขึ้นและ ข้อมูลทั่วไป อย่างชัดเจนเพิ่มนามธรรมเรียนพื้นฐานการทำงานประเภทข้อมูลและอินสแตนซ์ข้อมูล ลักษณะด้านและมัณฑนากรเป็นกลไกที่ใหม่กว่าสำหรับการรวมคุณสมบัติโค้ดและคลาสและฟังก์ชั่นอื่น ๆ ของ 'เร่ง' คล้ายกัน

แม้แต่ภาษาก่อนวัตถุก็มีโมดูลและแพ็คเกจดังนั้นการวางไว้เหนือคลาสอาจเป็นที่ถกเถียงกัน บุมีคลาสเหล่านั้นและโครงสร้างเมตาดังนั้นฉันจึงจัดอันดับให้สูงขึ้น

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

โดยทั่วไปโซลูชั่นสแต็กหรือแพลตฟอร์มรวมหลายเฟรมเวิร์กระบบย่อยหรือคอมโพเนนต์ในสภาพแวดล้อมสำหรับการแก้ปัญหาหลายอย่าง

ในที่สุดก็มีบริการต่างๆ -ถูกปรับใช้เป็นเว็บหรือบริการเครือข่าย สิ่งเหล่านี้คือสถาปัตยกรรมเฟรมเวิร์กสแต็กโซลูชันหรือความสามารถของแอปพลิเคชันที่จัดส่งเป็นชุดแบบสมบูรณ์ internals ของพวกเขามักจะทึบแสงส่วนใหญ่เปิดเผยผู้ดูแลระบบการเขียนโปรแกรมและส่วนต่อประสานผู้ใช้ PaaSและSaaSเป็นตัวอย่างทั่วไป

ตอนนี้ความก้าวหน้านี้อาจไม่เป็นที่น่าพอใจอย่างสมบูรณ์ด้วยเหตุผลบางประการ อย่างแรกคือมันทำให้เกิดความก้าวหน้าเชิงเส้นอย่างเป็นระเบียบหรือลำดับชั้นของสิ่งที่ไม่เชิงเส้นหรือลำดับชั้นอย่างสมบูรณ์ ครอบคลุมนามธรรมบางอย่างเช่น "สแต็ค" และบริการที่ไม่ได้อยู่ภายใต้การควบคุมของนักพัฒนาซอฟต์แวร์ และมันก็ไม่ได้ทำให้เกิดฝุ่นวิเศษตัวใหม่ (สปอยเลอร์: ไม่มีผงนางฟ้าวิเศษ )

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


1

นามธรรมถัดไปหลังจากที่เรียนในชั้นเรียนเมตา มันง่ายที่;)

คลาสที่อินสแตนซ์เป็นคลาส เช่นเดียวกับคลาสปกติที่กำหนดพฤติกรรมของวัตถุบางอย่าง metaclass จะกำหนดพฤติกรรมของคลาสที่แน่นอนและอินสแตนซ์ของพวกเขา ภาษาการเขียนโปรแกรมเชิงวัตถุไม่สนับสนุน metaclasses ทั้งหมด ในบรรดาสิ่งที่ทำขอบเขตที่ metaclasses สามารถแทนที่ลักษณะการทำงานของคลาสที่ระบุจะแตกต่างกันไป แต่ละภาษามีโปรโตคอล metaobject ของตัวเองซึ่งเป็นชุดของกฎที่ควบคุมวิธีการที่วัตถุคลาสและ metaclasses โต้ตอบ ...


1
Metaclasses เป็นวัตถุรากของลำดับชั้นการสืบทอด (IES) ของภาษา . NET คือวัตถุ คุณยังสามารถนึกถึงอินเทอร์เฟซเป็น metaclasses พวกเขากำหนดอินเทอร์เฟซของผู้สืบทอดของพวกเขาเป็นอิสระจากคลาส "parent" ที่แท้จริงของผู้สืบทอด
KeithS

1
@ KeithS นั่นไม่ใช่ความหมายของคำในบริบทใด ๆ ที่ฉันเคยเห็น - จาก CLOS ถึง UML ถึง C # metaclass เป็นคลาส aa ซึ่งอินสแตนซ์เป็นคลาส - การใช้งานที่อ่อนแอคือ C # Typeซึ่งให้ความสามารถในการไตร่ตรอง แต่ไม่ใช่การกลายพันธุ์ (คุณไม่สามารถเพิ่มวิธีการใหม่MyTypeโดยการพูดtypeof(MyType).Methods += new Method ( "Foo", (int x)=>x*x )อย่างที่คุณสามารถทำได้ใน CLOS)
Pete Kirkham

1

ฉันประหลาดใจที่ไม่มีใครพูดถึงทฤษฎีหมวดหมู่

หน่วยพื้นฐานที่สุดของการเขียนโปรแกรมคือฟังก์ชั่นซึ่งขึ้นอยู่กับประเภท ฟังก์ชั่นมักจะแสดงเป็น f: A -> B โดยที่ A และ B เป็นประเภท หากคุณใส่สิ่งเหล่านี้ซึ่งฉันกำลังเรียกประเภทและฟังก์ชั่นเข้าด้วยกันอย่างถูกวิธีคุณจะได้สิ่งที่เรียกว่าหมวดหมู่ คุณไม่ต้องหยุดที่จุดนี้

นำสิ่งเหล่านี้หมวดหมู่และถามตัวเองว่าอะไรจะเป็นวิธีที่ถูกต้องในการเชื่อมโยงพวกเขาเข้าด้วยกัน ถ้าคุณทำถูกต้องคุณจะได้รับสิ่งที่เรียกว่า functor ซึ่งมีสองประเภทและมักจะแสดงเป็น F: C -> B. อีกครั้งคุณไม่ต้องหยุด

คุณสามารถใช้ฟังก์ชั่นทั้งหมดและรวมเข้าด้วยกันในวิธีที่ถูกต้องและถ้าคุณทำสิ่งที่ถูกต้องคุณจะเริ่มสงสัยว่าจะสร้างความสัมพันธ์กับฟังก์ชั่นสองตัวเข้าด้วยกันได้อย่างไร ณ จุดนี้คุณจะได้รับสิ่งที่เรียกว่าการแปลงสภาพธรรมชาติ mu: F -> G โดยที่ F และ G เป็นฟังก์ชัน

ความรู้ของฉัน ณ จุดนี้จะเลือนลาง แต่คุณสามารถทำเช่นนี้ต่อไปและปีนขึ้นบันไดแห่งความเป็นนามธรรม วัตถุและคลาสไม่ได้ใกล้เคียงกับการอธิบายว่าคุณสามารถปีนขึ้นบันไดสูงได้อย่างไร มีหลายภาษาที่สามารถแสดงแนวคิดด้านบนที่คำนวณได้และภาษาที่โดดเด่นที่สุดคือ Haskell ดังนั้นหากคุณต้องการรู้ว่าสิ่งที่เป็นนามธรรมเกี่ยวกับอะไรจริงๆให้ไปเรียนรู้ Haskell หรือ Agda หรือ HOL หรือ ML


1

ฉันคิดว่าโมเดลนักแสดงหายไปจากรายชื่อผู้สมัคร

นี่คือสิ่งที่ฉันหมายถึงโดยนักแสดง:

  • หน่วยงานอิสระ
  • ที่ได้รับข้อความและเมื่อได้รับข้อความอาจ
  • สร้างนักแสดงใหม่
  • อัพเดตสถานะภายในสำหรับข้อความถัดไป
  • และส่งข้อความ

รุ่นนี้เป็นอะไรที่เกินกว่าเครื่องทัวริงที่กำหนดไว้และใกล้กับฮาร์ดแวร์ในโลกแห่งความเป็นจริงของเราเมื่อดูโปรแกรมที่เกิดขึ้นพร้อมกัน ยกเว้นว่าคุณใช้ขั้นตอนการซิงโครไนซ์พิเศษ (ราคาแพง) วันนี้เมื่อรหัสของคุณได้รับข้อมูลค่านั้นอาจเปลี่ยนแปลงไปแล้วในอีกด้านหนึ่งของแม่พิมพ์เดียวกันหรืออาจอยู่ในแกนเดียวกัน

การอภิปราย / แนะนำสั้น ๆ : http://youtube.com/watch?v=7erJ1DV_Tlo


โพสต์ของคุณอ่านยาก (ผนังข้อความ) คุณจะช่วยแก้ไขมันให้เป็นรูปร่างที่ดีขึ้นได้ไหม
ริ้น

0

ถ้าฉันเข้าใจคุณอย่างถูกต้อง "abstractions จากน้อยไปหามาก" ของคุณนั้นอาจถูกมองว่าเป็นการห่อหุ้มตรรกะที่ใหญ่ขึ้นเรื่อย ๆ ซึ่งส่วนใหญ่เกี่ยวข้องกับการใช้รหัสซ้ำ

จากคำสั่งที่เฉพาะเจาะจงดำเนินการอย่างใดอย่างหนึ่งหลังจากที่อื่นเราย้ายไปที่ฟังก์ชั่น / รูทีนย่อยซึ่งสรุปแค็ปซูลหรือนามธรรมการจัดกลุ่มตรรกะของคำสั่งลงในองค์ประกอบเดียว จากนั้นเรามีวัตถุหรือโมดูลซึ่งสรุปแค็ปซูลรูทีนย่อยที่เกี่ยวข้องกับเอนทิตีหรือหมวดหมู่ตรรกะบางอย่างดังนั้นฉันสามารถจัดกลุ่มการดำเนินการสตริงทั้งหมดภายใต้Stringคลาสหรือการดำเนินการทางคณิตศาสตร์ทั่วไปทั้งหมดในMathโมดูล (หรือคลาสคงที่ในภาษาเช่น C #) .

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

บริการคล้ายกับคลาสในแง่ที่ว่ามันเป็นเอนทิตีที่แสดงถึงการทำงาน แต่มันหมายถึงการแยกข้อกังวลที่เข้มงวดกว่าการย้อนกลับไปมากับวัตถุที่คุณยกตัวอย่างเอง พวกเขาเปิดเผยชุดของการดำเนินการที่ จำกัด ซ่อนตรรกะภายในและไม่จำเป็นต้องทำงานบนเครื่องเดียวกัน

อีกครั้งมีความแตกต่างที่ดีคือ ในกรณีส่วนใหญ่คุณจะใช้วัตถุที่ทำหน้าที่เป็นพร็อกซีให้บริการและทั้งสองจะคล้ายกันมาก แต่เป็นสถาปัตยกรรมทั้งสองจะแตกต่างกัน


0

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

ฉันขอแนะนำว่า abstractions เชิงปฏิบัติระดับต่อไปที่จะซ่อน drudgery ในระดับต่ำจากคุณคือการเขียนโปรแกรมเชิงปฏิกิริยาที่ใช้งานได้ ดู "สัญญาณ" ในสิ่งที่ต้องการhttp://elm-lang.org/ซึ่งซ่อนการเรียกกลับและการอ้างอิงที่คุณต้องจัดการใน javascript อย่างชัดเจน FRP สามารถซ่อนความซับซ้อนของกระบวนการระหว่างกันได้มากมายและการสื่อสารระหว่างเครื่องที่ต้องการในแอพพลิเคชั่นอินเทอร์เน็ตขนาดใหญ่และความเท่าเทียมที่มีประสิทธิภาพสูงเช่นกัน

ฉันค่อนข้างแน่ใจว่านี่คือสิ่งที่เราทุกคนจะตื่นเต้นในอีก 5 ปีข้างหน้า


1
ไฟเบอร์กลาสเป็นที่ดี แต่มันเกี่ยวข้องกับการจัดเรียงที่เฉพาะเจาะจงเป็นธรรมของการเขียนโปรแกรม (คือปฏิกิริยาการเขียนโปรแกรม) มันไม่ดีสำหรับการสร้างแบบจำลองโปรแกรมประเภทอื่น ๆ อย่างไรก็ตามการเขียนโปรแกรมแบบทั่วไปที่มากกว่านั้นคือการเขียนโค้ดของคุณในรูปของ algebras ซึ่งเป็นตัวเลือกที่ดีสำหรับระดับใหม่ของ abstraction
Tikhon Jelvis

0

ทฤษฎีเซต - ถูกนำไปใช้บางส่วนในฐานข้อมูลเชิงสัมพันธ์ แต่ในภาษาสถิติเช่น SAS และ R ให้ระดับนามธรรมที่แตกต่าง แต่สูงกว่า OO

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.