กระบวนทัศน์ที่ไม่ใช่ OOP สนับสนุนแนวคิดเช่นการห่อหุ้มหรือไม่?


12

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

มันทำให้ฉันคิดว่าสิ่งที่เกี่ยวกับการห่อหุ้มและหลักการ OOP อื่น ๆ ? พวกเขาผิดหรือเปล่า?

มีการใช้ OOP ผิดหรือไม่ ตัวอย่างเช่น Alan Kay ถูกกล่าวถึงในการกล่าวคำปราศรัย OOPSLA'97: "ฉันคิดค้นคำว่า object-oriented และฉันสามารถบอกคุณได้ว่าฉันไม่มี C ++ ในใจ"

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




2
ฉันจะบอกว่าคำถามแรกต้องชี้แจงสิ่งที่มีความหมายโดย Encapsulation และความหมายสำหรับภาษาเพื่อสนับสนุนมัน
ร่าเริง

14
ฉันพบปัญหาในการถามคำถามนี้ มันถามว่า encapsulation สามารถอยู่นอก OO (หัวเรื่อง) มันถามว่า encapsulation ผิดหรือเปล่า (ย่อหน้าที่สอง)? มันถามว่า OO ใช้ผิดหรือเปล่า (ย่อหน้าที่สาม)? และ OP ต้องการพูดอะไรกับโจอาร์มสตรองที่อ้างถึง? OP กำหนด "encapsulation" อย่างไร OP กำหนด "OO" อย่างไร อะไรคือ "หลักการอื่น ๆ "?
Jörg W Mittag

1
โรเบิร์ตมาร์ตินเคยกล่าวว่า OOP เอาการห่อหุ้มออกไปแล้วแก้ไขมันด้วยแฮ็คที่น่ากลัว "เรามี encapsulation ที่สมบูรณ์แบบก่อนที่จะ oo" แน่นอนว่าเขากำลังเกินความจริง แต่ตอนนี้ทุกครั้งที่ฉันเห็นมีคนบอกว่า OO เกี่ยวกับการห่อหุ้มฉันจำลุงบ๊อบได้
GnP

คำตอบ:


15

ฉันคิดว่ากับดักที่คุณตกลงมาที่นี่คือการคิดว่ามีคำจำกัดความที่เข้มงวดของกระบวนทัศน์การเขียนโปรแกรมใด ๆ (โครงสร้างเชิงวัตถุการทำงานและอื่น ๆ )

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

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

มีการใช้ OOP ผิดหรือไม่

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

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


10

อย่างไรก็ตามเมื่อไม่นานมานี้โลกของซอฟต์แวร์ดูเหมือนจะเอียงไปทางกระบวนทัศน์อื่น ๆ เช่นการเขียนโปรแกรมการทำงาน

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

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

มันทำให้ฉันคิดว่าสิ่งที่เกี่ยวกับการห่อหุ้มและหลักการ OOP อื่น ๆ ? พวกเขาผิดหรือเปล่า?

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

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

มีการใช้ OOP ผิดหรือไม่ ตัวอย่างเช่น Alan Kay ถูกกล่าวถึงในการกล่าวคำปราศรัย OOPSLA'97: "ฉันคิดค้นคำว่า object-oriented และฉันสามารถบอกคุณได้ว่าฉันไม่มี C ++ ในใจ"

OOP นั้นมักถูกใช้อย่างผิด ๆ กับหลาย ๆ คน แต่ฉันแน่ใจว่าเป็นเช่นเดียวกันสำหรับ FP และฉันจะประหลาดใจถ้า John Mc Carthy (ผู้ออกแบบ Lisp) มีบางอย่างที่เหมือนกับจาวาสคริปต์ในใจเมื่อเขากำลังคิดเกี่ยวกับการเขียนโปรแกรมที่ใช้งานได้ (ความเมตตาต่อฉันไม่ได้ทำให้ฉันมากเกินไปสำหรับการเปรียบเทียบนั้น ;-)

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

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


1
ฉันไม่แน่ใจว่า OO มีส่วนร่วมที่ดีกว่าสำหรับ GUI มากกว่านั้น OO และ GUI ต่างก็ปรากฏตัวในเวลาเดียวกัน +1 สำหรับ McCarthy / javascript แม้ว่า;)
jk

1
เป็นธรรมบางคนแนะนำวิธีการที่มีอยู่มีข้อบกพร่องและจะถูกแทนที่ด้วยสิ่งอื่น ฉันไม่รู้ว่าฉันจะเรียกว่า "กำลังขยาย" หรือค่อนข้าง "ปรับปรุง" กล่องเครื่องมือ :)
Andres F.

1
@AndresF นั่นคือการอ่านที่ยอดเยี่ยม ฉันวางแผนที่จะอ่านบทความนี้อย่างละเอียดเมื่อฉันมีเวลา
Robert Harvey

4

แน่นอน:

struct Foo
{
    string bar;
    int bux;
}

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

โปรแกรมเมอร์จาวาสคริปต์ห่อหุ้มสถานะและพฤติกรรมในฟังก์ชั่นและการปิดเป็นประจำไม่ใช่คลาส


3
นอกจากนี้คุณยังสามารถขุดเนินดินด้วยช้อนชา แต่ทุกคนที่อ้างว่าเป็นวิธีที่ดีที่สุดที่จะทำควรดูด้วยความสงสัย
ร่าเริง

6
ฉันไม่เคยบอกว่ามันเป็นสิ่งที่ดีที่สุดและนั่นไม่ใช่สิ่งที่ OP ถาม ในข่าวอื่น ๆ ฉันคิดว่ามันน่าสนุกที่ลีนุกซ์มีคุณสมบัติเหมือนตักดินด้วยช้อนชา
Robert Harvey

2
@jk แน่นอน. C ก็เหมือนกัน
Robert Harvey

1
อันที่จริงมันทำอย่างนั้น
jk

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

2

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

คำจำกัดความแรกที่คุณจะพบคือ

Encapsulation เป็นแนวคิดที่เชื่อมโยงข้อมูลและฟังก์ชันเข้าด้วยกันที่จัดการข้อมูล ...

หากนี่เป็นคำจำกัดความของคุณภาษาส่วนใหญ่จะมีวิธีจัดกลุ่มข้อมูลและฟังก์ชั่นที่ทำงานกับข้อมูลนั้นลงในคลาสโมดูลห้องสมุดเนมสเปซ ฯลฯ

แต่ฉันจะยืนยันว่าไม่ใช่จุดประสงค์หลักของการห่อหุ้มเนื่องจากคำจำกัดความดังกล่าวยังคงดำเนินต่อไป:

... และนั่นทำให้ทั้งคู่ปลอดภัยจากการรบกวนจากภายนอกและการใช้ในทางที่ผิด

Wikipedia เห็นด้วยกับสิ่งต่อไปนี้:

กลไกภาษาสำหรับ จำกัด การเข้าถึงโดยตรงไปยังองค์ประกอบบางส่วนของวัตถุ

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

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

แต่สิ่งที่เกี่ยวกับภาษาที่ไม่เปลี่ยนรูป? ไม่มีปัญหาในการกลายพันธุ์ของตัวแปร นี่คือที่มาของปัญหาที่สอง: ฟังก์ชันการเชื่อมโยงและข้อมูลอนุญาตให้เก็บข้อมูลนั้นในสถานะที่ถูกต้อง Emailลองนึกภาพคุณมีโครงสร้างไม่เปลี่ยนรูปสำหรับ โครงสร้างนี้มีstringฟิลด์เดียว เรามีข้อกำหนดว่าถ้าคุณมีค่าประเภทEmailแล้วฟิลด์นั้นมีที่อยู่ที่ถูกต้อง ในการห่อหุ้มของ OOP สิ่งนี้ทำได้ง่ายโดยการประกาศฟิลด์privateนั้นโดยให้Getวิธีการและมีเท่านั้นconstructor methodที่ประสบความสำเร็จก็ต่อเมื่อผ่านในสตริงเป็นที่อยู่ที่ถูกต้อง สิ่งที่คล้ายกันกับการปิด ตอนนี้สำหรับภาษาที่ไม่เปลี่ยนรูปแบบก็จะต้องมีวิธีบอกว่าโครงสร้างสามารถเริ่มต้นได้ผ่านฟังก์ชั่นเฉพาะและฟังก์ชั่นดังกล่าวสามารถล้มเหลว และฉันไม่ได้ตระหนักถึงภาษาใด ๆ ที่จะตรงกับเกณฑ์นั้น (บางทีใครบางคนในความคิดเห็นสามารถสอนฉัน)

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

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