Apa prinsip yang paling mengejutkan?

32

Dalam pemrograman apa yang disebut Principle of Least Astonishment? Bagaimana konsep ini terkait dengan merancang API yang baik? Apakah ini sesuatu yang berlaku hanya untuk pemrograman berorientasi objek atau apakah itu merasuki teknik pemrograman lain juga? Apakah ini terkait dengan prinsip "melakukan satu hal dalam metode Anda dan melakukannya dengan baik"?

Kutu buku
sumber
23
Apakah Anda membaca artikel Wikipedia ( en.wikipedia.org/wiki/Principle_of_least_astonishment )?
Doc Brown

Jawaban:

46

Prinsip Terkecil Leasing berlaku untuk berbagai kegiatan desain - dan tidak hanya dalam komputasi (meskipun sering kali hal-hal yang paling menakjubkan terjadi).

Pertimbangkan lift dengan tombol di sebelahnya yang bertuliskan "panggilan". Saat Anda menekan tombol, telepon umum berdering (alih-alih memanggil lift ke lantai itu). Ini akan dianggap mencengangkan. Desain yang benar adalah dengan meletakkan tombol panggilan di samping telepon daripada lift.

Selanjutnya, pikirkan halaman web yang memiliki jendela pop up yang menampilkan kesalahan gaya windows dengan tombol 'ok' di atasnya. Orang mengklik tombol 'ok' berpikir itu untuk sistem operasi dan bukannya pergi ke halaman web lain. Ini mengejutkan pengguna.

Ketika datang ke API ...

  • Pikirkan tentang metode toString () yang alih-alih mencetak bidang mengembalikan kembali "untuk diterapkan".
  • Metode equals () yang berfungsi pada informasi tersembunyi.
  • Kadang-kadang orang mencoba mengimplementasikan kelas daftar yang diurutkan dengan mengubah metode add to call sort () pada array sesudahnya - yang mencengangkan karena metode add seharusnya ditambahkan ke daftar - ini terutama mencengangkan ketika seseorang kembali ke objek Daftar tanpa pengetahuan bahwa di suatu tempat jauh di dalam, seseorang melanggar kontrak antarmuka.

Memiliki metode yang melakukan satu hal berbeda berkontribusi pada pengurangan keheranan, namun ini adalah prinsip terpisah dalam desain API. Keempat prinsip yang sering disebut-sebut sebagai "desain API yang baik" adalah (dari pdf ini - hanya satu contoh dari presentasi semacam itu. Tautan di akhir yang khusus ini membuat bacaan yang baik):

Sangat berpotensi mengejutkan bagi seseorang untuk memiliki kelas yang mencoba melakukan segalanya - atau membutuhkan dua kelas untuk melakukan satu hal. Ini juga berpotensi mengejutkan bagi seseorang untuk mengacaukan internal dengan cara-cara aneh di bawah selimut (saya menemukan kelas terbuka di Ruby menjadi sumber keheranan yang tidak pernah berakhir). Juga menakjubkan untuk menemukan dua metode yang tampaknya melakukan hal yang sama.

Dengan demikian, prinsip paling tercengang mendasari desain API lainnya - tetapi, itu sendiri, tidak cukup hanya dengan mengatakan "tidak memiliki API yang menakjubkan."

Bacaan lebih lanjut (dari perspektif UI) - blog pengembang IBM berjudul The cranky user: The Principle of Least Astonishment

Pang
sumber
3
Jawaban yang bagus. Sederhananya PoLA berarti desain harus menciptakan harapan dan memenuhi harapan tersebut. Ini harus melakukan apa yang orang harapkan.
candied_orange
Blog pengembang IBM tampaknya telah diatur ulang - tautannya tidak lagi berfungsi, juga unduhan PDF tidak tersedia. Mungkin seseorang bisa mendapatkan tautan archive.org untuk itu, atau serupa?
Jaap
4

Prinsip yang paling mengejutkan adalah ketika Anda, sebagai perancang API, mencegah pengguna Anda mengatakan WAT .

Beberapa contoh keheranan dalam berbagai bahasa.

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

Dan ada banyak lagi contoh dalam berbagai bahasa dan API. Tugas Anda sebagai penulis API adalah untuk mencegah hal ini. Berbagai hal harus dinamai dan diketik sedemikian rupa sehingga jelas apa yang akan dilakukan panggilan ke API Anda. Sertakan dokumentasi yang cukup jika tidak memungkinkan.

Pada dasarnya, jika orang harus membaca dokumentasi Anda secara menyeluruh untuk mengetahui cara MEMBACA kode yang ditulis untuk API Anda, Anda mungkin salah melakukannya.

Earlz
sumber
2
Posting blog itu penuh dengan bs, dan menunjuknya tidak terlalu membantu (bahkan jika itu tidak penuh dengan bs). Anda harus menghapusnya dan menunjuk ke contoh - contoh spesifik dari inkonsistensi PHP (ada begitu banyak dari mereka, tidak akan sulit untuk memilih pasangan).
yannis
Untuk definisi "WAT", silakan merujuk ke konferensi CodeMash 2012 ini destroyallsoftware.com/talks/wat
Clement Herreman
Saya setuju dengan contoh Anda kecuali DateTimemasalahnya. Saya menganggap itu objek abadi dan Addmengembalikan contoh baru. Ini sangat umum.
musiKk
@musiKk - itu hanya umum dalam bahasa di mana bahkan LEBIH umum untuk mengharapkan memodifikasi efek samping dari memanggil fungsi anggota. Keheranan peka terhadap konteks.
Joris Timmermans
@YannisRizos Saya baru saja menghapus tautan itu. Saya hanya mencoba untuk tertawa kecil :)
Earlz
0

Ini contoh "keheranan" yang terjadi pada saya baru-baru ini. Saya tersesat di jalan, jadi menepi dan agak panik (saya terlambat) menekan persimpangan ke GPS saya. Saya mengklik Go dan meletakkan tangan saya kembali ke kemudi - tetapi kemudian mendapat peringatan keras (layar penuh) bahwa GPS harus diperbarui - mengharuskan saya untuk mengakui.

Pikiran saya adalah "apakah Anda bercanda? Anda memberi tahu saya sekarang? Saya perlu melepaskan tangan saya dari roda untuk mengakui?".

Permukaan takjub di antarmuka (biasanya UI, tapi saya kira itu juga bisa menjadi API yang berperilaku tidak terduga). Saya akan mengatakan itu meresap di bawah antarmuka juga, karena dibutuhkan perangkat lunak yang dirancang dengan baik untuk mendukung antarmuka yang benar-benar dirancang dengan baik.

Dave Clausen
sumber
Saya memiliki aplikasi GPS yang tidak dapat mengidentifikasi alamat spesifik yang saya inginkan (di kota yang tidak dikenal) sehingga hanya memberi saya petunjuk ke pusat kota. Untungnya, Google Maps menemukan dari sana bahwa tujuan saya hanya beberapa mil jauhnya.
GalacticCowboy
4
Meskipun ini adalah cerita yang bagus, ini bukan jawaban untuk pertanyaan itu.
Marcel
1
Cukup adil. Pertanyaan itu meminta bantuan untuk memahami suatu konsep. Setidaknya bagi saya, contoh selalu membantu dalam hal ini. Pertanyaan itu juga menanyakan bagaimana konsep itu menyebar ke luar; yang saya coba jawab.
Dave Clausen