Apa yang dimaksud dengan "antarmuka" dalam pemrograman berorientasi objek

108

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?

Daniel Kivatinos
sumber
1
bukan penipu, tapi ini menjelaskan banyak pertanyaan ini: stackoverflow.com/questions/444245/…
rmeador
Saya akan mengatakan itu adalah kata yang umum, tetapi tetap memiliki arti yang sama bagi saya. Ini seperti dinding untuk entitas tertentu atau yang lebih abstrak yang memberikan beberapa titik masukan ke luar dan memberi mereka keluaran tanpa pengetahuan tentang operasi internal. Saya pikir ini bisa disebut sebagai abstraksi untuk mendefinisikan kelas-kelas yang lebih rendah ke tingkat yang lebih tinggi di OOP.
ikbal

Jawaban:

179

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.

Uri
sumber
Saya membaca buku tentang Objective-C dan menurut saya penulisnya menggunakan istilah "protokol" dan "antarmuka" secara bergantian. Apakah benar untuk mengatakan bahwa "protokol" dan "antarmuka" adalah hal yang sama atau saya melewatkan sesuatu?
Fazzolini
1
Saya tidak akan menggunakan kata "protokol" untuk "antarmuka". Kata "protokol" menyiratkan tingkat detail tentang bagaimana tindakan dilakukan. "Interface" benar-benar kata yang sangat bagus dengan definisi bahasa Inggris murni yang secara ketat menjelaskan apa itu.
OCDev
Dalam antarmuka pemrograman Windows digunakan cukup luas, bahkan di C ++ Anda dapat bertemu "antarmuka" dengan cara objek yang dipisahkan dari implementasi.
Victoria
166

Pertimbangkan situasi berikut:

Anda berada di tengah ruangan besar dan kosong, ketika zombie tiba-tiba menyerang Anda.

Anda tidak memiliki senjata.

Untungnya, ada seorang manusia yang berdiri di ambang pintu kamar.

"Cepat!" Anda berteriak padanya. "Lemparkan aku sesuatu yang bisa aku gunakan untuk memukul zombie!"

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 ..."

Yehuda Shapira
sumber
13
Sebenarnya, bantal masih bisa digunakan. Anda bisa memukul zombie dengan itu. Bash otak zombie keluar ... baik itu pertanyaan kinerja, yang tidak pernah menjadi bagian dari antarmuka.
meustrus
35

Antarmuka adalah kontrak yang harus Anda patuhi atau berikan, tergantung apakah Anda pelaksana atau pengguna.

Eugene Kuleshov
sumber
1
Saya sebenarnya tidak suka istilah kontrak yang tidak memenuhi syarat di sini, karena kontrak sering kali mengandung makna semantik atau perilaku (seperti dalam desain demi kontrak). Tidak semua antarmuka menyiratkan semantik atau perilaku apa pun. Misalnya, "lubang di dinding" adalah antarmuka dunia nyata. Apakah Anda menganggap ini sebagai jendela atau sebagai tempat pembuangan sampah atau apapun adalah interpretasi Anda.
Uri
3
Benar. Antarmuka adalah "kontrak tanda tangan metode", yang berarti ia menjamin untuk mengimplementasikan metode yang diberikan. Tidak ada jaminan apakah itu dilakukan dengan cara tertentu.
Erik Funkenbusch
Tepatnya, Anda harus memberi penjelasan lebih banyak tentang definisi ini. Tetapi antarmuka adalah kontrak antara dua bagian. Kode dengan kontrak .... +1
matiasnj
18

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.

Dave Costa
sumber
1
Saya yakin pemohon bertanya apa itu definisi dan bukan apa yang bukan. :)
Eugene Kuleshov
7

Bagi saya antarmuka adalah cetak biru sebuah kelas, apakah ini definisi terbaik?

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.

Stephen C
sumber
6

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:

using System;

public interface IGenerate
{
    int Generate();
}

// Dependencies
public class KnownNumber : IGenerate
{
    public int Generate() 
    {
        return 5;
    }   
}

public class SecretNumber : IGenerate
{
    public int Generate()
    {
        return new Random().Next(0, 10);
    }
}

// What you care about
class Game
{
    public Game(IGenerate generator) 
    {
        Console.WriteLine(generator.Generate())
    }
}

new Game(new SecretNumber());
new Game(new KnownNumber());

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:

import random

# Dependencies
class KnownNumber(object):
    def generate(self):
        return 5

class SecretNumber(object):
    def generate(self):
        return random.randint(0,10)

# What you care about
class SecretGame(object):
    def __init__(self, number_generator):
        number = number_generator.generate()
        print number

Di sini, tidak ada kelas yang mengimplementasikan antarmuka. Python tidak peduli tentang itu, karena SecretGamekelas 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, KnownNumberdan SecretNumberberisi 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:

# OO Approach
SecretGame(SecretNumber())
SecretGame(KnownNumber())

# Functional Approach

# Dependencies
class SecretGame(object):
    def __init__(self, generate):
        number =  generate()
        print number

SecretGame(lambda: random.randint(0,10))
SecretGame(lambda: 5)

Lambda hanyalah sebuah fungsi, yang dideklarasikan "sejalan, saat Anda pergi". Delegasi sama saja di C #:

class Game
{
    public Game(Func<int> generate) 
    {
        Console.WriteLine(generate())
    }
}    

new Game(() => 5);
new Game(() => new Random().Next(0, 10));

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>menjadi java.util.function.IntSupplierdan =>menjadi ->).

cessor
sumber
4

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.

Ghislain Fourny
sumber
2

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 ().

Thomas Winsnes
sumber
2

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.

Arun N
sumber
1

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.

Anak anjing
sumber
1

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

  • pastikan bahwa semua anggota antarmuka diimplementasikan dalam kelas turunan (meskipun hanya untuk membuat pengecualian)
  • Mengabstraksi kelas itu sendiri dari pemanggil (mentransmisikan instance kelas ke antarmuka, dan berinteraksi dengannya tanpa perlu mengetahui apa kelas turunan aktual IS)

untuk info lebih lanjut, lihat http://msdn.microsoft.com/en-us/library/ms173156.aspx ini

Greg Olmstead
sumber
1

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.

Eyal Schneider
sumber
1

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 Bagmengimplementasikan Chip Bagantarmuka, Anda harus mengharapkan a Cheetos Bagberperilaku persis seperti yang lain Chip Bag. (Yaitu, paparkan .attemptToOpenWithoutSpillingEverywhere()metode, dll.)

wlangstroth.dll
sumber
1

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

Vivek Vermani
sumber
0

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 .

Alireza Rahmani Khalili
sumber