Ketika struktur data (misalnya, antrian) ini diimplementasikan menggunakan bahasa OOP, beberapa anggota dari struktur data harus pribadi (misalnya, jumlah item dalam antrian).
Antrian juga dapat diimplementasikan pada bahasa prosedural yang menggunakan struct
dan satu set fungsi yang beroperasi di struct
. Namun, dalam sebuah bahasa prosedural anda dapat't membuat anggota struct
pribadi. Adalah anggota dari struktur data yang diimplementasikan dalam sebuah bahasa prosedural kiri publik, atau ada beberapa trik untuk membuat mereka pribadi?
OOP tidak menciptakan enkapsulasi dan tidak identik dengan enkapsulasi. Banyak OOP bahasa tidak memiliki C++/Java gaya access modifier. Banyak non-OOP bahasa memiliki berbagai teknik yang tersedia untuk menawarkan enkapsulasi.
Salah satu pendekatan klasik untuk enkapsulasi adalah penutup, seperti yang digunakan di pemrograman fungsional. Hal ini secara signifikan lebih tua dari OOP tetapi dalam cara yang setara. E. g. di JavaScript kita bisa membuat objek seperti ini:
function Adder(x) {
this.add = function add(y) {
return x + y;
}
}
var plus2 = new Adder(2);
plus2.add(7); //=> 9
Di atas plus2
objek tidak memiliki anggota yang akan memungkinkan akses langsung ke x
– it's seluruhnya dikemas. Add()
metode adalah penutupan atas x
variabel.
The C bahasa mendukung beberapa jenis enkapsulasi melalui header file mekanisme, terutama buram pointer teknik. Dalam C, adalah mungkin untuk mendeklarasikan struct nama tanpa mendefinisikan anggotanya. Pada saat itu tidak ada variabel dari tipe struct yang dapat digunakan, tetapi kita dapat menggunakan pointer ke struct yang bebas (karena ukuran struct pointer diketahui pada waktu kompilasi). Misalnya, pertimbangkan ini file header:
#ifndef ADDER_H
#define ADDER_H
typedef struct AdderImpl *Adder;
Adder Adder_new(int x);
void Adder_free(Adder self);
int Adder_add(Adder self, int y);
#endif
Sekarang kita dapat menulis kode yang menggunakan Adder antarmuka, tanpa memiliki akses ke bidang-bidang, misalnya:
Adder plus2 = Adder_new(2);
if (!plus2) abort();
printf("%d\n", Adder_add(plus2, 7)); /* => 9 */
Adder_free(plus2);
Dan di sini akan menjadi benar-benar dikemas rincian pelaksanaan:
#include "adder.h"
struct AdderImpl { int x; };
Adder Adder_new(int x) {
Adder self = malloc(sizeof *self);
if (!self) return NULL;
self->x = x;
return self;
}
void Adder_free(Adder self) {
free(self);
}
int Adder_add(Adder self, int y) {
return self->x + y;
}
Ada juga kelas modular bahasa pemrograman, yang berfokus pada modul-level interface. ML keluarga bahasa incl. OCaml mencakup suatu pendekatan yang menarik untuk modul yang disebut functors. OOP dibayangi dan sebagian besar dimasukkan pemrograman modular, namun banyak diakui keuntungan dari OOP yang lebih tentang modularitas dari orientasi objek.
Ada's juga pengamatan bahwa kelas-kelas dalam bahasa OOP seperti C++ atau Java sering tidak digunakan untuk objects (dalam arti badan yang menyelesaikan operasi melalui ikatan/dinamis pengiriman) tapi hanya untuk abstract data types (di mana kita mendefinisikan sebuah antarmuka publik yang menyembunyikan rincian implementasi internal). Kertas On Pengertian Abstraksi Data, Revisited (Memasak, 2009) membahas perbedaan ini secara lebih rinci.
Tapi ya, banyak bahasa yang tidak memiliki enkapsulasi mekanisme apapun. Dalam bahasa ini, struktur anggota yang tersisa publik. Paling tidak, akan ada konvensi penamaan mengecilkan digunakan. E. g. Saya pikir Pascal tidak berguna enkapsulasi mekanisme.
Pertama, yang prosedural versus berorientasi objek tidak ada hubungannya dengan publik vs swasta. Banyak berorientasi objek bahasa yang tidak memiliki gagasan tentang kontrol akses.
Kedua, dalam "C" - yang kebanyakan orang sebut prosedural, dan tidak berorientasi objek, ada banyak trik yang dapat anda gunakan untuk secara efektif membuat hal-hal pribadi. Yang sangat umum adalah dengan menggunakan buram (misalnya void*) pointer. Atau anda dapat meneruskan menyatakan suatu objek, dan hanya tidak menentukan dalam file header.
foo.h:
struct queue;
struct queue* makeQueue();
void add2Queue(struct queue* q, int value);
...
foo.c:
struct queue {
int* head;
int* head;
};
struct queue* makeQueue() { .... }
void add2Queue(struct queue* q, int value) { ... }
Terlihat di windows SDK! Menggunakan PEGANGAN dan UINT_PTR, dan hal-hal seperti itu untuk menjadi generik untuk menangani memory yang digunakan di Api - efektif membuat implementasi swasta.
"Buram data jenis" adalah sebuah konsep terkenal ketika saya melakukan gelar ilmu komputer 30 tahun yang lalu. Kita tidak menutupi OOP seperti itu tidak dalam penggunaan umum pada waktu dan "pemrograman fungsional" dianggap lebih benar.
Modula-2 memiliki dukungan langsung bagi mereka, melihat https://www.modula2.org/reference/modules.php.
Hal ini telah dijelaskan oleh Lewis Pringle bagaimana ke depan mendeklarasikan struct dapat digunakan dalam C. tidak Seperti Modul-2, pabrik fungsi yang harus disediakan untuk membuat objek. (Virtual metode ini juga mudah untuk diimplementasikan dalam C dengan memiliki anggota pertama dari struct menjadi pointer ke struct lain yang terkandung fungsi pointer ke metode.)
Sering konvensi juga digunakan. Misalnya, bidang apapun mulai dengan "_" tidak boleh diakses di luar dari file yang dimiliki data. Ini adalah mudah ditegakkan oleh penciptaan kustom memeriksa alat-alat.
Setiap proyek skala besar yang saya telah bekerja pada, (sebelum saya pindah ke C++ maka C#) memiliki sistem di tempat untuk mencegah "swasta" data yang sedang diakses oleh kode yang salah. Itu hanya sedikit kurang terstandarisasi daripada sekarang.
Catatan ada banyak OO bahasa tanpa built-in kemampuan untuk menandai anggota pribadi. Hal ini dapat dilakukan dengan konvensi, tanpa perlu untuk compiler untuk menegakkan privasi. Misalnya, orang-orang akan sering awalan pribadi variabel dengan garis bawah.
Ada teknik untuk membuat lebih sulit untuk akses "swasta" variabel, yang paling umum menjadi PIMPL idiom. Hal ini menempatkan anda pribadi variabel terpisah struct, dengan hanya pointer yang dialokasikan di semua file-file header. Ini berarti tambahan dereference dan cast untuk mendapatkan setiap pribadi variabel, sesuatu seperti ((private_impl)(obj->pribadi))->actual_value
, yang akan mengganggu, sehingga dalam praktiknya jarang digunakan.
Struktur Data didn't memiliki "anggota", hanya bidang data (dengan asumsi itu adalah rekor jenis). Visibilitas biasanya ditetapkan untuk seluruh jenis. Namun, yang mungkin tidak akan membatasi seperti yang anda pikirkan, karena fungsi tidak't bagian dari record.
Let's drop kembali dan mendapatkan sedikit sejarah di sini...
Dominan paradigma pemrograman sebelum OOP disebut pemrograman terstruktur. Awal tujuan utama dari ini adalah untuk menghindari penggunaan yang tidak terstruktur melompat pernyataan ("goto"s). Ini adalah pengendalian aliran yang berorientasi pada paradigma (sementara OOP lebih data-oriented), tetapi itu masih merupakan perpanjangan alami dari itu untuk mencoba untuk menjaga data logis terstruktur seperti kode.
Lain outshoot dari pemrograman terstruktur adalah menyembunyikan informasi, gagasan bahwa implementasi kode's struktur (yang kemungkinan perubahan yang cukup sering) harus disimpan terpisah dari antarmuka (yang idealnya tidak't perubahan, hampir sama banyak). It's dogma sekarang, tapi di masa lalu, banyak orang-orang yang benar-benar dianggap baik untuk setiap pengembang untuk mendapatkan untuk mengetahui rincian dari seluruh sistem, jadi ini adalah pada satu waktu benar-benar ide yang kontroversial. Edisi asli dari Brook's Mitos Orang Bulan benar-benar menentang menyembunyikan informasi.
Kemudian bahasa pemrograman yang dirancang secara eksplisit untuk menjadi baik Terstruktur bahasa Pemrograman (misalnya, Modula-2 dan Ada) umumnya menyertakan informasi bersembunyi sebagai konsep dasar, dibangun di sekitar beberapa jenis konsep yang kohesif fasilitas dari fungsi-fungsi (dan setiap tipe, konstanta, dan benda-benda yang mereka mungkin diperlukan). Di Modula-2 ini disebut "Modul", di Ada "Paket". Banyak modern OOP bahasa panggilan konsep yang sama "namespaces". Namespaces ini adalah organisasi yayasan pembangunan dalam bahasa-bahasa ini, dan untuk sebagian besar tujuan dapat digunakan pula untuk OOP kelas (dengan tidak ada dukungan nyata untuk warisan, tentu saja).
Jadi di Modula-2 dan Ada (83) anda bisa menyatakan apapun rutin, tipe, konstanta, atau objek dalam sebuah namespace pribadi atau umum, tetapi jika anda memiliki jenis catatan, tidak ada (mudah) cara untuk menyatakan beberapa catatan bidang publik dan lain-lain pribadi. Baik anda seluruh catatan publik, atau's tidak.
Dalam C anda sudah bisa lulus sekitar pointer dideklarasikan tapi tidak terdefinisi jenis seperti yang orang lain telah mengatakan, pada dasarnya membatasi akses ke semua bidang.
Anda juga dapat memiliki pribadi dan umum fungsi pada modul ke modul dasar. Fungsi menyatakan statis dalam file sumber tidak terlihat pada bagian eksterior, bahkan jika anda mencoba untuk menebak nama mereka. Demikian pula, anda dapat memiliki file statis tingkat variabel global, yang umumnya praktek yang buruk tetapi memungkinkan isolasi pada modul dasar.
It's mungkin penting untuk menekankan bahwa pembatasan akses sebagai standar konvensi daripada bahasa ditegakkan membangun bekerja dengan baik (lihat Python). Di atas semua itu, membatasi akses ke objek bidang ini hanya akan melindungi programmer ketika ada kebutuhan untuk mengubah nilai data dalam sebuah objek setelah penciptaan. Yang sudah kode bau. Bisa dibilang, C's dan khususnya C++'s const
kata kunci untuk metode dan argumen fungsi yang jauh lebih besar membantu untuk programmer dari Jawa's agak miskin final
.
Jika anda definisi Umum adalah kemampuan untuk implementasi akses dan data/properti melalui kode anda sendiri pada setiap titik, jawabannya adalah: Ya. Namun, itu disarikan oleh beragam sarana - tergantung pada bahasa.
Saya berharap ini ringkas menjawab pertanyaan anda.
Berikut ini adalah counter sederhana-contoh: di Jawa, interface ini mendefinisikan objek, tetapi
kelas dia tidak. Kelas
mendefinisikan sebuah Tipe Data Abstrak, bukan obyek.
Jadi, setiap kali anda menggunakan pribadi
dalam kelas
di pulau Jawa, anda memiliki contoh dari struktur data pribadi anggota-anggota yang tidak berorientasi objek.