Nguyên tắc ít ngạc nhiên nhất là gì?


32

Trong lập trình cái gì được gọi là Nguyên tắc tối thiểu ngạc nhiên? Khái niệm này liên quan đến việc thiết kế các API tốt như thế nào? Đây có phải là một cái gì đó áp dụng cho chỉ lập trình hướng đối tượng hay nó cũng thấm vào các kỹ thuật lập trình khác? Điều này có liên quan đến nguyên tắc "làm một việc duy nhất trong phương pháp của bạn và làm tốt không"?


23
Bạn đã đọc bài viết Wikipedia ( en.wikipedia.org/wiki/Principl_of_least_astonemony )?
Doc Brown

Câu trả lời:


46

Nguyên lý tối thiểu gây ngạc nhiên được áp dụng cho một loạt các hoạt động thiết kế - và không chỉ trong điện toán (mặc dù đó thường là nơi xảy ra những điều đáng kinh ngạc nhất).

Hãy xem xét một thang máy có một nút bên cạnh có chữ "gọi". Khi bạn nhấn nút, điện thoại sẽ đổ chuông (thay vì gọi thang máy đến tầng đó). Điều này sẽ được coi là đáng kinh ngạc. Thiết kế chính xác sẽ là đặt nút gọi bên cạnh điện thoại thay vì thang máy.

Tiếp theo, hãy nghĩ đến một trang web có cửa sổ bật lên hiển thị lỗi kiểu cửa sổ với nút 'ok' trên đó. Mọi người nhấp vào nút 'ok' nghĩ rằng nó dành cho hệ điều hành và thay vào đó đi đến một trang web khác. Điều này gây ngạc nhiên cho người dùng.

Khi nói đến API ...

  • Hãy nghĩ về một phương thức toString () thay vì in ra các trường sẽ trả về "sẽ được thực hiện".
  • Một phương thức equals () hoạt động trên thông tin ẩn.
  • Đôi khi mọi người cố gắng thực hiện một lớp danh sách được sắp xếp bằng cách thay đổi phương thức add thành gọi sort () trên mảng sau đó - điều đáng ngạc nhiên vì phương thức add được cho là nối vào danh sách - điều này đặc biệt đáng kinh ngạc khi một người lấy lại đối tượng List không biết rằng ở đâu đó sâu bên trong, ai đó đã vi phạm hợp đồng giao diện.

Có một phương pháp thực hiện một điều khác biệt góp phần làm giảm sự ngạc nhiên, tuy nhiên đây là những nguyên tắc riêng biệt trong thiết kế API. Bốn nguyên tắc thường được gọi là "thiết kế API tốt" là (từ pdf này - chỉ là một ví dụ của bản trình bày như vậy. Các liên kết ở cuối của một đặc biệt này giúp đọc tốt):

Nó có khả năng gây ngạc nhiên cho ai đó khi có một lớp cố gắng làm mọi thứ - hoặc cần hai lớp để làm một việc duy nhất. Nó cũng có khả năng gây kinh ngạc khi ai đó gây rối với những người bên trong theo những cách kỳ quặc dưới vỏ bọc (tôi thấy các lớp học mở trong Ruby là một nguồn gây ngạc nhiên không bao giờ kết thúc). Cũng thật đáng kinh ngạc khi tìm thấy hai phương pháp có vẻ giống nhau.

Như vậy, nguyên tắc ít gây ngạc nhiên làm cơ sở cho các thiết kế API khác - nhưng bản thân nó không đủ để nói đơn giản là "không có API đáng kinh ngạc".

Đọc thêm (từ phối cảnh UI) - một blog của nhà phát triển IBM có tiêu đề Người dùng cáu kỉnh: Nguyên tắc tối thiểu ngạc nhiên


3
Câu trả lời tốt. Nói một cách đơn giản, PoLA có nghĩa là một thiết kế nên vừa tạo ra kỳ vọng vừa đáp ứng những mong đợi đó. Nó nên làm khá nhiều những gì mọi người mong đợi nó làm.
candied_orange

Blog của nhà phát triển IBM dường như đã được sắp xếp lại - liên kết không còn hoạt động, cũng không có bản tải xuống PDF. Có lẽ ai đó có thể nhận được một liên kết archive.org cho nó, hoặc tương tự?
Jaap

4

Nguyên tắc ít gây ngạc nhiên nhất là khi bạn, với tư cách là một nhà thiết kế API, ngăn người dùng của bạn nói BÂY GIỜ .

Một số ví dụ về sự ngạc nhiên trong các ngôn ngữ khác nhau.

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

Và còn nhiều ví dụ nữa trong các ngôn ngữ và API khác nhau. Công việc của bạn là một người viết API là để ngăn chặn điều này. Mọi thứ nên được đặt tên và nhập theo cách rõ ràng một cách rõ ràng những gì một cuộc gọi đến API của bạn sẽ làm. Bao gồm tài liệu phong phú, nơi điều này là không thể.

Về cơ bản, nếu mọi người phải đọc kỹ tài liệu của bạn để tìm ra cách ĐỌC mã được viết cho API của bạn, có lẽ bạn đã làm sai.


2
Bài đăng trên blog đó chứa đầy bs và việc chỉ vào nó không thực sự hữu ích (ngay cả khi nó không đầy bs). Bạn nên xóa nó và chỉ ra các ví dụ cụ thể về sự không nhất quán của PHP (có rất nhiều trong số chúng, sẽ không khó để chọn một cặp).
yannis

Đối với một định nghĩa về "WAT", vui lòng tham khảo CodeMash 2012 hội nghị này destroyallsoftware.com/talks/wat
Clement Herreman

Tôi đồng ý với các ví dụ của bạn ngoại trừ DateTimeđiều. Tôi giả sử đó là một đối tượng bất biến và Addtrả về một thể hiện mới. Điều này khá phổ biến.
musiKk

@musiKk - nó chỉ phổ biến trong các ngôn ngữ mà nó thậm chí không phổ biến hơn để mong đợi sửa đổi tác dụng phụ từ việc gọi các chức năng thành viên. Kinh ngạc là bối cảnh nhạy cảm.
Joris Timmermans

@YannisRizos Tôi vừa xóa liên kết đó. Tôi chỉ cố gắng để có được một tiếng cười nhỏ trong :)
Earlz

0

Đây là một ví dụ về "sự ngạc nhiên" xảy ra với tôi gần đây. Tôi bị lạc trên đường, vì vậy đã kéo qua và hơi điên cuồng (tôi đến trễ) đã đấm một ngã tư vào GPS của tôi. Tôi nhấp vào Đi và đặt tay trở lại bánh xe - nhưng sau đó nhận được một cảnh báo lớn (toàn màn hình) rằng GPS sẽ được cập nhật - yêu cầu tôi phải xác nhận.

Suy nghĩ của tôi là "bạn đang đùa à? Bây giờ bạn đang nói với tôi điều này à? Tôi cần phải rời tay khỏi bánh xe để thừa nhận?".

Bề mặt ngạc nhiên trong giao diện (thường là UI, nhưng tôi cho rằng nó cũng có thể là một API hoạt động theo cách không mong muốn). Tôi có thể nói rằng nó cũng thấm vào bên dưới giao diện, bởi vì nó cần phần mềm cơ bản được thiết kế tốt để hỗ trợ giao diện được thiết kế thực sự tốt.


Tôi đã có một ứng dụng GPS không thể xác định địa chỉ cụ thể mà tôi muốn (ở một thành phố xa lạ) vì vậy nó chỉ cho tôi chỉ đường đến trung tâm của trung tâm thành phố. May mắn thay, Google Maps đã tìm ra từ đó mà điểm đến của tôi chỉ là một vài dặm.
GalacticCowboy

4
Mặc dù đây là một câu chuyện hay nhưng đây không phải là một câu trả lời cho câu hỏi.
Marcel

1
Đủ công bằng. Câu hỏi yêu cầu giúp đỡ để hiểu một khái niệm. Ít nhất là đối với tôi, các ví dụ luôn giúp với điều này. Câu hỏi cũng hỏi làm thế nào khái niệm thấm qua; mà tôi đã cố gắng trả lời.
Dave Clausen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.