Ok, teman saya bolak-balik membahas apa arti "antarmuka" dalam pemrograman.
Apa deskripsi terbaik dari sebuah "antarmuka".
Bagi saya antarmuka adalah cetak biru sebuah kelas, apakah ini definisi terbaik?
oop
interface
definition
Daniel Kivatinos
sumber
sumber
Jawaban:
Antarmuka adalah salah satu istilah yang kelebihan beban dan membingungkan dalam pengembangan.
Ini sebenarnya adalah konsep abstraksi dan enkapsulasi. Untuk "kotak" tertentu, ia mendeklarasikan "input" dan "output" dari kotak itu. Dalam dunia perangkat lunak, itu biasanya berarti operasi yang dapat dijalankan di kotak (bersama dengan argumen) dan dalam beberapa kasus mengembalikan jenis operasi ini.
Apa yang tidak dilakukannya adalah mendefinisikan apa semantik dari operasi-operasi ini, meskipun merupakan hal yang biasa (dan praktik yang sangat baik) untuk mendokumentasikannya di dekat deklarasi (misalnya, melalui komentar), atau untuk memilih konvensi penamaan yang baik. Namun demikian, tidak ada jaminan bahwa niat tersebut akan diikuti.
Berikut analoginya: Lihat televisi Anda saat mati. Antarmukanya adalah tombol yang dimilikinya, berbagai colokan, dan layar. Semantik dan perilakunya adalah bahwa ia mengambil input (misalnya, pemrograman kabel) dan memiliki output (tampilan di layar, suara, dll.). Namun, saat Anda melihat TV yang tidak dicolokkan, Anda memproyeksikan semantik yang diharapkan ke dalam sebuah antarmuka. Sejauh yang Anda tahu, TV bisa saja meledak saat Anda mencolokkannya. Namun, berdasarkan "antarmuka" -nya Anda dapat berasumsi bahwa TV tidak akan menghasilkan kopi karena tidak memiliki asupan air.
Dalam pemrograman berorientasi objek, antarmuka umumnya mendefinisikan sekumpulan metode (atau pesan) yang dapat direspons oleh instance kelas yang memiliki antarmuka itu.
Yang menambah kebingungan adalah bahwa dalam beberapa bahasa, seperti Java, terdapat antarmuka aktual dengan semantik khusus bahasanya. Di Java, misalnya, ini adalah sekumpulan deklarasi metode, tanpa implementasi, tetapi antarmuka juga sesuai dengan tipe dan mematuhi berbagai aturan pengetikan.
Dalam bahasa lain, seperti C ++, Anda tidak memiliki antarmuka. Sebuah kelas itu sendiri mendefinisikan metode, tetapi Anda dapat menganggap antarmuka kelas sebagai deklarasi metode non-privat. Karena cara C ++ mengompilasi, Anda mendapatkan file header tempat Anda dapat memiliki "antarmuka" kelas tanpa implementasi yang sebenarnya. Anda juga dapat meniru antarmuka Java dengan kelas abstrak dengan fungsi virtual murni, dll.
Antarmuka jelas bukan cetak biru untuk sebuah kelas. Sebuah cetak biru, menurut satu definisi adalah "rencana tindakan terperinci". Antarmuka tidak menjanjikan apa pun tentang suatu tindakan! Sumber kebingungan adalah bahwa dalam kebanyakan bahasa, jika Anda memiliki tipe antarmuka yang mendefinisikan sekumpulan metode, kelas yang mengimplementasikannya "mengulangi" metode yang sama (tetapi memberikan definisi), sehingga antarmuka terlihat seperti kerangka atau garis besar kelas.
sumber
Pertimbangkan situasi berikut:
Sekarang pertimbangkan:
Anda tidak merinci (atau tidak peduli) dengan tepat apa yang akan dipilih teman Anda untuk dilemparkan;
... Tapi itu tidak masalah, selama:
Itu adalah sesuatu yang bisa dilempar (Dia tidak bisa melempar Anda sofa)
Itu adalah sesuatu yang bisa Anda pegang (Mari berharap dia tidak melempar shuriken)
Itu adalah sesuatu yang dapat Anda gunakan untuk menghancurkan otak zombie (Itu mengesampingkan bantal dan semacamnya)
Tidak masalah apakah Anda mendapatkan tongkat bisbol atau palu -
selama itu menerapkan ketiga kondisi Anda, Anda baik-baik saja.
Singkatnya:
Saat Anda menulis antarmuka, pada dasarnya Anda mengatakan: "Saya butuh sesuatu yang ..."
sumber
Antarmuka adalah kontrak yang harus Anda patuhi atau berikan, tergantung apakah Anda pelaksana atau pengguna.
sumber
Saya tidak berpikir "cetak biru" adalah kata yang baik untuk digunakan. Cetak biru memberi tahu Anda cara membangun sesuatu. Antarmuka secara khusus menghindari memberi tahu Anda cara membuat sesuatu.
Antarmuka mendefinisikan bagaimana Anda dapat berinteraksi dengan kelas, yaitu metode apa yang didukungnya.
sumber
Tidak. Cetak biru biasanya menyertakan internal. Tapi antarmuka murni tentang apa yang terlihat di luar kelas ... atau lebih tepatnya, keluarga kelas yang mengimplementasikan antarmuka.
Antarmuka terdiri dari tanda tangan metode dan nilai konstanta, dan juga "kontrak perilaku" (biasanya informal) antara kelas yang mengimplementasikan antarmuka dan orang lain yang menggunakannya.
sumber
Dalam Pemrograman, antarmuka menentukan perilaku apa yang akan dimiliki suatu objek, tetapi tidak akan benar-benar menentukan perilaku. Ini adalah kontrak, yang akan menjamin, bahwa kelas tertentu dapat melakukan sesuatu.
Pertimbangkan potongan kode C # ini di sini:
Kelas Game membutuhkan nomor rahasia. Untuk mengujinya, Anda ingin memasukkan apa yang akan digunakan sebagai nomor rahasia (prinsip ini disebut Inversion of Control).
Kelas game ingin menjadi "berpikiran terbuka" tentang apa yang sebenarnya akan membuat bilangan acak, oleh karena itu ia akan menanyakan "apa saja, yang memiliki metode Hasilkan" dalam konstruktornya.
Pertama, antarmuka menentukan, operasi apa yang akan disediakan objek. Ini hanya berisi seperti apa tampilannya, tetapi tidak ada implementasi aktual yang diberikan. Ini hanyalah tanda tangan dari metode tersebut. Biasanya, di C # antarmuka diawali dengan I. Kelas sekarang mengimplementasikan Antarmuka IGenerate. Ini berarti kompilator akan memastikan, bahwa mereka berdua memiliki metode, yang mengembalikan sebuah int dan dipanggil
Generate
. Permainan sekarang disebut dua objek yang berbeda, yang masing-masing mengimplementasikan antarmuka yang benar. Kelas lain akan menghasilkan kesalahan saat membangun kode.Di sini saya melihat analogi cetak biru yang Anda gunakan:
Kelas biasanya dilihat sebagai cetak biru untuk suatu objek. Antarmuka menentukan sesuatu yang perlu dilakukan oleh kelas, sehingga orang dapat berargumen bahwa itu memang hanya cetak biru untuk kelas, tetapi karena kelas tidak selalu membutuhkan antarmuka, saya berpendapat bahwa metafora ini melanggar. Pikirkan antarmuka sebagai kontrak. Kelas yang "menandatanganinya" akan diwajibkan secara hukum (diberlakukan oleh polisi penyusun), untuk mematuhi syarat dan ketentuan dalam kontrak. Ini berarti bahwa itu harus dilakukan, apa yang ditentukan dalam antarmuka.
Ini semua karena sifat tipe statis dari beberapa bahasa OO, seperti halnya dengan Java atau C #. Di Python, mekanisme lain digunakan:
Di sini, tidak ada kelas yang mengimplementasikan antarmuka. Python tidak peduli tentang itu, karena
SecretGame
kelas hanya akan mencoba memanggil objek apa pun yang dilewatkan. Jika objek MEMILIKI metode generate (), semuanya baik-baik saja. Jika tidak: KAPUTT! Kesalahan ini tidak akan terlihat pada waktu kompilasi, tetapi pada waktu proses, jadi mungkin saat program Anda sudah diterapkan dan dijalankan. C # akan memberi tahu Anda jauh sebelum Anda mendekati itu.Alasan mekanisme ini digunakan, dinyatakan secara naif, karena dalam bahasa OO secara alami berfungsi bukan warga negara kelas satu. Seperti yang Anda lihat,
KnownNumber
danSecretNumber
berisi HANYA fungsi untuk menghasilkan angka. Seseorang tidak benar-benar membutuhkan kelas sama sekali. Dengan Python, oleh karena itu, seseorang bisa membuangnya dan memilih fungsinya sendiri:Lambda hanyalah sebuah fungsi, yang dideklarasikan "sejalan, saat Anda pergi". Delegasi sama saja di C #:
Catatan tambahan: Contoh terakhir tidak mungkin seperti ini hingga Java 7. Di sana, Antarmuka adalah satu-satunya cara Anda untuk menentukan perilaku ini. Namun, Java 8 memperkenalkan ekspresi lambda sehingga contoh C # dapat dikonversi ke Java dengan sangat mudah (
Func<int>
menjadijava.util.function.IntSupplier
dan=>
menjadi->
).sumber
Secara teknis, saya akan mendeskripsikan antarmuka sebagai sekumpulan cara (metode, properti, pengakses ... kosakata bergantung pada bahasa yang Anda gunakan) untuk berinteraksi dengan suatu objek. Jika suatu objek mendukung / mengimplementasikan antarmuka, maka Anda dapat menggunakan semua cara yang ditentukan dalam antarmuka untuk berinteraksi dengan objek ini.
Secara semantik, sebuah antarmuka juga dapat berisi konvensi tentang apa yang mungkin atau tidak boleh Anda lakukan (misalnya, urutan pemanggilan metode) dan tentang apa, sebagai gantinya, Anda dapat berasumsi tentang status objek mengingat bagaimana Anda berinteraksi demikian. jauh.
sumber
Secara pribadi saya melihat antarmuka seperti template. Jika sebuah antarmuka berisi definisi untuk metode foo () dan bar (), maka Anda tahu setiap kelas yang menggunakan antarmuka ini memiliki metode foo () dan bar ().
sumber
Mari kita anggap seorang Pria (Pengguna atau Objek) menginginkan beberapa pekerjaan diselesaikan. Dia akan menghubungi perantara (Interface) yang akan membuat kontrak dengan perusahaan (objek dunia nyata yang dibuat menggunakan kelas yang diimplementasikan). Beberapa jenis pekerjaan akan ditentukan olehnya, perusahaan mana yang akan melaksanakan dan memberinya hasil. Setiap perusahaan akan melaksanakan pekerjaan dengan caranya sendiri-sendiri tetapi hasilnya akan sama. Seperti ini, Pengguna akan menyelesaikan pekerjaannya menggunakan satu antarmuka. Saya pikir Antarmuka akan bertindak sebagai bagian yang terlihat dari sistem dengan beberapa perintah yang akan ditentukan secara internal oleh sub sistem yang menerapkan dalam.
sumber
Antarmuka memisahkan operasi pada kelas dari implementasi di dalamnya. Jadi, beberapa implementasi mungkin menyediakan banyak antarmuka.
Orang biasanya akan menggambarkannya sebagai "kontrak" untuk apa yang harus tersedia dalam metode kelas.
Ini sama sekali bukan cetak biru, karena itu juga akan menentukan implementasi. Definisi kelas penuh dapat dikatakan sebagai cetak biru.
sumber
Antarmuka mendefinisikan apa yang harus diterapkan oleh kelas yang mewarisi darinya. Dengan cara ini, beberapa kelas dapat mewarisi dari sebuah antarmuka, dan karena pewarisan itu, Anda bisa
untuk info lebih lanjut, lihat http://msdn.microsoft.com/en-us/library/ms173156.aspx ini
sumber
Menurut pendapat saya, antarmuka memiliki arti yang lebih luas daripada yang biasanya diasosiasikan dengannya di Jawa. Saya akan mendefinisikan "antarmuka" sebagai satu set operasi yang tersedia dengan beberapa fungsi umum, yang memungkinkan pengendalian / pemantauan modul.
Dalam definisi ini saya mencoba untuk mencakup kedua antarmuka programatik, di mana klien adalah beberapa modul, dan antarmuka manusia (GUI misalnya).
Seperti yang telah dikatakan orang lain, antarmuka selalu memiliki beberapa kontrak di belakangnya, dalam hal input dan output. Antarmuka tidak menjanjikan apapun tentang "bagaimana" dari operasi; itu hanya menjamin beberapa properti dari hasil, mengingat keadaan saat ini, operasi yang dipilih dan parameternya.
sumber
Seperti di atas, sinonim dari "kontrak" dan "protokol" adalah tepat.
Antarmuka terdiri dari metode dan properti yang diharapkan untuk diekspos oleh kelas.
Jadi jika sebuah kelas
Cheetos Bag
mengimplementasikanChip Bag
antarmuka, Anda harus mengharapkan aCheetos Bag
berperilaku persis seperti yang lainChip Bag
. (Yaitu, paparkan.attemptToOpenWithoutSpillingEverywhere()
metode, dll.)sumber
Definisi Konvensional - Antarmuka adalah kontrak yang menentukan metode yang perlu diterapkan oleh kelas yang mengimplementasikannya.
Definisi Antarmuka telah berubah seiring waktu. Apakah menurut Anda Interface hanya memiliki deklarasi metode saja? Bagaimana dengan variabel final statis dan bagaimana dengan definisi default setelah Java 5.
Antarmuka diperkenalkan ke Java karena masalah Diamond dengan banyak Warisan dan itulah yang sebenarnya ingin mereka lakukan.
Antarmuka adalah konstruksi yang dibuat untuk mengatasi masalah warisan berganda dan dapat memiliki metode abstrak, definisi default, dan variabel akhir statis.
http://www.quora.com/Why-does-Java-allow-static-final-variables-in-interfaces-when-they-are-only-intended-to-be-contracts
sumber
Batas tempat dua sistem berkomunikasi.
Antarmuka adalah bagaimana beberapa bahasa OO mencapai polimorfisme ad hoc . Polimorfisme ad hoc adalah fungsi sederhana dengan nama yang sama yang beroperasi pada jenis yang berbeda.
sumber
Singkatnya, Masalah dasar yang coba dipecahkan oleh sebuah antarmuka adalah memisahkan bagaimana kita menggunakan sesuatu dari bagaimana implementasinya. Tetapi Anda harus mempertimbangkan antarmuka bukan kontrak . Baca lebih lanjut di sini .
sumber