“ OOP ซ่อนรัฐ” หมายความว่าอย่างไร [ปิด]


11

ในหนึ่งในเสียงต่อต้านโอโอพีหลายเรื่องที่ cat-v.orgฉันพบข้อความโดยโจอาร์มสตรองยกการคัดค้านหลายรูปแบบกับ OOP ซึ่งหนึ่งในนั้นคือ:

คัดค้าน 4 - วัตถุมีสถานะส่วนตัว

รัฐเป็นรากฐานของความชั่วร้ายทั้งหมด ในฟังก์ชั่นเฉพาะที่มีผลข้างเคียงควรหลีกเลี่ยง

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

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

OOPL พูดว่า "ซ่อนสถานะจากโปรแกรมเมอร์" สถานะถูกซ่อนและมองเห็นได้ผ่านฟังก์ชั่นการเข้าถึงเท่านั้น ภาษาโปรแกรมทั่วไป (C, Pascal) บอกว่าการมองเห็นของตัวแปรสถานะถูกควบคุมโดยกฎขอบเขตของภาษา ภาษาที่ประกาศอย่างบริสุทธิ์บอกว่าไม่มีรัฐ สถานะโกลบอลของระบบนั้นจะถูกนำไปใช้กับทุกฟังก์ชั่น กลไกเช่น monads (สำหรับ FPLs) และ DCGs (ภาษาลอจิก) ถูกใช้เพื่อซ่อนสถานะจากโปรแกรมเมอร์ดังนั้นพวกเขาจึงสามารถเขียนโปรแกรม“ ราวกับว่ารัฐไม่สำคัญ” แต่มีการเข้าถึงสถานะของระบบได้อย่างเต็มที่หากจำเป็น

ตัวเลือก“ ซ่อนสถานะจากโปรแกรมเมอร์” ที่เลือกโดย OOPL เป็นตัวเลือกที่แย่ที่สุด แทนที่จะเปิดเผยสถานะและพยายามหาวิธีที่จะลดความน่ารำคาญของรัฐพวกเขาก็ซ่อนมันออกไป

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

ขอบคุณสำหรับความช่วยเหลือของคุณ.


3
การอ่านที่แนะนำ: อภิปราย $ {บล็อก} นี้
gnat

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

1
Bah มากขึ้นฉันคิดว่าสิ่งที่ "ไม่เปลี่ยนรูป" ทั้งหมดนี้เป็นความคิดที่ดีที่เริ่มเหม็นของศาสนา
Rob

3
โจอาร์มสตรองยอมรับอย่างเปิดเผยว่าการคัดค้านของเขาที่มีต่อ OO นั้นเกิดจากความเข้าใจผิดที่รุนแรงว่า OO คืออะไร ตอนนี้เขาได้ตระหนักแล้วว่า Erlang เป็นภาษาเชิงวัตถุจริงๆ (อันที่จริงแล้วมันอาจเป็นภาษาเชิงวัตถุมากที่สุดในการใช้งานหลัก)
Jörg W Mittag

9
เพื่อขยาย: การจับกุมครั้งแรกของ archive.org ของการพูดจาโผงผางของ Joe Armstrong คือตั้งแต่เดือนเมษายน 2001 Joe เขียนวิทยานิพนธ์ของเขาในปี 2003 ในระหว่างการเขียนวิทยานิพนธ์ของเขาเขาได้เรียนรู้มากมายเกี่ยวกับ OO และเขาตระหนักว่าเขาตกเป็นเหยื่อของ ความเข้าใจผิดทั่วไปที่ OO เกี่ยวข้องกับสถานะที่ไม่แน่นอน (ไม่ใช่รัฐที่ไม่แน่นอนนั้นเป็น orthogonal ทั้งหมด) ตั้งแต่นั้นมาเขายอมรับว่าการวิพากษ์วิจารณ์ OO ของเขานั้นผิดและที่จริงแล้ว Erlang นั้นเป็นภาษาเชิงวัตถุ (มีข้อความมันมีวัตถุที่เรียกกระบวนการมันมี encapsulation)
Jörg W Mittag

คำตอบ:


32

นี่หมายถึงอะไรกันแน่?

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

พวกคุณคิดว่าเนื้อเรื่องนั้นถูกต้องหรือเกี่ยวข้องอย่างไร

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

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

OOP ทำให้ผู้คนประสบความสำเร็จมากที่สุดในกรณีนี้หรือไม่ อาจ "โรงเรียน Java" และทั้ง Shape / Circle / Rectangle หรือ Car มีโรงเรียนสอนการใช้งาน OO อาจมีโทษมากกว่าแนวทาง Modern OOP ใช้เวลาค่อนข้างน้อยจากการเขียนโปรแกรมฟังก์ชั่นส่งเสริมวัตถุที่ไม่เปลี่ยนรูปแบบและฟังก์ชั่นที่บริสุทธิ์ในขณะที่ท้อแท้สืบทอดเพื่อช่วยให้ง่ายต่อการออกแบบชั้นเรียนที่ทำงานได้ดี


3
เห็นด้วยอย่างสุดใจทั้งเรื่อง "โรงเรียนจาวา" ไม่ชอบเหรอ ขอบคุณมากฉันจะโหวตถ้าทำได้
Jake

2
เพื่อความแม่นยำ: พระโดยทั่วไปไม่ซ่อนสถานะบางพระทำ (เช่น IO) ดูในหมู่คนอื่น ๆstackoverflow.com/questions/2488646/…
thSoft

2
+1 นี่คือการวิเคราะห์ที่สมดุลและเหมาะสมกว่าบทความที่ผู้ถามเชื่อมโยง
Benjamin Hodgson

2
โจอาร์มสตรองยอมรับอย่างเปิดเผยว่าการคัดค้านของเขาที่มีต่อ OO นั้นเกิดจากความเข้าใจผิดที่รุนแรงว่า OO คืออะไร ตอนนี้เขาได้ตระหนักแล้วว่า Erlang เป็นภาษาเชิงวัตถุจริงๆ (อันที่จริงแล้วมันอาจเป็นภาษาเชิงวัตถุมากที่สุดในการใช้งานหลัก)
Jörg W Mittag

2
Jorg - คุณสามารถโพสต์ลิงค์ไปยัง Joe's followup ได้หรือไม่? ฉันสนใจที่จะอ่าน และ @radarbob ใช่ไหม!
user949300

2

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

ในทางปฏิบัติการตั้งโปรแกรมที่มีประสิทธิภาพมักต้องการวัตถุบางอย่างที่มีสถานะไม่แน่นอน รัฐดังกล่าว แต่ควรจะถูกคุมขังอย่างไรจะยกเลิกการแชร์วัตถุของผู้ปฏิบัติงาน พิจารณาIEnumerable/ IEnumeratorอินเทอร์เฟซใน. NET: ถ้าคอลเลกชันใช้IEnumerableมันจะอนุญาตให้อ่านรายการทีละรายการ กระบวนการที่เกิดขึ้นจริงของการอ่านออกคอลเลกชันมักจะต้องติดตามความเคลื่อนไหวของรายการที่ได้รับการอ่าน (ชิ้นส่วนของรัฐที่ไม่แน่นอน) IEnumerableแต่รัฐดังกล่าวจะไม่ได้อยู่ในการดำเนินการของ แต่IEnumerableให้วิธีการที่เรียกว่าGetEnumeratorซึ่งจะส่งคืนวัตถุที่ใช้IEnumeratorและมีสถานะเพียงพอที่จะอนุญาตให้อ่านรายการจากคอลเลกชัน ความจริงที่ว่าวัตถุนั้นมีสถานะดังกล่าวจะไม่มีปัญหาอย่างไรก็ตามถ้าวัตถุการดำเนินการIEnumeratorไม่ได้ใช้ร่วมกัน

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


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

@ ไมค์: ฉันคิดว่าปัญหาที่แท้จริงคือการอ้างอิงวัตถุทั้งหมดใน Java และ. NET มีความหลากหลายอย่างสมบูรณ์; รหัสใด ๆ ที่ได้มาหรือรับการอ้างอิงถึงวัตถุสามารถใช้ร่วมกับรหัสอื่นใด ๆ โดยไม่มีข้อ จำกัด กรอบงานไม่มีแนวคิดใด ๆ ของเขตข้อมูลอ้างอิงที่ไม่สามารถแบ่งปันได้ โครงสร้างและ byrefs ใน. NET มาใกล้ แต่พวกเขาค่อนข้าง จำกัด ในแง่ของสิ่งที่พวกเขาสามารถทำหรือสิ่งที่พวกเขาสามารถป้องกันรหัสภายนอกจากการทำ ในกรณีใด ๆ ฉันจะมีขึ้นคำพูดพื้นฐานเกี่ยวกับการที่รัฐไม่แน่นอนด้วย: ที่ 12:57 วัตถุพร้อมกันอาจจะเป็นตัวแทน ...
SuperCat

... สถานะปัจจุบันของวัตถุในโลกแห่งความเป็นจริงและสถานะของวัตถุในเวลา 12:57 น. หากสถานะโลกแห่งความเป็นจริงของวัตถุเปลี่ยนแปลงไปวัตถุนั้นจะไม่สามารถเป็นตัวแทนของทั้งคู่ได้อีกต่อไป บางครั้งจำเป็นต้องให้วัตถุดำเนินการต่อเพื่อแสดงสถานะ 12:57 น. และบางครั้งสถานะปัจจุบัน ความสัมพันธ์ระหว่างสถานะ 12:57 น. และสถานะปัจจุบันไม่สามารถคงอยู่ได้หากสถานะปัจจุบันมีการเปลี่ยนแปลง
supercat

0

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

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

ความรู้สึกส่วนตัวของฉันเกี่ยวกับ OW bandwagon คือมันเป็นการแสดงถึงการศึกษาของผู้คนในสาขาวิศวกรรมซอฟต์แวร์ / วิทยาศาสตร์คอมพิวเตอร์ พวกเขาแสดงความสามารถในระดับที่พวกเขาคิดว่ามันเป็นเรื่องของโครงสร้างข้อมูล คลาส, การสืบทอด, คอนเทนเนอร์, ตัววนซ้ำ, แฮชแม็พ, คุณสมบัติ, การซ่อนสถานะฯลฯ - ทั้งหมดเกี่ยวกับโครงสร้างข้อมูล - ยิ่ง merrier

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

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


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

@Phil: นามธรรมเป็นหนึ่งในคำพูดเหล่านั้น :)
ไมค์ Dunlavey

Nah คุณกำลังพูดถึงคำ ฉันกำลังพูดถึงความคิด การใช้คำที่ 2 และ 3 ของคุณpowerหมายถึงสิ่งต่าง ๆ โปรดอย่าเข้าใจผิด
Phil

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

0

การช่วยสำหรับการเข้าถึงไม่ใช่คุณสมบัติของ OOP แต่เฉพาะสำหรับการใช้งานเช่น Java และ Microsoft dotNET คุณสมบัติหลักที่กำหนด OOP คือ polymorphism

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

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


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