it-swarm.com.de

Was ist das Prinzip des geringsten Erstaunens?

Was nennt man bei der Programmierung das Prinzip des geringsten Erstaunens? Wie hängt dieses Konzept mit dem Entwerfen guter APIs zusammen? Gilt dies nur für die objektorientierte Programmierung oder durchdringt es auch andere Programmiertechniken? Hängt dies mit dem Prinzip zusammen, "eine einzige Sache in Ihrer Methode zu tun und es gut zu machen"?

33
Geek

Das Prinzip des geringsten Erstaunens gilt für eine Vielzahl von Designaktivitäten - und nicht nur für die Datenverarbeitung (obwohl dort häufig die erstaunlichsten Dinge passieren).

Stellen Sie sich einen Aufzug mit einem Knopf daneben vor, auf dem "Anruf" steht. Wenn Sie die Taste drücken, klingelt das Münztelefon (anstatt den Aufzug in diese Etage zu rufen). Dies wäre erstaunlich. Das richtige Design wäre, die Ruftaste neben dem Telefon und nicht neben dem Aufzug zu platzieren.

Stellen Sie sich als Nächstes eine Webseite mit einem Popup-Fenster vor, in dem ein Windows-Stilfehler mit der Schaltfläche "OK" angezeigt wird. Die Leute klicken auf die Schaltfläche "OK" und denken, dass dies für das Betriebssystem gilt. Stattdessen wechseln sie zu einer anderen Webseite. Dies überrascht den Benutzer.

Wenn es um eine API geht ...

  • Stellen Sie sich eine toString () -Methode vor, die anstelle des Ausdrucks der Felder "zu implementieren" zurückgibt.
  • Eine equals () -Methode, die mit versteckten Informationen arbeitet.
  • Manchmal Leute versuchen, eine sortierte Listenklasse zu implementieren, indem sie die add-Methode ändern, um anschließend sort () für das Array aufzurufen - was erstaunlich ist, da die add-Methode anhängen soll Die Liste - Dies ist besonders erstaunlich, wenn man ein List-Objekt zurückerhält, ohne zu wissen, dass irgendwo tief im Inneren jemand gegen den Schnittstellenvertrag verstoßen hat.

Eine Methode, die eine bestimmte Sache tut, trägt zur Verringerung des Erstaunens bei. Dies sind jedoch separate Prinzipien im API-Design. Die vier Prinzipien, die oft als "gutes API-Design" angepriesen werden, sind (von dieses PDF - nur eine Instanz einer solchen Präsentation. Die Links am Ende dieser speziellen sorgen für eine gute Lektüre):

Es ist möglicherweise erstaunlich, wenn jemand eine Klasse hat, die versucht, alles zu tun - oder zwei Klassen benötigt, um eine einzige Sache zu tun. Es ist ebenfalls potenziell erstaunlich, wenn jemand auf seltsame Weise unter der Decke mit den Interna herumspielt (ich finde offene Klassen in Ruby als Quelle für nie endendes Erstaunen). Es ist ebenfalls erstaunlich zwei Methoden zu finden, die anscheinend dasselbe tun.

Als solches liegt den anderen API-Designs das Prinzip des geringsten Erstaunens zugrunde - aber es allein reicht nicht aus, einfach zu sagen: "Keine erstaunliche API".

Weiterführende Literatur (aus Sicht der Benutzeroberfläche) - ein IBM-Entwicklerblog mit dem Titel Der launische Benutzer: Das Prinzip des geringsten Erstaunens

47
user40980

Das Prinzip des geringsten Erstaunens ist, wenn Sie als API-Designer Ihre Benutzer daran hindern, WAT zu sagen.

Einige Beispiele für Erstaunen in verschiedenen Sprachen.

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

Und es gibt viele weitere Beispiele in verschiedenen Sprachen und APIs. Ihre Aufgabe als API-Writer ist es, dies zu verhindern. Die Dinge sollten so benannt und getippt werden, dass es offensichtlich ist, was ein Aufruf Ihrer API bewirkt. Fügen Sie eine umfangreiche Dokumentation bei, wenn dies nicht möglich ist.

Wenn Benutzer Ihre Dokumentation gründlich lesen müssen, um herauszufinden, wie der für Ihre API geschriebene Code gelesen werden kann, machen Sie das wahrscheinlich falsch.

4
Earlz

Hier ist ein Beispiel für "Erstaunen", das mir kürzlich passiert ist. Ich habe mich auf der Straße verlaufen, bin also vorbeigefahren und habe etwas hektisch (ich war spät dran) eine Kreuzung in mein GPS geschlagen. Ich klickte auf Los und legte meine Hände wieder auf das Lenkrad. Dann wurde eine laute Warnung (Vollbild) angezeigt, dass das GPS aktualisiert werden sollte. Ich musste dies bestätigen.

Mein Gedanke war "Machst du Witze? Du erzählst mir das jetzt? Ich muss meine Hände vom Lenkrad nehmen, um es zu bestätigen?".

Erstaunen taucht in der Benutzeroberfläche auf (normalerweise die Benutzeroberfläche, aber ich nehme an, es könnte sich auch um eine API handeln, die sich unerwartet verhält). Ich würde sagen, dass es auch unter die Benutzeroberfläche eindringt, da gut gestaltete zugrunde liegende Software erforderlich ist, um eine wirklich gut gestaltete Benutzeroberfläche zu unterstützen.

0
Dave Clausen