หลักการของความประหลาดใจน้อยที่สุดคืออะไร?


32

ในการเขียนโปรแกรมสิ่งที่เรียกว่า Principle of Least ประหลาดใจ? แนวคิดนี้เกี่ยวข้องกับการออกแบบ API ที่ดีอย่างไร สิ่งนี้ใช้ได้กับการเขียนโปรแกรมเชิงวัตถุเท่านั้นหรือมันซึมซาบเทคนิคการเขียนโปรแกรมอื่น ๆ ด้วยหรือไม่ สิ่งนี้เกี่ยวข้องกับหลักการ "ทำสิ่งเดียวในวิธีการของคุณและทำได้ดีหรือไม่"?


23
คุณอ่านบทความ Wikipedia ( en.wikipedia.org/wiki/Principle_of_least_astonishment ) หรือยัง
Doc Brown

คำตอบ:


46

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

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

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

เมื่อพูดถึง API ...

  • คิดเกี่ยวกับเมธอด toString () ที่แทนที่จะพิมพ์ฟิลด์กลับคืน "เพื่อนำไปใช้"
  • วิธีการ equals () ที่ทำงานกับข้อมูลที่ซ่อนอยู่
  • บางครั้งผู้คนพยายามใช้คลาสลิสต์ที่เรียงลำดับโดยการเปลี่ยนวิธีการเพิ่มเพื่อเรียก sort () บนอาเรย์หลังจากนั้น - ซึ่งน่าประหลาดใจเพราะเมธอด addควรจะผนวกเข้ากับรายการ - นี่เป็นสิ่งที่น่าประหลาดใจอย่างยิ่ง ไม่มีความรู้ว่ามีบางส่วนอยู่ด้านในลึกบางคนละเมิดสัญญาอินเตอร์เฟซ

การมีวิธีการที่ทำสิ่งหนึ่งที่แตกต่างมีส่วนช่วยลดความประหลาดใจอย่างไรก็ตามสิ่งเหล่านี้เป็นหลักการแยกต่างหากในการออกแบบ API หลักการทั้งสี่มักจะขนานนามว่า "การออกแบบ API ที่ดี" คือ (จากไฟล์ PDF นี้ - เป็นเพียงตัวอย่างหนึ่งของงานนำเสนอดังกล่าวลิงก์ในตอนท้ายของบทความนี้ทำเพื่อการอ่านที่ดี):

อาจเป็นเรื่องน่าประหลาดใจที่บางคนมีชั้นเรียนที่พยายามทำทุกอย่าง - หรือต้องการเรียนสองชั้นเพื่อทำสิ่งเดียว นอกจากนี้ยังเป็นที่น่าอัศจรรย์สำหรับบางคนที่จะยุ่งกับ internals ในรูปแบบแปลก ๆ ภายใต้ฝาครอบ (ฉันพบชั้นเรียนเปิดใน Ruby เป็นแหล่งของความประหลาดใจที่ไม่มีที่สิ้นสุด) นอกจากนี้ยังเป็นที่น่าอัศจรรย์ในการค้นหาสองวิธีที่ทำสิ่งเดียวกัน

ดังนั้นหลักการของความประหลาดใจอย่างน้อยก็เป็นไปตามการออกแบบ API อื่น ๆ แต่ตัวมันเองนั้นไม่เพียงพอที่จะพูดง่ายๆว่า "ไม่มี API ที่น่าอัศจรรย์"

อ่านเพิ่มเติม (จากมุมมอง UI) - บล็อกผู้พัฒนา IBM ชื่อผู้ใช้ที่บ้าๆบอ ๆ : The Principle of Least Astonishment


3
คำตอบที่ดี. ใส่เพียง PoLA หมายถึงการออกแบบควรสร้างความคาดหวังและตอบสนองความคาดหวังเหล่านั้น ควรทำในสิ่งที่ผู้คนคาดหวังไว้
candied_orange

บล็อกนักพัฒนาซอฟต์แวร์ของ IBM ดูเหมือนว่าจะมีการจัดระเบียบใหม่ - ลิงก์ไม่ทำงานอีกต่อไปและไม่มีการดาวน์โหลด PDF อาจมีใครบางคนสามารถรับลิงค์ archive.org ได้หรือคล้ายกัน
Jaap

4

หลักการของความประหลาดใจไม่น้อยกว่าคือเมื่อคุณเป็นนักออกแบบ API, ป้องกันไม่ให้ผู้ใช้ของคุณพูดWAT

ตัวอย่างของความประหลาดใจในภาษาที่แตกต่างกัน

var array=new string[]; 
var list=array as IList<string>; //this works... 
list.Add("foo"); //exception saying it's not supported

foo.Equals(bar); //will call overriden Equals method
foo == bar; //equivalent to above in everyway, except for it won't call overrides... unless you're dealing with a string

var d=DateTime.Today;
d.Add(new TimeSpan(36,0,0,0)); //add 36 days to datetime d
Console.Writeline(d); //will print todays date. WAT

//in javascript
var f=function(){
  return 
    10; 
} //will either throw a syntax error or return void, depending on your javascript runner

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

โดยทั่วไปถ้าผู้คนต้องอ่านเอกสารของคุณอย่างถี่ถ้วนเพื่อหาวิธีอ่านโค้ดที่เขียนขึ้นสำหรับ API ของคุณคุณอาจทำผิด


2
โพสต์บล็อกนั้นเต็มไปด้วย bs และการชี้ไปที่มันก็ไม่ได้มีประโยชน์อะไรเลย (แม้ว่ามันจะไม่เต็ม bs ก็ตาม) คุณควรลบออกและชี้ไปที่ตัวอย่างเฉพาะของความไม่สอดคล้องของ PHP (มีจำนวนมากดังนั้นมันจึงไม่ยากที่จะเลือกคู่)
yannis

สำหรับคำนิยามของ "WAT" โปรดอ้างอิง CodeMash 2012 conference destroyallsoftware.com/talks/wat
Clement Herreman

ฉันเห็นด้วยกับตัวอย่างของคุณยกเว้นDateTimeสิ่งนั้น ฉันคิดว่ามันเป็นวัตถุที่ไม่เปลี่ยนรูปแบบและAddส่งคืนอินสแตนซ์ใหม่ นี่เป็นเรื่องธรรมดา
musiKk

@musiKk - พบได้ทั่วไปในภาษาที่ไม่ได้พบกันมากนักหากต้องการแก้ไขผลข้างเคียงจากการเรียกฟังก์ชั่นสมาชิก ความพิศวงเป็นไปตามบริบท
Joris Timmermans

@YannisRizos ฉันเพิ่งลบลิงก์นั้น ฉันแค่พยายามหัวเราะเล็ก ๆ น้อย ๆ :)
Earlz

0

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

ความคิดของฉันคือ "คุณล้อเล่นหรือไม่คุณกำลังบอกฉันตอนนี้หรือไม่ฉันต้องถอดมือออกเพื่อรับทราบ?"

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


ฉันมีแอพ GPS ที่ไม่สามารถระบุที่อยู่เฉพาะที่ฉันต้องการ (ในเมืองที่ไม่คุ้นเคย) ดังนั้นฉันจึงบอกทิศทางไปยังใจกลางเมือง โชคดีที่ Google Maps คิดออกจากที่นั่นว่าปลายทางของฉันอยู่ห่างออกไปเพียงไม่กี่ไมล์
GalacticCowboy

4
ในขณะที่เรื่องนี้เป็นเรื่องที่ดีนี่ไม่ใช่คำตอบสำหรับคำถาม
Marcel

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