Який принцип найменшого здивування?


32

У програмуванні називається Принцип найменшого здивування? Як ця концепція пов'язана з розробкою хороших API? Це щось застосовне лише до об'єктно-орієнтованого програмування чи воно пронизує й інші методи програмування? Чи пов’язано це з принципом "робити одну річ у своєму методі та робити це добре"?


23
Чи читали ви статтю у Вікіпедії ( en.wikipedia.org/wiki/Principle_of_least_astonishment )?
Doc Brown

Відповіді:


46

Принцип найменшого здивування застосовний до широкого спектру дизайнерської діяльності - і не тільки в обчислювальній техніці (хоча там часто трапляються найдивовижніші речі).

Розгляньте ліфт із кнопкою поруч із написом "дзвоніть". Коли ви натискаєте кнопку, таксофон дзвонить (а не викликає ліфт на той поверх). Це було б вражаючим. Правильною конструкцією було б поставити кнопку виклику поруч із телефоном, а не ліфтом.

Далі, придумайте веб-сторінку, яка містить спливаюче вікно, яке відображає помилку стилю Windows із кнопкою «ОК» на ній. Люди натискають кнопку "ОК", думаючи, що це для операційної системи, а замість цього переходять на іншу веб-сторінку. Це дивує користувача.

Що стосується API ...

  • Подумайте про метод toString (), який замість роздруківки полів повертається назад "для реалізації".
  • Метод equals (), який працює на прихованій інформації.
  • Іноді люди намагаються реалізувати відсортований клас списку, змінивши метод додавання на виклик sort () в масиві після цього - що дивно, оскільки метод додавання повинен додаватися до списку - це особливо дивно, коли повертаєш об'єкт списку не знаючи, що десь глибоко всередині хтось порушив договір інтерфейсу.

Наявність методу, який робить одну чітку річ, сприяє зменшенню здивування, проте це окремі принципи в розробці API. Чотири принципи, які часто рекламуються як "хороший дизайн API", є (з цього файлу pdf - лише один екземпляр такої презентації. Посилання в кінці цього конкретного тексту дозволяють добре прочитати):

Для когось потенційно дивовижно мати клас, який намагається зробити все - або потрібні два класи, щоб зробити одну справу. Це також може бути дивовижним для когось возитись із внутрішніми, як незвично, під прикриттями (я вважаю, що відкриті класи в Рубі є джерелом нескінченного здивування). Також дивним є пошук двох методів, які, очевидно, роблять те саме.

Таким чином, принцип найменшого здивування лежить в основі інших розробок API - але він сам по собі недостатній, щоб просто сказати, "не майте дивовижного API".

Подальше читання (з точки зору користувальницького інтерфейсу) - блог розробників IBM під назвою Примхливий користувач: Принцип найменшого здивування


3
Гарна відповідь. Простіше кажучи, PoLA означає, що дизайн повинен створювати і очікування, і відповідати цим очікуванням. Він повинен робити майже те, що люди від нього очікують.
candied_orange

Блог розробника IBM, схоже, був реорганізований - посилання більше не працює, а також завантаження PDF не доступне. Можливо, хтось може отримати на нього посилання archive.org чи подібне?
Яап

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, і вказівка ​​на це не зовсім корисна (навіть якщо вона не була повною мірою). Вам слід видалити його та вказати на конкретні приклади невідповідностей PHP (їх так багато, що вибрати пару не буде складно).
янніс

Для визначення «WAT», будь ласка , зверніться до цієї CodeMash 2012 Конференції destroyallsoftware.com/talks/wat
Клемент Herreman

Я згоден з вашими прикладами, крім DateTimeречі. Я припускаю, що це незмінний об'єкт і Addповертає новий екземпляр. Це досить часто.
musiKk

@musiKk - поширений лише в мовах, де навіть НЕ БІЛЬШЕ звичайно очікувати зміни побічних ефектів від виклику функцій учасників. Подив враховує контекст.
Joris Timmermans

@YannisRizos Я щойно видалив це посилання. Я просто намагався засміятись :)
Earlz

0

Ось приклад "здивування", яке трапилося зі мною нещодавно. Я заблукав у дорозі, тому натягнув на себе і дещо відчайдушно (я запізнився) пробив перехрестя в мій GPS. Я натиснув Go і поклав руки назад на колесо - але потім отримав гучне (на весь екран) попередження про те, що GPS повинен бути оновлений - вимагаючи від мене підтвердження.

Моя думка полягала в тому, що "ти жартуєш? Ти зараз це мені кажеш? Мені потрібно зняти руки з колеса, щоб визнати?".

Подив поверхонь в інтерфейсі (як правило, інтерфейс користувача, але я вважаю, що це також може бути API, який веде себе несподівано). Я б сказав, що він пронизаний і нижче інтерфейсу, тому що він потребує добре розробленого базового програмного забезпечення для підтримки дійсно добре розробленого інтерфейсу.


У мене був додаток GPS, який не міг визначити конкретну адресу, яку я хотів (у незнайомому місті), тому він просто дав мені вказівки до центру міста. На щастя, Карти Google з’ясували звідти, що мій пункт призначення знаходиться лише за пару миль.
GalacticCowboy

4
Хоча це приємна історія, це не є відповіддю на питання.
Марсель

1
Досить справедливо. Питання попросило допомогти зрозуміти поняття. Принаймні для мене приклади завжди допомагають у цьому. Питання також задало, як концепція пронизує межі; на що я намагався відповісти.
Дейв Клаузен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.