Ketika saya membaca beberapa buku teks algoritma, mereka penuh dengan prosedur cerdas untuk beberapa masalah (pengurutan, jalur terpendek) atau beberapa metode umum (algoritma rekursif, membagi dan menaklukkan, pemrograman dinamis ...). Saya menemukan beberapa jejak pemrograman berorientasi objek di sana; (Mengapa mereka lebih berorientasi pada prosedur?).
Kemudian saya berpikir:
- Apa hubungan antara algoritma dan OOP? Apakah mereka dua topik independen?
- Apakah ada beberapa masalah yang hanya dapat dipresentasikan dan diselesaikan oleh OOP?
- Bagaimana OOP dapat membantu algoritma? Atau ke arah mana ia bisa mempengaruhinya?
object-oriented
algorithms
Ahmad
sumber
sumber
Jawaban:
Pertama, mari kita mendefinisikan apa yang kita maksud dengan OOP. Maksud saya terutama adalah:
Sekarang, untuk menjawab pertanyaan Anda:
Iya.
Tidak. OOP utama menawarkan kemudahan dan kemampuan untuk alasan tentang kode untuk programmer. Itu tidak meningkatkan kekuatan ekspresif Anda.
Seperti yang saya katakan di atas. Kedua poin yang saya jelaskan OOP berlaku di sini. Mampu menyembunyikan detail algoritma dan struktur datanya dapat membantu alasan tentang semuanya. Banyak algoritme yang berisi detail yang tidak Anda inginkan agar pengguna dari algoritma itu dipusingkan. Menyembunyikan detail-detail itu sangat membantu.
Kemampuan untuk memiliki perilaku polimorfik juga bagus.
List
didefinisikan sebagai mampu menambah / menghapus / menghapus item di mana saja dalam koleksi. Tetapi ini dapat diimplementasikan sebagai array yang dapat diubah ukurannya, dobel-bertautan atau dobel-bertautan, dll. Memiliki API tunggal untuk banyak implementasi dapat membantu penggunaan kembali.Seperti yang saya katakan, OOP tidak perlu untuk mengimplementasikan suatu algoritma. Juga, banyak algoritma sudah tua dan dibuat ketika OOP masih belum tersebar luas. Jadi itu mungkin juga menjadi hal yang bersejarah.
sumber
Algoritma dan OOP adalah dua istilah yang berbeda, yang hanya memiliki kesamaan, yaitu istilah-istilah CS . Sederhananya - Sebuah algoritma seperti resep memasak : untuk melakukan x Anda memerlukan bahan - bahan berikut dan melakukan langkah 1,2,3,4,5,6 ... maka Anda sudah menyiapkan makanan.
Yang mengatakan, tampaknya alami cocok untuk algortihms akan dijelaskan dalam prosedural cara. Prosedural tidak lain berarti: pertama lakukan x dan kemudian lakukan y .
Masalah umum adalah: »Bagaimana cara mengurutkan satu set x ?«. Solusi yang mudah dipahami adalah
bubble-sort
:Itu adalah deskripsi algoritmik / verbal dari
bubblesort
-algoritma.Di sinilah implementasi prosedural / pseudocode
Itu mudah.
Bagaimana cara rilis ke OOP ? Anda bisa menggunakan algoritma ini untuk menangani koleksi (objek itu sendiri) dari objek :
Contoh dalam Javascript (meskipun tidak ada OO-Lingo bersih , tetapi dengan hampir tidak ada boilerplate dan mudah dimengerti)
Kami memiliki a) koleksi
objects
, b) metode umum untuk koleksi inisort
yang berisi / abstrak menghilangkan algoritma sorting dan c) benda kami Petrus , Paulus dan Mary . Spesifikasi untuk pengurutan ditemukan di sini .Dari apa yang dikatakan, harus jelas, jawabannya harus: ya, mereka independen.
OOP hanyalah satu gaya pemrograman. Itu tidak bisa membantu dalam bentuk apa pun. Kalau tidak, suatu algoritma dapat diimplementasikan dalam bahasa OO untuk melakukan sesuatu pada objek (seperti yang ditunjukkan)
Saya tidak bisa memikirkan satu (tapi itu tidak berarti, itu tidak mungkin). Tetapi jika Anda melihatnya sebaliknya: OOP berguna, jika Anda ingin memodelkan beberapa masalah dan menyelesaikannya dengan algoritma yang sesuai. Katakanlah Anda memiliki catatan
friends
Anda bisa model mereka sebagaiobjects
denganproperties
dan jika Anda inginlist
darifriends
diurutkan dengan cara apapun, Anda bisa menggunakan contoh-kode yang diberikan di atas untuk melakukan hal itu.Seperti dikatakan: itu lebih alami , karena prosedural adalah karakter dari algoritma.
sumber
Anda punya masalah.
Model domain bisnis menjelaskan masalah Anda, dan konsep dari domain masalah yang akan Anda hadapi.
Algoritma menjelaskan cara Anda akan memecahkan masalah Anda, secara konseptual; akan seperti apa implementasi Anda; dan bagaimana Anda menangani masalah Anda setelah menerjemahkannya ke dalam istilah "Ilmu Komputer".
Pemrograman paradigma apakah OOP, Fungsional, Logis, Prosedural, atau bahkan Non-Terstruktur, menjelaskan bagaimana Anda akan menyusun solusi Anda, bentuk mana yang akan diambil, konsep "Rekayasa Perangkat Lunak" mana yang akan Anda gunakan, dan yang mana " Teori Bahasa Pemrograman "konsep yang akan Anda gunakan.
Sederhananya, algoritma menjelaskan secara umum solusi Anda untuk masalah ("Inilah yang akan saya lakukan"). Sementara pemrograman paradigma berkaitan dengan implementasi Anda yang sebenarnya ("Ini adalah bagaimana saya akan melakukannya").
sumber
Algoritma = ceritakan kisah " Bagaimana " (yaitu bagaimana memanipulasi data input menggunakan struktur data pada waktunya untuk menghasilkan hasil yang diinginkan)
OOP = a " Metodologi " yang difasilitasi oleh OO-bahasa untuk menulis program (= algoritma + struct data) yang memberi Anda keamanan dan abstraksi memori
OOP hanyalah paradigma penerapan algoritma.
Analogi yang bagus : film
Anda dapat merekam adegan dengan menggunakan stuntman atau tidak. Skenario (algoritma) tidak berubah. Orang seharusnya tidak melihat perbedaan dalam hasil akhir.
EDIT: Anda dapat mencoba MOOC berkualitas baik: https://www.coursera.org/course/algs4partI yang menyisipkan topik yang dibahas (terutama pendekatan OOP) dan memberikan inti dari apa yang Anda tanyakan di sini.
sumber
Alexander Stepanov adalah pencipta asli C ++ Standard Template Library, (STL), yang merupakan pustaka algoritma dasar untuk C ++. C ++ adalah bahasa multi-paradigma yang mencakup fitur "Berorientasi Objek", tetapi Alexander Stepanov mengatakan ini tentang Orientasi Objek:
http://www.stlport.org/resources/StepanovUSA.html
Stepanov menyatakan perpustakaan algoritmanya bukan dengan Objects, tetapi dengan Generic Iterators .
sumber
Algoritma menggambarkan apa yang harus dilakukan komputer. Struktur menggambarkan bagaimana algoritme ditata [dalam kode sumber]. OOP adalah gaya pemrograman yang memanfaatkan struktur "berorientasi objek" tertentu.
Buku-buku algoritma sering menghindari OOP karena mereka berfokus pada algoritma, bukan struktur. Fragmen kode yang sangat bergantung pada struktur cenderung menjadi contoh yang buruk untuk dimasukkan ke dalam buku algoritma. Demikian juga, buku-buku OOP sering menghindari algoritma karena mereka mengacaukan cerita. Titik penjualan OOP adalah fluiditasnya, dan mengelompokkannya ke suatu algoritma membuatnya tampak lebih kaku. Ini lebih tentang fokus buku daripada apa pun.
Dalam kode kehidupan nyata, Anda akan menggunakan keduanya berdampingan. Anda tidak dapat menyelesaikan masalah komputer tanpa algoritme, menurut definisi, dan Anda akan kesulitan menulis algoritma yang bagus tanpa struktur (OOP atau lainnya).
Sebagai contoh di mana mereka kabur, ambil Pemrograman Dinamis. Dalam buku algoritma, Anda akan menjelaskan cara mengambil dataset yang homogen dalam array dan menggunakan Pemrograman Dinamis untuk sampai pada solusi. Dalam buku OOP, Anda dapat menemukan struktur seperti Pengunjung, yang merupakan cara untuk melakukan algoritma sewenang-wenang di sekumpulan objek heterogen. Contoh buku DP dapat dianggap sebagai Pengunjung yang sangat sederhana yang beroperasi pada objek dalam urutan bottom-up secara umum. Pola Pengunjung bisa dianggap sebagai kerangka masalah DP, tetapi melewatkan daging dan kentang. Pada kenyataannya, Anda akan sering membutuhkan keduanya: Anda menggunakan pola Pengunjung untuk menangani heterogenitas di seluruh dataset Anda (DP buruk pada saat itu), dan Anda menggunakan DP dalam struktur Pengunjung untuk mengatur algoritme Anda untuk meminimalkan runtime (Pengunjung tidak
Kami juga melihat algoritma yang beroperasi di atas pola desain. Lebih sulit untuk menyebutkan contoh dalam ruang kecil, tetapi begitu Anda memiliki struktur, Anda mulai ingin memanipulasi struktur itu, dan Anda menggunakan algoritma untuk melakukannya.
Ini adalah pertanyaan yang lebih sulit dijawab daripada yang Anda pikirkan. Untuk urutan pertama, tidak ada alasan komputasi mengapa Anda membutuhkan OOP untuk menyelesaikan masalah apa pun. Bukti sederhana adalah bahwa setiap program OOP dikompilasi ke perakitan, yang jelas merupakan bahasa non-OOP.
Namun, dalam skema yang lebih besar, jawabannya mulai malu terhadap ya. Anda jarang dibatasi hanya dengan metodologi komputasi. Sebagian besar waktu ada hal-hal seperti kebutuhan bisnis dan keterampilan pengembang yang menjadi faktor dalam persamaan. Banyak aplikasi saat ini tidak dapat ditulis tanpa OOP, bukan karena OOP entah bagaimana mendasar untuk tugas itu, tetapi karena struktur yang disediakan oleh OOP sangat penting untuk menjaga proyek sesuai jalur dan sesuai anggaran.
Ini tidak mengatakan bahwa kita tidak akan pernah meninggalkan OOP di masa depan untuk beberapa struktur baru yang lucu. Itu hanya mengatakan itu adalah salah satu alat yang paling efektif di kotak alat kami untuk sebagian besar tugas pemrograman luar biasa di luar sana hari ini. Masalah di masa depan dapat menyebabkan kita melakukan pendekatan pembangunan menggunakan struktur yang berbeda. Pertama, saya berharap jaring saraf membutuhkan pendekatan pengembangan yang sangat berbeda, yang mungkin atau mungkin tidak berubah menjadi "Berorientasi Objek."
Saya tidak melihat OOP menghilang dalam waktu dekat karena cara algoritma berpikir. Sampai saat ini, pola yang biasa adalah bahwa seseorang merancang algoritma yang tidak memanfaatkan OOP. Komunitas OOP menyadari algoritma tidak benar-benar cocok dengan struktur OOP, dan benar-benar tidak perlu, sehingga mereka membungkus seluruh algoritma dalam struktur OOP dan mulai menggunakannya. Pertimbangkan
boost::shared_ptr
. Algoritma penghitungan referensi yang ada di dalamnyashared_ptr
tidak terlalu ramah dengan OOP. Namun, pola tersebut tidak menjadi populer sampaishared_ptr
membuat pembungkus OOP di sekitarnya yang mengekspos kemampuan algoritma dalam format terstruktur OOP. Sekarang, ini sangat populer sehingga membuatnya menjadi spesifikasi terbaru untuk C ++, C ++ 11.Mengapa ini begitu sukses? Algoritma sangat bagus dalam memecahkan masalah, tetapi mereka sering membutuhkan investasi penelitian awal yang substansial untuk memahami cara menggunakannya. Pengembangan Object Oriented sangat efektif dalam membungkus algoritma tersebut dan menyediakan antarmuka yang membutuhkan investasi awal lebih sedikit untuk belajar.
sumber
Selain jawaban yang bagus, saya akan menyebutkan kesamaan konseptual tambahan antara OOP dan Algoritma.
Baik OOP dan Algoritma sangat menekankan penggunaan prasyarat dan postkondisi untuk memastikan kebenaran kode.
Secara umum, ini adalah praktik standar dalam semua bidang ilmu komputer; namun, prinsip panduan ini menghasilkan jalur evolusi dalam OOP yang membuatnya saling menguntungkan untuk mengimplementasikan algoritma di lingkungan OOP.
Dalam OOP, sekelompok objek yang dapat memenuhi kontrak yang sama (prasyarat dan postkondisi) dapat dibuat untuk mengimplementasikan antarmuka. Pengguna antarmuka seperti itu tidak perlu tahu implementasi mana yang digunakan pada objek yang mendasarinya, kecuali dalam beberapa situasi yang jarang terjadi (di mana abstraksi bocor terjadi).
Algoritma adalah implementasi dari langkah-langkah yang digunakan untuk melakukan perhitungan, yang akan mengambil prakondisi dan menghasilkan postkondisi.
Oleh karena itu, seseorang dapat meminjam ide abstraksi dengan cara prasyarat dan postkondisi, dan menerapkannya pada algoritma. Anda akan menemukan bahwa kadang-kadang algoritma yang rumit dapat didekomposisi menjadi langkah yang lebih kecil, dan langkah yang lebih kecil ini dapat memungkinkan strategi implementasi yang berbeda selama prasyarat dan postkondisi yang sama terpenuhi.
Dengan mengimplementasikan algoritma dalam OOP, seseorang dapat membuat langkah-langkah yang lebih kecil ini dapat dipertukarkan.
Akhirnya, perlu diingat bahwa FP dan OOP tidak saling eksklusif. Apa pun yang dijelaskan di atas dapat juga berlaku untuk FP
sumber
Algoritma adalah tentang bagaimana menyelesaikan masalah (Cara menghasilkan output dari input yang diberikan), OOP adalah tentang bagaimana merumuskan atau mengekspresikan solusi kami (langkah-langkah algoritma).
Algoritme dapat dijelaskan dalam bahasa alami atau bahasa rakitan, tetapi konsep yang kami miliki dalam bahasa alami membantu kami menulis dan memahaminya dengan lebih baik. Misalnya algoritma untuk bubble-sort adalah:
Untuk menyembunyikan detail
swap
dan mengaitkannya denganA
kami menggunakan sintaks dan fitur OOP, maka OO membuat algoritme lebih dekat dengan bahasa dan pemahaman alami kami.Tidak, jika Anda menganggap bahwa program apa pun (atau algoritme) di komputer akan diterjemahkan ke sekumpulan instruksi yang dijalankan pada CPU ( Mesin Turing ) dan jika kami menganggap instruksi ini sebagai algoritme utama yang menyelesaikan masalah di komputer , maka OOP tidak bisa melakukan sesuatu lebih jauh. Itu hanya membuatnya lebih dekat dengan pemahaman dan penalaran manusia. Ini adalah cara untuk mengemas prosedur dan struktur data kami.
Mungkin membantu untuk menyatakan atau merumuskan algoritma lebih mudah atau lebih mudah dipahami. Itu dapat menyembunyikan detail dan memberikan gambaran besar dari solusinya.
Secara teori, algoritma yang pertama dan mengimplementasikannya yang kedua . Namun pada kenyataannya, kami tidak dapat memastikan bahwa algoritma kami berfungsi seperti yang diharapkan sampai kami melacaknya atau menghasilkan output yang diharapkan. Komputer membantu kami melakukan itu, tetapi Anda tidak berharap untuk menulisnya dalam bahasa mesin (perakitan).
Dalam hal ini, OOP memfasilitasi implementasi, pengujian, dan penyempurnaan algoritma kami di komputer dan menulisnya untuk komputer dalam bahasa yang dekat dengan bahasa alami kami.
sumber