Alan Kay หมายถึงอะไรโดย“ การมอบหมาย” ในประวัติศาสตร์ยุคแรกของ Smalltalk


47

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

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

(จากปี1960-66 - OOP ยุคแรกและแนวคิดการก่อสร้างอื่น ๆ ของอายุหกสิบเศษมาตรา I)

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

(จากสไตล์ "เชิงวัตถุ"ส่วนที่ IV)

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

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

...และ:

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

มันจะยุติธรรมหรือไม่ที่จะพูดว่าตัวอย่างที่ทึบแสงและไม่เปลี่ยนแปลงกำลังได้รับการส่งเสริมที่นี่? หรือมันเป็นเพียงการเปลี่ยนแปลงสถานะโดยตรงที่ท้อแท้? ตัวอย่างเช่นถ้าฉันมีBankAccountชั้นก็ตกลงที่จะมีGetBalance, DepositและWithdrawวิธีการเช่นข้อความ /; ตรวจสอบให้แน่ใจว่าไม่มีSetBalanceวิธี / ข้อความอินสแตนซ์ใช่หรือไม่

คำตอบ:


86

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

แต่วัตถุมี "เส้นโลก" ของการเปลี่ยนแปลงในเวลา สิ่งนี้สามารถคิดได้ว่าเป็น - ประวัติ - ของเวอร์ชันของวัตถุที่ - ความสัมพันธ์ - สอดคล้องกัน ไม่มีเงื่อนไขการแย่งชิงในโครงการนี้ ... วัตถุจะมองเห็นได้ก็ต่อเมื่อมันมีความเสถียรและไม่มีการคำนวณอีกต่อไป นี่เป็นเหมือนนาฬิกาสองเฟสใน HW (แนวคิดจาก Strachey และแตกต่างจาก McCarthy และได้รับอิทธิพลจาก Lucid)

ด้วยความปรารถนาดี

อลันเคย์


2
@ alan-kay: ขอบคุณ! ฉันขออนุญาตจากคุณในวิทยานิพนธ์ของฉันได้ไหม
Olivier Dagenais

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

@OlivierDagenais แม้ว่าฉันจะแน่ใจว่าอลันจะมีความสุขมากกว่า (เขาดูเหมือนว่าเป็นคนที่น่ากลัวมาก) คำตอบ SE ได้รับใบอนุญาต CC ดังนั้นการจัดหาคำถามและคำตอบ SE นั้นถูกต้องสมบูรณ์แบบ
Wayne Werner

นาฬิกาสองเฟส? นี่เป็นรูปแบบที่เหมือน "ผู้สังเกตการณ์" และรูปแบบของดาต้าโฟลว์เช่นใน Excel หรือใน React.JS ซึ่งวัตถุจะเผยแพร่การเปลี่ยนแปลงใด ๆ ตามเพื่อรักษาข้อ จำกัด
aoeu256

21

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

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

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

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

โดยการระบุวัตถุเหล่านี้โดยตรง - Teller, Deposit Slip ฯลฯ - โดเมนปัญหาจะมีโครงสร้างตามข้อความที่ส่งผ่านโดยเอนทิตีในระบบ

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

ทำไมสิ่งนี้จึงสำคัญ ถามตัวเองว่าต้องทำอะไรเพื่อบันทึกธุรกรรม:

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

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

ในทำนองเดียวกันAgoric ComputingหรือSmart Contractsนำความคิดจากกลไกตลาดไปสู่การคำนวณ เป็นสิ่งสำคัญที่เมื่อคุณเตรียมใบนำฝากคุณต้องให้เช็คหรือกระเป๋าเงินเพื่อทำการฝาก เนื่องจากมีเวลารอคอยระหว่างการรับเช็คและเป็นการเข้าสู่บัญชีของคุณจริงคุณจึงต้องมีวิธีที่ปลอดภัยในการจัดการสกุลเงิน ตามที่ปรากฎว่าความสามารถของวัตถุเป็นวิธีที่เป็นธรรมชาติในการรับเงินที่ปลอดภัย พวกเขาสามารถใช้เพื่อให้แน่ใจว่าอลิซจะไม่โกงบ๊อบด้วยการถอนเงินทั้งหมดของเธอหลังจากที่เธอเขียนเช็คบ๊อบ


ขอบคุณสำหรับการกำจัดBankAccountตัวอย่างของเล่นที่พบได้ทั่วไปทั้งหมดของ OOP
akuhn

ในขณะที่คำตอบโดยรวมของคุณยอดเยี่ยม (มีคนน้อยเกินไปที่เข้าใจว่าบัญชีไม่สมดุล แต่เป็นรายการธุรกรรมดังนั้นขอขอบคุณสำหรับสิ่งนั้น) คุณไม่ได้รับสิทธิ์ในการทำบัญชีสองครั้ง จุดของการเข้าสู่ระบบสองครั้งคือเดบิตหรือเครดิตทุกบัญชี (เช่นรายการธุรกรรม) มีเครดิตหรือเดบิตที่สอดคล้องกับบัญชีอื่น ๆ เพื่อจับคู่สิ่งต่าง ๆ เช่นหากคุณหักบัญชีลูกค้าที่ราคา¥ 108 (เช่นลูกค้าให้เงินจำนวนมาก) คุณจะเครดิตบัญชีรายได้ 100 เยนและบัญชี "ภาษีที่ค้างชำระ" ของคุณภายใน 8 match เพื่อให้ตรงกับการหักบัญชีนั้นและแสดงว่าเงินไปไหน (หรือควรไป)
Curt J. Sampson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.