คำจำกัดความที่เป็นทางการสำหรับคำว่า "ภาษา OO บริสุทธิ์"?


13

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

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

มีวิธีการดังต่อไปนี้ในการเข้าถึงภารกิจ:

  1. ให้การวิเคราะห์เชิงเปรียบเทียบโดยการแสดงรายการภาษาการเขียนโปรแกรมที่สามารถแสดง (หรือไม่สามารถทำได้) คุณสมบัติบางอย่างที่ไม่ซ้ำกันและเพียงพอที่จะกำหนดคำศัพท์ (แม้ว่า Smalltalk, Scala, Javaและอื่น ๆ ) เป็นตัวอย่างที่เป็นไปได้ แต่ IMO ไม่เกิดผล )
  2. ให้คำจำกัดความอย่างเป็นทางการ (หรือใกล้เคียงกับมันเช่นในเชิงวิชาการหรือเชิงคณิตศาสตร์มากขึ้น)
  3. ให้คำนิยามเชิงปรัชญาที่ต้องพึ่งพาบริบทเชิงความหมายของภาษาที่เป็นรูปธรรมหรือประสบการณ์การเขียนโปรแกรมเบื้องต้น (ต้องมีโอกาสในการอธิบายที่ประสบความสำเร็จโดยชุมชน)

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

จะขอบคุณการปรับปรุงใด ๆ ที่เป็นไปได้ของมัน อย่างที่คุณเห็นฉันเพิ่งนิยามขึ้นอยู่กับคำว่า "วัตถุ" (มักจะอ้างถึงอย่างเต็มที่ว่าเป็นคลาสของวัตถุ)

[แก้ไข]

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

NB

วิธีตอบ :

  • ช่วยถ้าคุณระบุหนังสือหรือข้อมูลอ้างอิงที่สนับสนุน / อธิบายความเข้าใจของคุณเกี่ยวกับคำศัพท์และแนวคิด (โดยปกติแล้วจะครอบคลุมคำจำกัดความที่ดีหรืออ้างอิงแนวคิดที่ขึ้นอยู่ทั้งหมดยกเว้นระดับประถมศึกษา)
  • ถ้าเป็นไปได้ให้ระบุหมวดหมู่ที่เยื้องของคำตอบ / คำนิยามของคุณหากไม่ชัดเจนเป็นอย่างอื่น (ดูด้านบน: 1 - ตามตัวอย่างภาษา, 2 - ตรรกะทางคณิตศาสตร์, 3 - คำอธิบายทางเทคนิคและปรัชญาการเขียนโปรแกรม)
  • การจัดหมวดหมู่เป็นสิ่งสำคัญ (และยังเป็นเพราะระยะบริสุทธิ์ OO จะถูกรวมอยู่ใน OO สั้น) ในขณะที่ตอบลองกับองค์ประกอบ unmix ของกระบวนทัศน์การ OO จากวิธีการที่รู้จักกันดีอื่น ๆ (และโดยไม่สับสน / ทับซ้อนพวกเขาเช่นมักจะองค์ประกอบของการเขียนโปรแกรมแบบแยกส่วนสามารถครอบคลุม / รวมกับการเขียนโปรแกรม OO): พยายามแยก OOP จาก (รวมถึงหรือเป็นส่วนหนึ่งของ) การเขียนโปรแกรมเชิงปฏิบัติการ, การเขียนโปรแกรมเชิงตรรกะ (โดยเฉพาะอย่างยิ่งความเชี่ยวชาญอย่างยิ่ง), Abstarct Data Types (ADT), Modular, Metaprogramming (generics และ สัญญา (เช่นหอไอเฟล), มุมมองเชิง (AO), (ความแตกต่างระหว่างการประกาศและการจำแนกการทำงานเช่นเดียวกับคำจำกัดความทางประวัติศาสตร์ของโครงสร้าง Dijkstra มีความชัดเจน)

ในความยากลำบากของการให้คำนิยามอย่างเป็นทางการ : น่าแปลกใจที่มันง่ายมากที่จะให้คำอธิบายทางคณิตศาสตร์ของ OOP ในรูปแบบของระบบตรรกะ (เป็นทางการ) บางอย่าง (ตามประเภทที่เป็นไปได้มากที่สุด) และการกำหนดแนวคิดหนึ่งหลังจากนั้น เราสามารถลองทำอะไรที่เป็นประโยชน์ได้มากกว่าเดิมโดยใช้วิธีการแบบนั้นเพื่อพิมพ์การตรวจสอบความปลอดภัยหรือการออกแบบภาษาใหม่กว่าเพียงแค่ความบันเทิงนามธรรมหรือการออกกำลังกาย (เช่นการค้นหาสูตร OOP ในทฤษฎีประเภท Intuitionistic , Dependent Type , อิสระใน FOL และเพียงแค่ใช้ทฤษฎีหมวดหมู่) ประเด็นหลักที่นี่ก็แปลกใจสูตรดังกล่าว IMO จะลำเอียงอย่างยิ่ง (สมบูรณ์) โดยส่วนใหญ่มีแนวโน้มที่แรกที่ไม่สมบูรณ์การทำความเข้าใจของ OOP (วิศวกรรมคอมพิวเตอร์) และจบลงด้วยการไม่สามารถเข้าถึงได้เกือบหลังจากนั้น (จึงแทบจะไม่เอื้อข้างหลังเพื่อการเขียนโปรแกรมโลก - อาจยกเว้นพบอัตราร้อยละการใช้งานกลับมาจากโลกอย่างเป็นทางการโดยการ รวมเข้ากับภาษายอดนิยม )

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


2
คุณตอบตัวเองด้วย Python "ไม่"
psr

2
+1 สำหรับคำถามที่ดี แต่รุ่นของคุณมีข้อบกพร่องเล็กน้อยจากปัญหาที่ประเภทและวัตถุนั้นแตกต่างกัน
แฟรงค์

5
@JoachimSauer: เขากล่าวในจดหมายอีกฉบับหนึ่งในรายการส่งเมล Squeak ว่า "ความคิดที่สำคัญคือการส่งข้อความ" และเขารู้สึกเสียใจที่เคยเรียกมันว่า "Object-Oriented" และควรจะเรียกมันว่า "Message-Oriented" แทน ตัวอย่างเช่น Erlang เป็นภาษาเชิงวัตถุอย่างละเอียดซึ่งเป็นไปตามเกณฑ์ทั้งหมดของดร. เคย์โดยไม่ต้องมีแนวคิดใด ๆ ที่ "วัตถุ", "วิธีการ", "การสืบทอด", "คลาส", "คลาส", "ต้นแบบ" หรืออะไรทำนองนั้นทั้งหมด .
Jörg W Mittag

1
นี่อาจเป็นภาพประกอบที่ดีที่ไวยากรณ์ไม่เพียงพอที่จะกำหนดภาษา OO ถ้าใครสามารถแสดงให้เห็นว่า OOP (เช่นเป็นเครื่องมือ) นั้นมีความหมายเพียงอย่างเดียว (เป็นอิสระจากซินแท็กซ์) นั่นคือการเปลี่ยนแปลง (invert) คำถามของฉันอย่างสมบูรณ์!
Yauhen Yakimovich

2
@YauhenYakimovich นี่เป็นหนึ่งในปัญหารากในการอภิปราย OOP ทุกคนและสุนัขของเขามีความคิดของตัวเองว่ามันคืออะไร ในทางตรงกันข้ามการเขียนโปรแกรมที่มีโครงสร้างและการเขียนโปรแกรมฟังก์ชั่นแต่ละคนสามารถกำหนดได้ง่ายมาก สิ่งนี้ทำให้ฉันถามว่า OO มีคุณสมบัติคล้ายกับศาสนาแทนที่จะเป็นวิทยาศาสตร์หรือไม่
Ricky Clarkson

คำตอบ:


19

OO ตามที่ Alan Kay ให้ข้อมูลเกี่ยวกับการส่งข้อความและนั่นก็คือ คุณจะเห็นว่าคุณภาพเช่นความหลากหลายและการห่อหุ้มนั้นมาจากการส่งผ่านข้อความ

ตอนนี้ท่าทางจริง ๆ แล้วสุดขั้วมากเพราะโดยทั่วไปแล้วหมายความว่าเฉพาะสมอลล์ทอล์คและภาษาเท่านั้น

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

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

จากนั้นอีกครั้งความบริสุทธิ์ทางภาษาของ IMHO นั้นอ่อนแอกว่าความแข็งแกร่ง OO ไม่ใช่กระสุนเงิน ไม่มีกระบวนทัศน์เดียว


2
+1 สำหรับ "OO ไม่ใช่กระสุนเงิน"
Andres F.

1
@AndresF โปรดทราบว่าคุณค่าของการใช้งานจริงของ OOP รวมถึงความรู้เชิงทฤษฎีอื่น ๆ ที่เกี่ยวข้องกับการเขียนโปรแกรมไม่ใช่ส่วนหนึ่งของคำถาม เห็นได้ชัดว่าสามารถเขียนโค้ดในลักษณะที่ประสบความสำเร็จโดยที่ไม่มีความเข้าใจอย่างลึกซึ้งเกี่ยวกับเทคนิคการเขียนโปรแกรมหรือทฤษฎี (และวิธีอื่น ๆ ) ไม่พูดถึงคุณสมบัติของแอพพลิเคชั่นของภาษา OO และอื่น ๆ อีกมากมาย
Yauhen Yakimovich

@YauhenYakimovich โอ้ฉันรู้ ฉันจะไม่อัปเกรดคำตอบถ้ามันเป็นนอกหัวข้อ ยังฉันชอบยืนยันฉันเห็นด้วยกับ
Andres F.

@AndresF แน่นอน :-) "OO ไม่ใช่กระสุนเงิน" น่าจะเป็นจริงเช่นเดียวกับที่เราขาดภาษาการเขียนโปรแกรมที่สมบูรณ์แบบ แต่อะไรที่ทำให้ OOP ไม่ใช่ bullet เงิน? เช่นเดียวกับรายงานบั๊กที่ดีฉันคิดว่าคำศัพท์ที่ละเอียดและแม่นยำเป็นวิธีการตอบคำถามนี้ ฉันใช้เวลามากกับการทำงานกับมันและฉันก็แค่อยากรู้อยากเห็นเพื่อนำไปสู่ระดับถัดไป OOP เป็นเพียงความคิดที่คัดลอกมาจากการวางหนังสือเล่มหนึ่งไปยังอีกเล่มหรือไม่
Yauhen Yakimovich

@ back2dos +1 สำหรับการชี้ให้เห็นอย่างชัดเจนถึงบทบาทของ "การส่งข้อความ" ตาม Kay (Smalltalk, Objective-C) เห็นได้ชัดว่าเขาไม่เคยตั้งใจจะเห็น OOP พัฒนาไปในทิศทางที่มีในปัจจุบัน แต่ฉันชอบที่เคย์มีความคิดเหล่านั้นในการสร้างออบเจ็กต์ไม่ใช่ข้อมูล (ประเภท) เขาผลักดันให้พวกเขามีคุณสมบัติทางชีวภาพ แต่จบลงด้วยการ "ส่งข้อความ"
Yauhen Yakimovich

6

ฉันจะเข้าใกล้สิ่งนี้โดยกำหนดเป็นภาษาที่ใช้ OOP สร้างและไม่มีอะไรอื่น (ในลักษณะเดียวกับที่ภาษา FP บริสุทธิ์ใช้หน้าที่บริสุทธิ์ด้วยข้อมูลที่ไม่เปลี่ยนรูปแบบและไม่มีอะไรอื่น)

โดยเฉพาะอย่างยิ่ง:

  • เอนทิตีทุกตัวที่โปรแกรมของคุณทำงานนั้นเป็นอ็อบเจกต์ระดับเฟิร์สคลาส - เช่นไม่มีแบบดั้งเดิมไม่มีพอยน์เตอร์, ไม่มีอาร์เรย์ ฯลฯ
  • สิ่งเดียวที่คุณสามารถทำได้กับวัตถุคือการเรียกเมธอด (polymorphic) ที่มัน (== ส่งข้อความ) ไม่มีการดำเนินการอื่น ๆ
  • ข้อมูลทั้งหมดถูกห่อหุ้ม - นั่นคือไม่มีการเข้าถึงข้อมูลสาธารณะคุณต้องผ่านวิธีการบนวัตถุ
  • หากคุณมีฟังก์ชั่นชั้นหนึ่งพวกเขาก็ต้องเป็นวัตถุด้วยดังนั้นคุณต้องทำอะไรบางอย่างเช่นfunctionObject.call(param1,param2)
  • ไม่มีตัวแปรทั่วโลก - หากคุณต้องการสิ่งนี้คุณจะต้องใช้วัตถุเพื่อแสดงสภาพแวดล้อมทั่วโลกในปัจจุบันเช่นenvironment.getValue("myThing")หรือวางตัวแปรในวัตถุคลาส

โปรดทราบว่าตัวเลือกนี้ยังคงเปิดอยู่ค่อนข้างน้อย:

  • แบบจำลองคลาสที่อิงกับคลาส
  • วิธีการนำมรดกมาใช้ (ถ้าทั้งหมด)
  • ไม่ว่าคุณจะมีวิธีการแจกจ่ายเดี่ยวหรือหลายวิธี
  • ไม่ว่าจะเป็นวัตถุของคุณแบบคงที่หรือพิมพ์แบบไดนามิก
  • ไวยากรณ์ที่แน่นอนที่ใช้สำหรับการเรียกใช้เมธอด (เช่นคุณอาจมีน้ำตาล syntactic สำหรับผู้ได้รับ / setters ฯลฯ )

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

@ddyer - ถูกต้องหากเป็นเพียงไวยากรณ์จริงๆ แต่ฉันคิดว่าถ้าไวยากรณ์ยังมีความหมายที่แตกต่างกันก็สามารถแบ่ง "บริสุทธิ์" ตัวอย่างเช่น wrt global variables การใช้globalVariableNameการเข้าถึงตัวแปรโกลบอลเป็น semantic ที่แตกต่างจากการเรียกเมธอดบนอ็อบเจกต์ซึ่งจะเป็นวิธีเดียวในการเข้าถึงค่าที่ไม่ใช่ท้องถิ่นใน OOP บริสุทธิ์
mikera

ฉันคิดว่า "ทุกอย่าง" ต้องผ่านการรับรอง หากภาษาไม่มีความสามารถในการไตร่ตรอง (ตัวอย่างเช่นมันไม่สามารถอ้างอิงวิธีการของวัตถุด้วยชื่อนามธรรมหรือเก็บไว้ในตัวแปร) ดังนั้นวิธีการจำเป็นต้องเป็นวัตถุด้วยหรือไม่? วัตถุอ้างอิงมีอะไรบ้าง การอ้างอิงและวัตถุต่างกันหรือไม่?
Joachim Sauer

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

"โมเดลวัตถุอิงคลาสกับคลาสต้นแบบ": แต่ฉันจะบอกว่าในทั้งสองกรณีคุณมีการจัดประเภทบางประเภทเช่นคุณจัดกลุ่มวัตถุเข้าด้วยกันด้วยโครงสร้างและพฤติกรรมทั่วไป
Giorgio

4

การอภิปรายเกี่ยวกับภาษาที่เรียกว่า OO นั้นมักจะเป็นเรื่องที่ไม่น่าเชื่อ เช่น:

"มีคนบอกฉันว่าภาษา X คือ OO ดังนั้นภาษา X เท่ากับ OO ดังนั้นทุกภาษาที่ไม่มีคุณสมบัติของภาษา X จะไม่สามารถเป็น OO ได้และเนื่องจากฉันเขียนโค้ดของฉันในภาษา X ทุกสิ่งที่ฉันทำคือ OO "

การออกแบบเชิงวัตถุคำว่าเดือดลงถึง 3 สิ่ง:

  1. ออกแบบ modular กับวัตถุอิสระที่ไม่ทราบข้อมูลความจำเป็นเกี่ยวกับส่วนที่เหลือของโปรแกรมหรือที่รู้จักในฐานะcoupling หลวมที่เป็นไปได้
  2. การห่อหุ้มข้อมูลภายในวัตถุเพื่อป้องกันการเข้าถึงจากภายนอกทั้งโดยเจตนาและไม่ตั้งใจ
  3. การอ้างอิงที่ระบุไว้อย่างชัดเจนระหว่างวัตถุ เพื่อให้บรรลุข้อต่อหลวม แต่ยังทำให้โปรแกรมรักษาและขยายได้ง่ายขึ้น

1) เป็นการออกแบบโปรแกรมที่บริสุทธิ์สามารถทำได้ในภาษาการเขียนโปรแกรมใด ๆ อย่างไรก็ตามบางภาษามีคุณสมบัติที่มีประโยชน์เช่น class / struct และคำหลักส่วนตัว

2) ส่วนใหญ่เป็นการออกแบบโปรแกรม แต่ไม่สามารถทำได้อย่างสมบูรณ์หากไม่ได้รับการสนับสนุนด้านภาษาเนื่องจากคุณต้องการกลไกภาษาเช่นส่วนตัว / คงที่เพื่อป้องกันการใช้โดยไม่ตั้งใจ

3) ส่วนใหญ่เป็นการออกแบบโปรแกรม โดยทั่วไปจะมีการขึ้นต่อกันที่แตกต่างกันสาม: "วัตถุ X มีวัตถุ Y", "วัตถุ X เป็นชนิดของ Y" และ "วัตถุ X โต้ตอบกับวัตถุ Y" มีคุณสมบัติทางภาษามากมายที่จะช่วยในการพึ่งพาเหล่านี้: การสืบทอด / ความหลากหลายรูปแบบ, ชั้นฐานนามธรรมและอื่น ๆ

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

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

น่าเศร้าที่หัวข้อของการออกแบบโปรแกรมเชิงวัตถุที่ดีนั้นไม่ค่อยมีการกล่าวถึงในการอภิปรายประเภทนี้ โปรแกรมเมอร์ Brainwashed ดูที่ไวยากรณ์และ yap อย่างเช่น "C ++ มีชนิดข้อมูลดั้งเดิมดังนั้นโปรแกรม C ++ ของคุณไม่ใช่ OO" จากนั้นพวกเขาก็ออกไปเขียนโปรแกรมที่น่ากลัวอย่างจริงจังในภาษาที่พวกเขาชื่นชอบโดยไม่ต้องใช้คำใบ้ใด ๆ โปรแกรมออกแบบสิ่งที่เคย

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

อาจมีเครื่องมือ UML-ish ระดับสูงแฟนซีอยู่เหนือซอร์สโค้ดดิบซึ่งบังคับให้โปรแกรมเมอร์เขียนโปรแกรมด้วยการออกแบบเชิงวัตถุที่ดีเท่านั้น แต่ฉันสงสัย เครื่องมือออกแบบที่ดีที่สุดสำหรับการเขียนโปรแกรม OO น่าจะยังคงเป็นสมองของมนุษย์และสามัญสำนึก


คุณสามารถอธิบายได้ว่านิยามของคุณแตกต่างจากเช่นการเขียนโปรแกรมแบบแยกส่วนที่มีชนิดข้อมูลนามธรรมหรือไม่? ฉันคิดว่าคุณกำลังเดินถูก แต่ฉันยังไม่เห็นรถไฟ!
Jörg W Mittag

@ JörgWMittagไม่จำเป็นต้องแตกต่างกัน ADT: s แบบดั้งเดิมสามารถเขียนได้โดยใช้การออกแบบเชิงวัตถุด้วยการห่อหุ้มที่เหมาะสมเซ็ตเตอร์ / ผู้ได้รับวิธีการสืบทอด ฯลฯ เป็นต้น แต่สามารถเขียนได้โดยไม่ต้องคำนึงถึงการออกแบบของ OO ->

2
@ JörgWMittagหากคุณมีภาษาเช่น C พร้อมกับการสนับสนุนภาษาที่ จำกัด สำหรับ OO แล้วมันเป็นเรื่องยากที่จะเขียน ADT: s ในลักษณะเชิงวัตถุ ข้อผิดพลาดที่พบบ่อยที่สุดคือปล่อยให้การจัดสรร ADT ไปยังผู้โทรนั่นคือให้โครงสร้างสาธารณะกับพวกเขาทั้งหมดภายใน internals สัมผัสทำลาย encapsulation วิธีที่เหมาะสมในการทำเช่นนี้ใน C คือเรียกว่า "opaque types" (ประเภทที่ไม่สมบูรณ์) แม้ว่าโปรแกรมเมอร์ C บางคนไม่รู้จักที่จะใช้มัน

@Lundin: ในบทความที่โพสต์โดยJörgWMittagเพื่อแสดงความคิดเห็นต่อคำตอบอื่นมีการเปรียบเทียบที่น่าสนใจ (IMO) ระหว่าง ADT และ OO
Giorgio

ฉันจำได้จากหนังสือ UML บางเล่ม (อาจ) จุดเพิ่มเติม 0 Abstractness (เน้นความสำคัญของการกำหนดนามธรรมที่จำเป็นสำหรับความสัมพันธ์ระหว่างวัตถุเช่นความหลากหลายรูปแบบการสืบทอดการรวมตัว ฯลฯ )
Yauhen Yakimovich

2

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

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

  • วัตถุมีสถานะบางอย่างและมีหน้าที่บางอย่างในสถานะนั้น

ในกรณีนี้แม้intมีคุณสมบัติ ท้ายที่สุดเมื่อคุณเขียนรหัสเทมเพลตใน C ++ ซึ่งสามารถยอมรับได้ทั้งแบบดั้งเดิมหรือวัตถุก็เป็นการยากที่จะยืนยันว่าแบบดั้งเดิมนั้นแตกต่างกันไป ไม่มีอะไรแตกต่างกันอย่างมีนัยสำคัญเกี่ยวกับVector v1, v2; v1 + v2;แทนint v1, v2; v1 + v2;(ยกเว้นความหมายเริ่มต้นเส็งเคร็งหนึ่งต้องยอมรับ) นอกจากนี้ยังอนุญาตให้ lambdas และสิ่งต่าง ๆ เป็นวัตถุได้เช่นกันเนื่องจากพวกเขามีสถานะเป็นเชลยและเสนอฟังก์ชั่นในสถานะนั้นให้เรียกแลมบ์ดา

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


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

5
-1 เริ่มด้วยการพูดจาโผงผางที่ไร้ประโยชน์และไม่จำเป็นสลับกับการโจมตีโฆษณาในไม่ช้าและมีเพียงสิ่งเดียวที่เป็นจริง (นิยามของOOP ) จากระยะไกลนั้นผิด โปรดอ่านเกี่ยวกับการทำความเข้าใจข้อมูลที่เป็นนามธรรมซึ่งได้รับการตรวจสอบโดยWilliam R. Cookสำหรับความแตกต่างระหว่างประเภทข้อมูลนามธรรมและวัตถุ
Jörg W Mittag

1
"ฉันไม่เห็นความจำเป็นในการแยกแยะเช่นนี้": แต่ความแตกต่างนี้เป็นหนึ่งในคุณสมบัติที่เป็นที่ยอมรับกันทั่วไปของวัตถุ แน่นอนคุณสามารถพัฒนาแนวคิดของวัตถุที่แตกต่างจากสิ่งที่ยอมรับกันโดยทั่วไป คุณมีอิสระที่จะทำ
จอร์โจ

2
@ Jörgฉันขอแตกต่างกัน ฉันไม่เห็นด้วยทั้งหมดกับโพสต์นี้ แต่การเรียก caveat ในย่อหน้าแรก“ ไร้ประโยชน์” หรือ“ โวยวาย” นั้นไม่ตรงไปตรงมา ไม่มีการตกลงกันอย่างเป็นสากลเกี่ยวกับคำจำกัดความของ OOP นั่นเป็นข้อเท็จจริงที่เรียบง่ายและเป็นที่ยอมรับอย่างกว้างขวาง ส่วนที่เหลือของการโพสต์เป็นความหมายของ OOP แน่นอนว่าไม่ใช่สิ่งที่ใช้กันอย่างแพร่หลายหรือสิ่งที่ฉันจะให้ แต่อย่างที่ DeadMG พูดจริง ๆ แล้วค่อนข้างมีประโยชน์
Konrad Rudolph

2
@ KonradRudolph: ย่อหน้านั้นอ่านแตกต่างกันมากเมื่อฉันเขียนความคิดเห็นของฉันรวมถึงการเปรียบเทียบโปรแกรมเมอร์ที่สนใจเกี่ยวกับไวยากรณ์กับนักเหยียดเชื้อชาติแม้จะพูดถึงผู้ใช้เฉพาะไซต์นี้ด้วยชื่อ
Jörg W Mittag

0

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

นอกจากนี้ยังมีคำถามว่ามีการปิดการใช้งานภาษาจำนวนเท่าใดแม้ในกรอบวัตถุ ใน java คุณไม่สามารถกำหนดคลาสย่อยใหม่สำหรับบางคลาสเช่น String หรือ Class

ภาษาใดที่บริสุทธิ์ ผู้สมัครคนเดียวที่เข้ามาในใจคือ smalltalk


Ruby OO เป็นภาษาที่บริสุทธิ์หรือไม่
zxcdw

2
@zxcdw (และ ddyer): นั่นเป็นปัญหาจริง ๆ : ไม่มีใครมีคำจำกัดความที่เป็นทางการของ "pure OO" ดังนั้นจึงไม่มีใครสามารถให้คำตอบที่ชัดเจนสำหรับคำถามนั้น
โจอาคิมซาวเออร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.