web-dev-qa-db-fra.com

Quel est le principe du moindre étonnement?

Dans la programmation, ce qu'on appelle le principe du moindre étonnement? Comment ce concept est-il lié à la conception de bonnes API? Est-ce quelque chose qui s'applique uniquement à la programmation orientée objet ou imprègne-t-il également d'autres techniques de programmation? Est-ce lié au principe "faire une seule chose dans sa méthode et bien le faire"?

33
Geek

Le principe du moindre étonnement s'applique à un large éventail d'activités de conception - et pas seulement en informatique (bien que ce soit souvent là que les choses les plus étonnantes se produisent).

Considérez un ascenseur avec un bouton à côté qui dit "appeler". Lorsque vous appuyez sur le bouton, le téléphone public sonne (plutôt que d'appeler l'ascenseur à cet étage). Cela serait considéré comme étonnant. La conception correcte serait de placer le bouton d'appel à côté du téléphone plutôt que de l'ascenseur.

Ensuite, pensez à une page Web qui a une fenêtre pop-up qui montre une erreur de style Windows avec un bouton 'ok' dessus. Les gens cliquent sur le bouton "ok" en pensant que c'est pour le système d'exploitation et vont à la place sur une autre page Web. Cela étonne l'utilisateur.

Quand il s'agit d'une API ...

  • Pensez à une méthode toString () qui au lieu d'imprimer les champs retourne "à mettre en œuvre".
  • Une méthode equals () qui fonctionne sur les informations cachées.
  • Parfois les gens essaient d'implémenter une classe de liste triée en changeant la méthode add pour appeler sort () sur le tableau par la suite - ce qui est étonnant car la méthode add est censée s'ajouter à la liste - c'est particulièrement étonnant quand on récupère un objet List sans savoir que quelque part au fond, quelqu'un a violé le contrat d'interface.

Avoir une méthode qui fait une chose distincte contribue à réduire l'étonnement, mais ce sont des principes distincts dans la conception de l'API. Les quatre principes souvent présentés comme une "bonne conception d'API" sont (à partir de ce pdf - une seule instance d'une telle présentation. Les liens à la fin de celle-ci permettent une bonne lecture):

Il est potentiellement étonnant pour quelqu'un d'avoir une classe qui essaie de tout faire - ou d'avoir besoin de deux classes pour faire une seule chose. Il est également potentiellement étonnant pour quelqu'un de jouer avec les internes de manière étrange sous les couvertures (je trouve les classes ouvertes dans Ruby pour être une source d'étonnement sans fin). C'est aussi également étonnant pour trouver deux méthodes qui font apparemment la même chose.

En tant que tel, le principe du moindre étonnement sous-tend les autres conceptions de l'API - mais il ne suffit pas en soi de dire simplement "ne pas avoir une API étonnante".

Lectures complémentaires (du point de vue de l'interface utilisateur) - un blog de développeur IBM intitulé L'utilisateur grincheux: le principe du moindre étonnement

47
user40980

Le principe du moindre étonnement est lorsque vous, en tant que concepteur d'API, empêchez vos utilisateurs de dire WAT .

Quelques exemples d'étonnement dans différentes langues.

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

Et il existe de nombreux autres exemples dans divers langages et API. Votre travail en tant que rédacteur d'API est d'empêcher cela. Les choses doivent être nommées et tapées de telle manière qu'il soit clairement évident ce que fera un appel à votre API. Incluez une documentation abondante lorsque cela n'est pas possible.

Fondamentalement, si les gens doivent lire attentivement votre documentation pour comprendre comment lire le code écrit pour votre API, vous vous trompez probablement.

4
Earlz

Voici un exemple "d'étonnement" qui m'est arrivé récemment. Je me suis perdu sur la route, alors je me suis arrêté et j'ai frénétiquement quelque peu (j'étais en retard) percé une intersection dans mon GPS. J'ai cliqué sur Go et remis mes mains sur le volant - mais j'ai ensuite reçu un avertissement fort (plein écran) que le GPS devrait être mis à jour - me demandant de confirmer.

Ma pensée était "vous plaisantez? Vous me le dites maintenant? Je dois retirer mes mains du volant pour reconnaître?".

L'étonnement fait surface dans l'interface (généralement l'interface utilisateur, mais je suppose que cela pourrait également être une API qui se comporte de manière inattendue). Je dirais qu'il pénètre également sous l'interface, car il faut un logiciel sous-jacent bien conçu pour prendre en charge une interface vraiment bien conçue.

0
Dave Clausen