Smalltalk ใช้ 'สิ่งที่เป็นประโยชน์' ได้บ้าง


12

become:ข้อความในสมอลล์ทอล์คเป็นสาเหตุหนึ่งวัตถุมีการเปลี่ยนแปลงไปยังอีกที่มีผลต่อการอ้างอิงถึงมัน

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

คำตอบ:


11

Gilad Brachaพูดถึงbecome:ในระยะเวลาหนึ่ง:

หนึ่งในคุณสมบัติที่โดดเด่นและทรงพลังที่สุดของ Smalltalk ก็เป็นหนึ่งในคุณสมบัติที่รู้จักกันน้อยที่สุดในชุมชน Smalltalk มันเป็นวิธีเล็กน้อยที่เรียกว่า:

สิ่งที่จะกลายเป็น: ไม่ได้สลับตัวตนของผู้รับและการโต้เถียง นั่นคือหลังจาก

a กลายเป็น: b

การอ้างอิงทั้งหมดไปยังวัตถุที่แสดงโดยก่อนหน้าจุดเรียกใช้อ้างอิงถึงวัตถุที่เขียนแทนโดย b และในทางกลับกัน

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

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

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

จากนั้นจะกลายเป็น:, แทนที่การอ้างอิงทั้งหมดไปยังแกลบด้วยการอ้างอิงไปยังวัตถุที่เพิ่งโหลดใหม่และลองโทรอีกครั้ง

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

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

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

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

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

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

อาจถึงเวลาที่จะต้องพิจารณาว่าการมีตารางวัตถุเป็นสิ่งที่ดีหรือไม่

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


ฉันจะกังวลมากขึ้นเกี่ยวกับbecomeผลกระทบของสติของฉันกว่าในประสิทธิภาพของโปรแกรมของฉัน ...
เบนจามินฮอดจ์สัน

Hardware support could ease the performance penalty.ในสถานที่ทั้งหมดที่ฉันเคยได้ยินสิ่งนี้ชุมชน Smalltalk เป็นชุมชนที่มีชื่อเสียงที่สุด เหตุใดเราจึงควร "ใช้" การปรับปรุงฮาร์ดแวร์เพื่อเปิดใช้งานกระบวนทัศน์การเขียนโปรแกรมในอุดมคติเมื่อสามารถนำไปสู่ประสิทธิภาพที่เพิ่มขึ้นการใช้พลังงานลดลง
Alexander - Reinstate Monica

2

มันไม่ได้ใช้มาก ในอิมเมจ Pharo 5 ที่ฉันเปิดมีผู้ส่ง #become 9 คน: 7 คนซึ่งอยู่ในการทดสอบหน่วย มันถูกใช้ในคอมไพเลอร์ในการสร้างรหัสและในห้องสมุดเชื้อเพลิงอนุกรมเพื่อแทนที่พร็อกซี่ด้วยเนื้อหาของพวกเขา


น่าสนใจ การทดสอบหน่วยใช้เพื่ออะไร
dpk

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