Apa manfaat pemrograman berorientasi objek daripada pemrograman prosedural?

77

Saya mencoba memahami perbedaan antara bahasa prosedural seperti C dan bahasa berorientasi objek seperti C ++. Saya tidak pernah menggunakan C ++, tetapi saya telah berdiskusi dengan teman-teman saya tentang cara membedakan keduanya.

Saya telah diberi tahu C ++ memiliki konsep berorientasi objek serta mode publik dan pribadi untuk definisi variabel: hal-hal yang tidak dimiliki C. Saya belum pernah menggunakan ini untuk saat mengembangkan program dalam Visual Basic.NET: apa manfaatnya?

Saya juga telah diberitahu bahwa jika suatu variabel bersifat publik, ia dapat diakses di mana saja, tetapi tidak jelas bagaimana hal itu berbeda dari variabel global dalam bahasa seperti C. Juga tidak jelas bagaimana variabel pribadi berbeda dari variabel lokal.

Hal lain yang saya dengar adalah bahwa, untuk alasan keamanan, jika suatu fungsi perlu diakses, itu harus diwarisi terlebih dahulu. Kasus penggunaannya adalah bahwa seorang administrator hanya boleh memiliki hak sebanyak yang mereka butuhkan dan bukan segalanya, tetapi tampaknya persyaratan juga akan berfungsi:

if ( login == "admin") {
    // invoke the function
}

Mengapa ini tidak ideal?

Mengingat bahwa tampaknya ada cara prosedural untuk melakukan segala sesuatu yang berorientasi objek, mengapa saya harus peduli tentang pemrograman berorientasi objek?

niko
sumber
3
Kemungkinan duplikat: Apa bedanya C dengan C ++? dan Keterbatasan bahasa non-OOP ;
Caleb
11
Peta paradigma pemrograman ini dapat membantu Anda.
Pemrogram
26
+1 untuk melawan beberapa downvotes. Jika seorang rekan kerja mengajukan pertanyaan seperti itu kepada saya, saya mungkin akan memiliki beberapa kekhawatiran dan bahkan mungkin menurunkannya (dengan asumsi ada panah bawah di sebelahnya). Namun, pertanyaan ini tampaknya ditanyakan oleh seorang insinyur perangkat lunak di masa depan dan sepertinya dia menghabiskan waktu memikirkan dan membahas topik tersebut sebelum memposting. Saya memilih untuk membantunya daripada menolak.
DXM
14
@DXM Ide bagus! Downvote / panah upvote mengambang di sekitar rekan kerja ... Itu akan bekerja keajaiban.
yannis
2
Argumen kontra standar: Ada juga cara assembler untuk melakukan semua yang dapat Anda lakukan di C, jadi mengapa Anda harus peduli tentang C? (Petunjuk: Ini semua tentang meningkatkan level abstraksi. C ++ berhasil melakukan ini tanpa mengorbankan sebagian besar kecepatan C. IMO itulah alasan utama kesuksesan C ++.)
sbi

Jawaban:

135

Semua jawaban sejauh ini berfokus pada topik pertanyaan Anda sebagaimana dinyatakan, yaitu "apa perbedaan antara c dan c ++". Pada kenyataannya, sepertinya Anda tahu apa perbedaannya, Anda hanya tidak mengerti mengapa Anda membutuhkan perbedaan itu. Maka, jawaban lain berusaha menjelaskan OO dan enkapsulasi.

Saya ingin menjawab dengan jawaban lain, karena berdasarkan perincian pertanyaan Anda, saya yakin Anda perlu mengambil beberapa langkah kembali.

Anda tidak mengerti tujuan C ++ atau OO, karena bagi Anda, tampaknya aplikasi Anda hanya perlu menyimpan data. Data ini disimpan dalam variabel. "Mengapa saya ingin membuat variabel tidak dapat diakses? Sekarang saya tidak dapat mengaksesnya lagi! Dengan membuat semuanya menjadi publik, atau lebih baik secara global, saya dapat membaca data dari mana saja dan tidak ada masalah." - Dan Anda benar, berdasarkan skala proyek yang sedang Anda tulis, mungkin tidak banyak masalah (atau ada, tetapi Anda belum menyadarinya).

Saya pikir pertanyaan mendasar yang benar-benar perlu Anda jawab adalah: "Mengapa saya ingin menyembunyikan data? Jika saya melakukan itu, saya tidak bisa mengatasinya!" Dan inilah sebabnya:

Katakanlah Anda memulai proyek baru, Anda membuka editor teks Anda dan Anda mulai menulis fungsi. Setiap kali Anda perlu menyimpan sesuatu (untuk mengingatnya nanti), Anda membuat variabel. Untuk mempermudah, Anda membuat variabel Anda mendunia. Versi pertama aplikasi Anda berjalan sangat baik. Sekarang Anda mulai menambahkan lebih banyak fitur. Anda memiliki lebih banyak fungsi, data tertentu yang Anda simpan sebelumnya perlu dibaca dari kode baru Anda. Variabel lain perlu dimodifikasi. Anda terus menulis lebih banyak fungsi. Apa yang mungkin Anda perhatikan (atau, jika tidak, Anda benar-benar akan melihat di masa depan) adalah, karena kode Anda semakin besar, Anda butuh waktu lebih lama untuk menambahkan fitur berikutnya. Dan saat kode Anda semakin besar, semakin sulit untuk menambahkan fitur tanpa merusak sesuatu yang dulu berfungsi. Mengapa? Karena kamu perlu mengingat semuanyavariabel global Anda disimpan dan Anda harus mengingat di mana semuanya sedang dimodifikasi. Dan Anda perlu mengingat fungsi mana yang boleh memanggil dalam urutan yang tepat dan jika Anda memanggilnya dalam urutan yang berbeda , Anda mungkin mendapatkan kesalahan karena variabel global Anda belum cukup valid. Apakah Anda pernah mengalami ini?

Seberapa besar proyek khas Anda (garis kode)? Sekarang pencitraan proyek 5000 hingga 50.000 kali lebih besar dari proyek Anda. Juga, ada beberapa orang yang bekerja di dalamnya. Bagaimana semua orang di tim dapat mengingat (atau bahkan menyadari) apa yang dilakukan semua variabel itu?

Apa yang saya jelaskan di atas adalah contoh kode yang digabungkan dengan sempurna. Dan sejak awal waktu (dengan asumsi waktu mulai 1 Januari 1970), manusia telah mencari cara untuk menghindari masalah ini. Cara Anda menghindarinya adalah dengan memecah kode Anda menjadi sistem, subsistem, dan komponen dan membatasi berapa banyak fungsi yang memiliki akses ke bagian data apa pun. Jika saya memiliki 5 bilangan bulat dan sebuah string yang mewakili semacam keadaan, apakah akan lebih mudah bagi saya untuk bekerja dengan keadaan ini jika hanya 5 fungsi yang mengatur / mendapatkan nilai? atau jika 100 fungsi mengatur / mendapatkan nilai yang sama? Bahkan tanpa bahasa OO (yaitu C), orang-orang telah bekerja keras untuk mengisolasi data dari data lain dan menciptakan batas pemisahan yang bersih antara berbagai bagian kode. Ketika proyek mencapai ukuran tertentu, kemudahan pemrograman menjadi tidak, "bisakah saya mengakses variabel X dari fungsi Y",

Inilah sebabnya mengapa konsep OO telah diperkenalkan dan inilah mengapa mereka begitu kuat. Mereka memungkinkan Anda untuk menyembunyikan data dari diri Anda sendiri dan Anda ingin melakukannya dengan sengaja, karena semakin sedikit kode yang melihat data itu, semakin sedikit kesempatan ada, bahwa ketika Anda menambahkan fitur berikutnya, Anda akan merusak sesuatu. Ini adalah tujuan utama untuk konsep enkapsulasi dan pemrograman OO. Mereka memungkinkan Anda untuk memecah sistem / subsistem kami menjadi kotak yang lebih terperinci, ke titik di mana, tidak peduli seberapa besar keseluruhan proyek, sekumpulan variabel tertentu hanya dapat diakses oleh 50-200 baris kode dan hanya itu! Jelas ada jauh lebih banyak untuk pemrograman OO, tetapi, pada dasarnya, inilah sebabnya C ++ memberi Anda pilihan untuk mendeklarasikan data / fungsi sebagai pribadi, dilindungi atau publik.

Ide terbesar kedua dalam OO adalah konsep lapisan abstraksi. Meskipun bahasa prosedural juga dapat memiliki abstraksi, dalam C, seorang programmer harus melakukan upaya sadar untuk membuat lapisan seperti itu, tetapi dalam C ++, ketika Anda mendeklarasikan sebuah kelas, Anda secara otomatis membuat lapisan abstraksi (itu masih terserah Anda apakah abstraksi ini atau tidak) akan menambah atau menghapus nilai). Anda harus membaca / meneliti lebih lanjut tentang lapisan abstraksi dan jika Anda memiliki lebih banyak pertanyaan, saya yakin forum ini akan dengan senang hati menjawabnya juga.

DXM
sumber
5
Jawaban yang bagus, tampaknya mencapai level yang sesuai dengan pertanyaan yang diberikan
Carlos
29
+1 ... sebagian besar untuk, "Dan sejak fajar waktu (dengan asumsi waktu mulai 1 Januari 1970) ..." baris
CaffGeek
4
@Chad - Saya membayangkan garis itu saja harus memberi saya setidaknya satu poin :)
DXM
Ada cara untuk mengatasi masalah skala ini yang Anda bicarakan dalam paradigma prosedural. Ini disebut fungsi. Tapi cara yang bagus untuk menjelaskan masalahnya.
annoying_squid
@DXM - Saya tidak yakin apakah saya mengerti jawabannya dengan benar. Kita dapat mencapai fungsionalitas set / dapatkan yang sama di Pemrograman Prosedural juga. Kita dapat menulis set / mendapatkan fungsi dalam C untuk memodifikasi / mendapatkan variabel global. Menggunakan metode ini juga, kami membatasi jumlah fungsi yang memodifikasi variabel global. Dan bahkan di OOP, jika kita menggunakan metode set / get juga, kita akan menggunakan metode ini dari luar objek untuk mengubah nilai.
kadina
10

Hmm ... mungkin yang terbaik adalah membuat cadangan dan mencoba memberikan beberapa gagasan tentang maksud dasar pemrograman berorientasi objek. Sebagian besar tujuan pemrograman berorientasi objek adalah untuk memungkinkan penciptaan tipe data abstrak. Untuk contoh yang sangat sederhana yang Anda tidak asing lagi, pertimbangkan string. Sebuah string biasanya memiliki buffer untuk menampung konten string, beberapa fungsi yang dapat beroperasi pada string (mencari di dalamnya, mengakses bagian-bagiannya, membuat substring, dll.) Itu juga akan (setidaknya biasanya) memiliki sesuatu untuk melacak panjang string (saat ini), dan (mungkin) ukuran buffer jadi jika (misalnya) Anda menambah ukuran string dari 1 menjadi 10.00000, ia akan tahu kapan perlu lebih banyak memori untuk menahan yang lebih besar konten.

Variabel-variabel tersebut (buffer, panjang saat ini dan ukuran buffer) bersifat pribadi untuk string itu sendiri, tetapi mereka tidak lokal untuk fungsi tertentu. Setiap string memiliki konten dengan panjang tertentu, jadi kita perlu melacak konten / panjang untuk string itu. Sebaliknya, fungsi yang sama (misalnya, untuk mengekstraksi substring) dapat beroperasi pada banyak string berbeda pada waktu yang berbeda, sehingga data tidak dapat lokal ke fungsi individu.

Dengan demikian, kita berakhir dengan beberapa data yang bersifat pribadi untuk string, sehingga hanya (langsung) dapat diakses oleh fungsi string. Dunia luar bisa mendapatkan panjang string menggunakan fungsi string, tetapi tidak perlu tahu apa-apa tentang internal string untuk mendapatkannya. Demikian juga, mungkin memodifikasi string - tetapi sekali lagi, ia melakukannya melalui fungsi string, dan hanya mereka yang secara langsung memodifikasi variabel-variabel lokal ke objek string.

Sejauh keamanan berjalan, saya perhatikan bahwa sementara ini masuk akal sebagai analogi, itu bukan cara kerja yang sebenarnya. Secara khusus, akses dalam C ++ secara khusus tidak dimaksudkan untuk memenuhi jenis persyaratan yang sama dengan akses dalam sistem operasi. Sistem operasi seharusnya menerapkan pembatasan sehingga (misalnya) pengguna normal tidak dapat melakukan hal-hal yang disediakan untuk administrator. Sebaliknya, kontrol akses di C ++ hanya dimaksudkan untuk mencegah kecelakaan. Secara desain, siapa pun yang ingin dapat mem-bypass mereka dengan mudah. Mereka berada di urutan yang sama dengan menandai file hanya-baca sehingga Anda tidak sengaja menghapusnya. Jika Anda memutuskan untuk menghapus file, itu sepele untuk mengubahnya dari read-only menjadi read-write; semua pengaturan untuk hanya-baca tidak membuat Anda setidaknya memikirkannya sebentar dan memutuskan untuk menghapus file sehingga tidak akan terhapus secara tidak sengaja hanya dari menekan tombol yang salah pada waktu yang salah.

Jerry Coffin
sumber
6

OOP versus C sebenarnya bukan tentang hal-hal yang telah Anda diskusikan. Ini terutama tentang pengemasan kode ke area yang tidak akan / tidak bisa tidak sengaja (atau kadang-kadang bahkan dengan sengaja) saling mempengaruhi.

C memungkinkan Anda menjalankan fungsi apa pun dari mana saja. OOP mencegahnya dengan mengelompokkan metode ke dalam kelas dan hanya memungkinkan Anda untuk menggunakan metode dengan merujuk kelas yang mengandungnya. Jadi, salah satu keuntungan OOP yang potensial adalah bahwa Anda jauh lebih mungkin memiliki pengaturan kode yang lebih baik tanpa banyak pengalaman untuk memberi tahu Anda bahwa Anda harus melakukannya.

John Fisher
sumber
4
-1. Tidak ada yang eksklusif di C yang membuat semua fungsi global. Anda dapat mendeklarasikan fungsi apa saja yang statis dan dengan demikian membatasi cakupannya ke file lokal. C tidak berbeda dari C ++, Java dll dalam aspek ini. Selain itu, OOP bukan tentang sintaksis bahasa, Anda dapat menulis program OO dalam bahasa C saja, walaupun mereka akan sedikit lebih kasar daripada dalam bahasa dengan dukungan sintaksis untuk OO. Dan sebaliknya: Anda tidak mendapatkan OOP hanya karena Anda memilih bahasa yang mendukung OO. Orientasi objek adalah gaya pemrograman , bukan fitur bahasa.
@Lundin: Meskipun secara teknis Anda benar, Anda telah melewatkan intinya. Bahasa OOP menjadikannya perilaku standar untuk berperilaku dengan cara OOP. C tidak.
John Fisher
1
Tidak ada dalam bahasa OO yang memaksa Anda melakukan itu. Sebagai contoh, saya telah melihat banyak program C ++ yang tidak jelas tanpa menyebutkan nilai OO. Demikian pula, jika Anda tidak memiliki petunjuk tentang OO tetapi mencoba menerapkan kelas, warisan dll, ada sekitar 100% peluang untuk membuat program yang kacau.
@Lundin: Saya tidak berpikir C ++ adalah contoh yang adil. Itu (atau setidaknya itu) dimaksudkan untuk dapat mengkompilasi program C tanpa modifikasi (banyak). Menambahkan kelas di atas tidak menjadikannya bahasa OOP pada level C # atau Java, tetapi hal itu memungkinkan pengembangan semacam itu.
John Fisher
Anda dapat menulis program non-OO di Jawa juga, cukup meretas dalam satu file utama besar ... OO masih tidak spesifik bahasa, jika programmer tidak tahu tentang OO, tidak ada bahasa di dunia yang akan menyelamatkan mereka.
4

Kelas yang ditulis dengan baik harus menjadi "pulau kepercayaan" kecil: Anda dapat menggunakannya dan menganggap bahwa itu "hal yang benar" dan bahwa ia melindungi Anda dari perangkap umum. Itu membuat kelas yang bagus sebagai blok bangunan, yang jauh lebih dapat digunakan kembali sebagai sekelompok fungsi dan variabel, yang mungkin bekerja dengan baik tetapi menunjukkan kepada Anda semua nyali jeleknya, dan memaksa Anda untuk memahami bagaimana mereka bekerja bersama, bagaimana mereka perlu diinisialisasi dll. Kelas yang baik harus seperti colokan USB, sedangkan solusi prosedural seperti sekelompok kabel, keripik, timah dan sedikit solder.

Satu hal yang tidak dibahas secara mendalam adalah aspek antarmuka / implementasi. Antarmuka menggambarkan perilaku, tetapi bukan realisasinya. Jadi daftar antarmuka menggambarkan konsep tersebutdaftar dan perilakunya: Anda akan mengharapkan hal-hal seperti menambahkan, menghapus dan metode ukuran. Sekarang ada banyak cara berbeda untuk mengimplementasikan daftar ini, misalnya sebagai daftar tertaut atau menggunakan buffer array. Kekuatan dari pemrograman OO adalah bahwa dengan menggunakan antarmuka Anda dapat alasan tentang perilaku tanpa mengetahui tentang implementasinya. Mengakses variabel atau metode internal akan menghancurkan abstraksi ini, Anda tidak bisa mengganti satu implementasi daftar dengan yang lain, dan Anda tidak bisa meningkatkan implementasi yang ada tanpa menyentuh kode menggunakan kelas. Itulah salah satu alasan utama mengapa variabel dan metode pribadi diperlukan: Untuk melindungi detail internal dari implementasi, sehingga abstraksi tetap utuh.

OO bahkan melangkah lebih jauh: Misalnya untuk perpustakaan Anda dapat mendefinisikan antarmuka untuk hal-hal yang bahkan belum ada , dan menulis kode yang berfungsi dengan antarmuka itu. Pengguna dapat menulis kelas yang mengimplementasikan antarmuka, dan menggunakan layanan yang disediakan oleh perpustakaan. Ini memungkinkan tingkat fleksibilitas yang tidak mungkin dengan pemrograman prosedural.

Landei
sumber
Konsep antarmuka tidak unik untuk bahasa berorientasi objek. Faktor yang lebih besar, saya pikir, adalah bahwa dalam bahasa non-OOP hampir semua fungsi yang digunakan dalam modul harus dimiliki oleh namespace global yang sama. Ini mensyaratkan bahwa salah satu nama fungsi awalan untuk menunjukkan apa yang ditindaklanjuti, atau memiliki banyak metode terdengar serupa yang melakukan hal-hal yang sama sekali berbeda (misalnya SetLocationdapat digunakan untuk memindahkan Monster, sementara SetPositionmungkin memindahkan PopupWindow, dan Movemungkin digunakan untuk menyesuaikan posisi dari a DisplayCursor). Mencoba menemukan metode "langkah" yang tepat ...
supercat
... dapat dibuat lebih mudah jika ketika seseorang menulis MyMonstor->editor hanya memperlihatkan daftar metode yang dapat diterapkan pada hal-hal yang bertipe Monster. Jika ada banyak lusinan hal yang berbeda, masing-masing mendukung sekitar selusin operasi, mengurangi jumlah kekacauan dalam daftar metode hingga 90% dapat sangat mengurangi produktivitas.
supercat
Bentrok nama @supercat adalah masalah bahasa bukan masalah non-OOP. Di sisi lain ruang nama bermasalah karena kompiler pada dasarnya perlu mengubah nama fungsi secara otomatis atau memotongnya. Jadi mengapa tidak melakukannya secara manual?
annoying_squid
@annoying_squid: Apa yang disediakan OOP adalah kemampuan untuk secara efektif menggunakan jenis argumen utama funciton untuk memilih namespace. Jika saya memiliki variabel ittipe SuperFancyWhizBang, menjalankan salah satu SuperFancyWhizBangmetode di ittidak memerlukan penulisan tipe SuperFancyWhizBang; pepatah it.woozle()akan mengarahkan kompiler untuk secara otomatis mencari di woozledalam SuperFancyWhizBang.
supercat
3

Ada cara untuk melakukan semuanya dengan mesin Turing, atau setidaknya dalam bahasa assembly untuk kode mesin yang akhirnya dikompilasi oleh program C atau C ++.

Jadi perbedaannya bukan tentang apa yang bisa dilakukan kode, tetapi tentang apa yang bisa dilakukan orang.

Orang-orang membuat kesalahan. Banyak.

OOP memperkenalkan paradigma dan sintaksis yang membantu mengurangi ukuran dan kemungkinan kepadatan ruang dari kemungkinan kesalahan pengkodean manusia. Kadang-kadang dengan membuat kesalahan ilegal untuk kelas objek data tertentu (seperti itu bukan metode yang dideklarasikan untuk objek itu). Kadang-kadang dengan membuat kesalahan lebih verbose, atau terlihat aneh secara gaya dibandingkan dengan penggunaan bahasa secara kanonik. Kadang-kadang dengan membutuhkan antarmuka dengan penggunaan yang jauh lebih tidak mungkin atau terjerat (publik vs swasta). dll.

Semakin besar proyek, semakin tinggi kemungkinan kesalahan. Yang mana pembuat kode baru mungkin tidak terpapar jika hanya berpengalaman dengan program kecil. Dengan demikian potensi kebingungan mengapa OOP berharga.

hotpaw2
sumber
2

Pertanyaan Anda tampaknya lebih tentang tujuan OOP daripada perbedaannya. Konsep dalam posting Anda adalah Enkapsulasi; dan enkapsulasi ada untuk mendukung CHANGE. Ketika kelas-kelas lain mengakses internal Anda, menjadi sulit untuk memodifikasinya tanpa merusaknya. Di OOP Anda menyediakan antarmuka (anggota publik) di mana Anda memungkinkan kelas lain untuk berinteraksi dengan Anda, dan Anda menyembunyikan internal Anda sehingga mereka dapat diubah dengan aman.

Eoin Carroll
sumber
Cukup gunakan prototipe fungsi. Itu enkapsulasi.
annoying_squid
2

Tidak masalah di mana saya membaca variabel pribadi tidak dapat diakses sedangkan variabel publik dapat maka mengapa tidak menjadikan publik sebagai global dan privat sebagai lokal apa bedanya? apa penggunaan nyata dari publik dan swasta? tolong jangan katakan itu dapat digunakan oleh semua orang, saya kira mengapa kita tidak menggunakan beberapa kondisi dan melakukan panggilan?

Saya harap Anda tidak pernah menginginkan lebih dari satu string dalam aplikasi Anda. Saya juga berharap bahwa variabel lokal Anda tetap ada di antara panggilan fungsi. Hal-hal ini mungkin sama dalam hal aksesibilitas tetapi dalam hal masa pakai dan penggunaan lainnya? Sama sekali tidak sama.

DeadMG
sumber
1

Seperti yang dikatakan banyak program, setelah dikompilasi, diubah menjadi kode biner dan, karena string biner dapat digunakan untuk mewakili integer, program apa pun pada akhirnya hanyalah angka. Namun mendefinisikan angka yang Anda butuhkan bisa sangat sulit dan itulah sebabnya bahasa pemrograman tingkat tinggi muncul. Bahasa pemrograman hanyalah model kode rakitan yang akhirnya mereka hasilkan. Saya ingin menjelaskan kepada Anda perbedaan antara pemrograman prosedural dan OO melalui makalah yang sangat bagus ini tentang Pemrograman Berorientasi Konteks http://www.jot.fm/issues/issue_2008_03/article4/

seperti yang Anda lihat dari gambar ini, digambarkan dalam makalah, pemrograman Prosedural hanya menyediakan satu dimensi untuk mengaitkan unit komputasi dengan nama. Di sini, panggilan prosedur atau nama dipetakan langsung ke implementasi prosedur. Pada Gambar-a, panggilan m1 tidak meninggalkan pilihan selain doa dari satu-satunya implementasi dari prosedur m1.

Pemrograman berorientasi objek menambahkan dimensi lain untuk resolusi nama ke pemrograman prosedural. Selain nama metode atau prosedur, pengiriman pesan mempertimbangkan penerima pesan ketika mencari metode. Pada Gambar-b kita melihat dua implementasi metode m1. Pemilihan metode yang tepat tidak hanya tergantung pada nama pesan m1, tetapi juga penerima pesan yang sebenarnya, di sini Ry.

Ini memang memungkinkan enkapsulasi dan modularisasi.

masukkan deskripsi gambar di sini

Gambar-c akhirnya tentang pemrograman berorientasi objek memperluas metode berorientasi objek pengiriman oleh dimensi lain.

Semoga ini membantu Anda berpikir di OOP dari perspektif yang berbeda.

Silli
sumber
0

(+1) Mengajukan pertanyaan tentang sesuatu yang tidak Anda mengerti, bagus, bahkan jika itu terdengar konyol.

Perbedaannya adalah Pemrograman Berorientasi Objek & Kelas. "Plain C", berfungsi dengan data & fungsi. "C ++" menambahkan konsep "objek & kelas", ditambah beberapa konsep sekunder terkait.

Namun, saya menganjurkan pengembang untuk mempelajari "Plain C" sebelum "C ++". Atau "Prosedural Pascal" sebelum "Object Pascal".

Banyak pengembang berpikir siswa seharusnya hanya mengajarkan satu hal.

Misalnya, guru lama yang tidak mendapatkan OO, dan hanya mengajar "Plain Structured C".

Atau "hipster" guru yang mengajar hanya OO, tetapi bukan "Plain C", karena "Anda tidak membutuhkannya". Atau keduanya, tanpa mempedulikan perintah mengajar.

Saya agak berpikir, siswa harus diajarkan "Structured Plain C" dan "Object Oriented C (C ++)". Dengan "Plain C", pertama, dan "C ++", nanti.

Di dunia nyata, Anda perlu mempelajari kedua paradigma (ditambah paradigma lain, seperti "fungsional").

Memikirkan program terstruktur sebagai "objek" besar, tunggal, dapat membantu.

Anda juga harus memberi penekanan pada ruang nama ("modul"), dalam kedua bahasa, banyak guru mengabaikannya, tetapi, ini penting.

umlcat
sumber
Ruang nama dan kelebihan beban hanya membuat program lebih sulit untuk dipahami. Itu membuat konteks proses identifikasi sensitif. Ketika Anda melihat foo()di C ++, itu bisa menjadi fungsi global, fungsi di namespace saat ini, fungsi di namespace yang Anda gunakan dengan using, metode, metode yang diwarisi dan jika ada di pemanggilan fungsi: itu bisa di namespace yang dapat diselesaikan dengan pencarian nama berbasis argumen, dan hal yang sama berlaku untuk Java dan C #. Dalam C itu hanya bisa menjadi fungsi statis di file sumber saat ini, atau satu dari header.
Calmarius
Menulis MODULE_Foo () di mana-mana mungkin merupakan kekacauan visual, tetapi setidaknya Anda tahu persis fungsinya.
Calmarius
@Calmarius solusinya, jelas, adalah untuk tidak menyebutkan nama foo .
0

Dalam satu kata, manajemen proyek. Maksud saya adalah bahwa C ++ membantu saya menegakkan aturan tentang bagaimana kode saya digunakan oleh orang lain. Bekerja pada proyek 5,5 juta baris saya menemukan pemrograman berorientasi objek sangat membantu. Keuntungan lain adalah kompiler yang membuat saya (dan orang lain) mengikuti aturan tertentu dan menangkap kesalahan kecil dalam waktu kompilasi. Semua keuntungan teoretis juga ada di sana, tetapi saya hanya ingin fokus pada hal-hal praktis sehari-hari. Setelah semua itu dikompilasi menjadi kode mesin.

Gus
sumber
-1

Pemrograman Berorientasi Objek adalah Pemrograman Prosedural, dengan kotak-kotak.

Dalam PP, Anda memiliki satu kotak, satu keadaan, yang menjadi sangat besar ketika proyek tumbuh, menyebabkan efek samping muncul setiap kali Anda melupakan sedikit dari keadaan besar itu.

Di OO, Anda memiliki banyak kotak, banyak negara bagian, dan seiring proyek bertambah, kotak-kotak itu bertambah sedikit, dan jumlah kotak itu bertambah banyak.

Tetap lebih mudah untuk melihat kotak yang lebih kecil, mudah untuk memiliki ilusi seluruh gambar, tetapi sebenarnya hampir tidak mungkin, karena melihat kelas dan antarmuka menyembunyikan detail implementasi yang dapat memiliki konsekuensi penting.

Dalam pemrograman fungsional, Anda memiliki banyak kotak fungsi, dan memutuskan bahwa setiap fungsi memiliki satu entri (parameter) dan satu jalan keluar (kembali), dengan ketat tidak ada akses lain ke konteks luar.

Karena tidak ada keadaan dan tidak ada efek samping (sesuai desain), Anda dapat dengan aman menganalisis fungsi apa pun secara terpisah dari keseluruhan dan mengetahui 100% bagaimana ia akan berperilaku dalam keadaan apa pun.

Karena Anda meninju kode dengan unit logis yang mewakili tindakan, juga menjadi mungkin untuk hanya memiliki satu kotak per tindakan biasa.

Ini akan mengecilkan kode proyek skala besar apa pun dengan faktor yang sangat besar dibandingkan dengan OOP yang mempromosikan menyembunyikan banyak fungsi analog di seluruh basis kode di kelas yang berbeda.

Ini juga akan mengalahkan PP sejauh ini karena Anda dapat menumbuhkan proyek lebih lama karena tidak ada lagi status XXXXXXXL untuk dilacak.

Singkatnya, PP mungkin merupakan cara paling sederhana untuk mendekati program sederhana dan FP mungkin adalah cara paling sederhana untuk mendekati program yang kompleks.

Jika Anda faktor dalam tujuan menyatukan semua basis kode dan meningkatkan penggunaan kembali kode, FP harus selalu digunakan, karena itu satu-satunya paradigma yang masuk akal pada skala yang sangat besar, serta satu-satunya paradigma yang memiliki usabilitas 100% (Anda dapat cukup salin tempel fungsi dan gunakan di tempat lain, tanpa overhead apa pun).

Dan Anda mendapatkan pengujian unit yang andal 100% secara gratis.

Dan Anda tidak perlu menulis "final statis pribadi of_doom genius awesome string_1".

Dan Anda mendapatkan paralelisme secara gratis.

Morg.
sumber
-3

Perbedaan satu kalimat yang sederhana adalah bahwa C ++ adalah C dengan Kelas. (Walaupun jauh lebih banyak sekarang) Saya tidak mengapa Anda tidak ingin mempelajari perbedaan antara keduanya dengan membaca artikel yang bagus tentang C ++ di Wikipedia .... Artikel ini akan banyak membantu Anda: - C ++ (Wikipedia)

Googling juga tentang masalah ini akan membantu. Meminta orang secara acak untuk menjelaskan ini mungkin sulit. IMHO, orang mengerti lebih baik dengan membaca daripada bertanya pada seseorang

Pankaj Upadhyay
sumber
Saya telah membaca itu tetapi mereka hanya mengatakan di mana mereka digunakan tetapi masih belum menyelesaikan pertanyaan saya.
niko
Saya tidak mengajukan pertanyaan tanpa melakukan upaya apa pun yang saya lakukan di Google tetapi masih tidak dapat memahami perbedaannya sehingga saya bertemu dengan stackoverflow untuk membantu saya dalam hal ini
niko
1
@niko, Anda salah paham di sini. Yang saya maksud adalah bahwa Anda harus mencoba memahami perbedaan antara keduanya dengan membaca. Meminta temanmu itu tidak baik. Karena mereka akan memberikan pemahaman mereka sendiri yang mungkin tidak membuat Anda puas. Tapi, jangan khawatir, ada teman-teman hebat di sini, mereka pasti akan membantu Anda :-)
Pankaj Upadhyay
2
Saya tidak downvote, tetapi sangat tergoda pada "C ++ is C with Classes". Kita yang benar-benar dapat melakukan C ++ bekerja keras mencoba mengeluarkannya dari pikiran orang.
DeadMG
1
@Pankaj: Benar. Ini adalah C dengan Kelas. Sudah pasti bukan C dengan Kelas lagi, dan menyebutnya seperti hampir 30 tahun kedaluwarsa. C ++ telah berjalan jauh sejak saat itu. Orang-orang yang mengkode C ++ sekarang tidak pernah menyebutnya seperti itu. Ini mendorong kebiasaan terburuk dan kesan salah.
DeadMG