Apakah ada perbedaan mempelajari OOP pada berbagai bahasa pemrograman? [Tutup]


9

Saya ingin belajar OOP. Saya tahu Python dan saya tahu sedikit sekali tentang OOP.

Tetapi ketika saya mencari "belajar OOP" di forum saya melihat seorang pria mengatakan bahwa "Python sangat baru itu sebabnya Anda tidak dapat belajar OOP di Python. Anda harus belajar Java kemudian memahami OOP di Jawa"

Apakah itu benar Apakah ada perbedaan dalam memahami OOP pada berbagai bahasa pemrograman? suka mempelajarinya di Java, C #, C ++, Perl atau Python?


12
"Python sangat baru itu sebabnya Anda tidak bisa belajar OOP di Pyton. Anda belajar Java kemudian memahami OOP di Jawa" Itu tidak masuk akal bagi saya. Jika Anda ingin belajar OOP menggunakan Python, saya tidak melihat alasan mengapa tidak. Lakukan itu!
FrustratedWithFormsDesigner

13
Bukankah Python lebih tua dari Java? Dari atas kepala saya, saya percaya itu tapi saya bisa pergi beberapa tahun.
Jimmy Hoffa

2
@JimmyHoffa Memang. 91 vs 95 menurut Wikipedia.
Evicatos

2
@JimmyHoffa: ayolah, itu tidak mungkin benar, kan! Kita semua tahu bahwa Jawa adalah bahasa OO pertama yang pernah ada. "Sun dengan keras mengumumkan kebaruan Jawa" ... - Adapun pertanyaannya ... mengapa kamu bertekad untuk belajar OO? Itu akan segera dipaksakan pada Anda. Python adalah titik awal yang sangat baik, untuk mendapatkan wawasan tentang manfaat dari beberapa paradigma pemrograman.
leftaroundabout

Jawaban:


10

Objek sebagai konstruksi teoretis sangat sederhana: Ini adalah struktur yang menyimpan data, fungsi, atau keduanya. Idenya adalah bahwa struktur ini memiliki rasa "diri" yang tersirat dalam sebagian besar bahasa di luar Python. Ini disebut "deskriptor" dan memberikan objek titik referensi diri yang mengikat data (variabel atau bidang) dan fungsi (biasanya disebut metode) ke objek tertentu yang dimaksud. Gagasannya adalah bahwa Anda secara khusus menggunakan variabel atau metode yang dimiliki oleh instance tertentu (blok memori yang dialokasikan biasanya di bawahnya) daripada ke beberapa konstruksi yang lebih besar dan lebih umum.

Sistem objek cenderung bervariasi sehubungan dengan dua kategori besar: Warisan dan Akses.

Beberapa, seperti Java atau C ++, meminta Anda mendeklarasikan kelas yang bertindak sebagai "cetak biru" untuk objek yang kemudian dialokasikan. Kelas-kelas ini dan objek-objek mereka tidak dapat secara struktural diubah setelah dipakai. Mereka dapat memiliki konten mereka ditimpa dalam arti bahwa variabel dapat berubah tetapi strukturnya statis. Anda tidak dapat, misalnya, menambahkan metode baru ke HashMap di Java. Anda dapat memperluas antarmuka (pada dasarnya sebagian kelas yang diimplementasikan berfungsi sebagai kontrak) atau membuat subkelas untuk mendapatkan metode atau variabel tambahan yang Anda butuhkan bersama dengan semua variabel asli dan metode dari kelas tertentu yang bersangkutan.

Bahasa berbasis kelas lain, yang paling sering dikutip adalah Ruby, memungkinkan Anda untuk dengan mudah membuka kelas yang ada dan hanya menambahkan metode sesuai keinginan Anda. Ini adalah pertengkaran dan dianggap oleh banyak orang sebagai sangat, sangat berbahaya.

Javascript bahkan lebih longgar, Objek tidak lebih dari sekumpulan slot untuk variabel atau fungsi. Mereka dapat diubah atau ditimpa setiap kali programmer merasa perlu untuk melakukannya. Mereka bahkan dapat dikloning secara sewenang-wenang sebagai "Prototipe" untuk objek lain, dengan demikian meneruskan semua kemampuan mereka.

Kontrol akses adalah perbedaan besar antara berbagai bahasa.

Beberapa bahasa seperti Java memiliki pengubah akses yang sangat ketat seperti "privat" dan "dilindungi", yang mendefinisikan dengan tepat kelas dan subclass apa yang dapat menggunakan variabel atau metode tertentu.

Lainnya, seperti Python kurang formal, menggunakan konvensi garis bawah sebelum metode atau nama variabel untuk menunjukkan bahwa itu pribadi.

Pada akhirnya, Python adalah bahasa yang benar-benar sah untuk diprogram dengan cara yang berorientasi objek, itu hanya tidak menegakkannya seketat beberapa yang lain.


Mungkin agak terlalu teknis untuk pertanyaan ini.
Zeroth

@zeroth, dan terlalu spesifik. Parameter 'mandiri' (atau 'ini') jauh dari universal.
Javier

@ Javier Itulah sebabnya saya mengatakan bahwa itu eksplisit dalam Python dan tersirat di tempat lain.
Insinyur Dunia

Pertanyaannya adalah tentang belajar OOP dan saya pikir membahas bagaimana bahasa ditulis untuk mencapai konsep-konsep tertentu seperti Enkapsulasi di mana kita miliki privateuntuk Java dan garis bawah ( __) untuk Python cukup penting. Saya pikir tingkat abstraksi Python mungkin membuatnya sedikit lebih menantang bagi pemula, tapi jelas bukan tidak mungkin. Java menjelaskannya untuk programmer yang mungkin membuat beberapa konsep lebih mudah.
Derek W

@ WorldEngineer Saya tidak berbicara tentang menjadi eksplisit / implisit (juga, Python tidak biasa dalam hal ini), tetapi tentang hanya ada sebagai sebuah konsep. Beberapa bahasa melakukan pengiriman polimorfik pada semua parameter, tidak hanya pada yang pertama. Beberapa menggunakan petunjuk lain untuk versi spesifik, dan gaya utama mungkin tidak mengistimewakan argumen sebagai 'ini'.
Javier

18

Mempelajari prinsip - prinsip OOP sama sekali tidak spesifik dalam bahasa, jadi jika dengan "mempelajari OOP", yang Anda maksud adalah "mempelajari apa arti terminologinya, apa itu OOP dan mengapa saya ingin menggunakannya" maka bahasa itu tidak masalah.

Jika Anda bermaksud "belajar bagaimana mengembangkan menggunakan OOP" maka ya, bahasa yang berbeda menanganinya secara berbeda, tetapi mereka semua memiliki seperangkat prinsip yang sama. Jika Anda seperti saya, Anda akan mempelajarinya paling baik hanya dengan melakukannya. Pilih bahasa berorientasi objek dengan tutorial atau buku yang bagus yang membahas aspek berorientasi objek dan miliki. Jika Anda memiliki prinsip-prinsip desain berorientasi objek, Anda akan dapat menggunakannya dalam bahasa OO lainnya.

"Python sangat baru itu sebabnya kamu tidak bisa belajar OOP di Pyton. Kamu belajar Java lalu mengerti OOP di Jawa"

Ini hanya membuat kepala saya sakit. Begitu banyak kesalahan dijejalkan ke dalam satu kalimat.

Python berasal dari tahun 1989.

http://python-history.blogspot.com/2009/01/brief-timeline-of-python.html

Jawa hingga 1995.

http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html

Anda dapat menarik kesimpulan sendiri tentang validitas sedikit nasihat itu ...


1
Ya tapi Python 1.0 tidak sampai 1994. Java sedang dalam pengembangan untuk beberapa waktu sebelum dirilis juga. Tapi saya setuju bahwa Python memiliki OO dan Anda BISA mempelajari konsep-konsep OO. Tidak masuk akal untuk mengatakan sebaliknya.
chubbsondubs

2
@ chubbsondubs Yap, itu masih sebelum Jawa! ;)
Izkata

1
Untuk hanya menyediakan counter-point ringan, OOP berbasis kelas (C ++, Java, Python, dan banyak lainnya) cukup berbeda dari OOP berbasis prototipe (JavaScript adalah satu-satunya bahasa yang saya tahu yang menggunakan ini). Mereka masih OOP dan memiliki dasar-dasar yang sama dan melayani banyak tujuan yang sama, tetapi banyak orang menganggap kelas sebagai bagian dari apa yang mereka anggap OOP, sementara JavaScript tidak memilikinya dan jelas berorientasi objek.
KRyan

@ KRyan: Jika Anda peduli, ada satu bahasa OO berbasis prototipe lain yang bernama Self.
Jerry Coffin

ActionScript memiliki prototipe dan kelas.
OrangeDog

8

Saya pikir orang yang Anda kutip hanya menampilkan chauvinisme bahasa.

Pada kenyataannya, ada perbedaan antara konsep OOP dan implementasi OOP. Secara puitis, ini paling baik dipahami setelah Anda memiliki pemahaman yang lebih baik tentang beberapa konsep OOP.

Banyak programmer yang merasa nyaman dengan hanya beberapa bahasa yang serupa, sehingga mereka tidak perlu mengembangkan kemampuan mereka atau menderita karena tidak mampu untuk sementara waktu.

Jadi pertanyaannya adalah, apakah Python akan mengajarkan Anda konsep OOP?

Saya akan mengatakan Anda bisa, asalkan Anda memiliki dukungan belajar yang memadai yang mendorong Anda mencoba hal-hal yang biasanya tidak Anda jelajahi dalam pembelajaran mandiri. Buku atau mentor semacam itu adalah yang terbaik. Mark Lutz menulis buku yang sangat mendalam, sangat rinci, dan sangat bagus tentang Python, dan saya akan merekomendasikan buku-bukunya karena mereka akan mendorong Anda untuk melakukan dan belajar lebih banyak.

Yang harus Anda ingat adalah bahwa cara Python bukan satu-satunya Jalan, juga bukan Satu-satunya Jalan yang Benar. Semakin banyak paradigma pemrograman yang Anda kuasai, semakin baik Anda menjadi programmer. Cara Python melakukan OOP tidak persis bagaimana C ++ atau Java melakukannya, tetapi konsepnya ditransfer dengan baik.


4
Dalam hal OOP, Java dan C ++ berbeda satu sama lain sama seperti berbeda dari Python.
Gort the Robot

Sampai batas tertentu, tetapi itu sebagian besar disebabkan oleh perubahan pengetahuan desain bahasa dan kendala yang berbeda.
Zeroth

Dan terus terang, 90% dari konsep OOP berpindah dengan baik di antara mereka, bahkan hampir tidak terlihat.
Zeroth

Ya, saya setuju. Saya merasa agak lucu untuk menganggap Java dan C ++ sebagai "sama" dalam hal OOP.
Gort the Robot

4

Ya, implementasi OOP sangat berbeda. Teori dan prinsipnya sama, tetapi begitu banyak orang menganggap hanya "OOP nyata" yang dilakukan oleh Java dan C ++, sehingga Anda mendapatkan banyak referensi yang seharusnya "bahasa agnostik" tetapi pada kenyataannya mengasumsikan berbasis bahasa, bahasa yang diketik secara statis. .

Itu tidak berarti bahwa referensi itu buruk, atau bahkan terbatas; misalnya buku mani "geng empat" (GoF) "Pola Desain: Elemen Perangkat Lunak Berorientasi Objek yang Dapat Digunakan Kembali" adalah contoh utama dari sebuah karya hebat yang mengatakan "OOP" ketika itu benar-benar berarti "OOP berbasis kelas statis".

Jadi, menurut saya: Ya, Anda dapat belajar banyak OOP di Python, Javascript, C, dan banyak bahasa lainnya; tetapi beberapa orang (mungkin majikan masa depan) ketika meminta "pengalaman OOP" berarti Java / C ++ / C #. Jadi, akan lebih bijaksana untuk memeriksa pandangan lain itu juga.

(dan itu bukan hanya dua 'jenis' dari OOP ....)


2
Ironisnya, OOP berbasis kelas bukanlah yang disarankan Alan Key sebagai OOP. Tetapi banyak "pembelajaran" OOP adalah tentang belajar desain / pengertian kode yang tidak terbatas pada implementasi OOP tertentu
Daniel Gratzer

2
Mungkin juga masuk akal untuk melihat CLOS: Saya tidak berpikir banyak bahasa / kerangka kerja yang menawarkan banyak metode.
Giorgio

2
@ jozefg: benar, Alan Kay pernah berkata, "Sebenarnya saya membuat istilah" berorientasi objek ", dan saya dapat memberitahu Anda bahwa saya tidak memiliki C ++ dalam pikiran."
Javier

1
@Giorgio Actually Dylan mungkin menyediakan versi CLOS yang sedikit lebih sederhana (tidak ada cara untuk menentukan kapan suatu multimethod dijalankan, tetapi jauh lebih sederhana untuk didekati)
Daniel Gratzer

4

Pemrograman Berorientasi Objek adalah ide tentang bagaimana menyusun bahasa pemrograman untuk menumbuhkan kopling rendah, menyembunyikan informasi (alias enkapsulasi), menggabungkan data dan metode yang beroperasi pada data tersebut bersama-sama, dan penggunaan kembali kode. Banyak bahasa yang menerapkan ide-ide ini sehingga ada variasi antar bahasa tentang bagaimana mereka mendekati Orientasi Objek. Sebagai contoh, Java hanya memungkinkan kelas untuk memperluas 1 kelas. Namun, Python dan C ++ memungkinkan Anda untuk memperpanjang sejumlah kelas. Java memiliki alasan khusus untuk keterbatasannya. Keterbatasan yang dimaksudkan untuk memperbaiki hal-hal dari C ++, tetapi juga karena Smalltalk hanya mendukung kelas basis tunggal.

Bahasa OO dapat dikelompokkan menjadi dua keluarga. Keluarga Smalltalk (atau OOP berbasis kelas) bahasa termasuk C ++, Java, Smalltalk, Ruby, C #, Python untuk beberapa nama (ada banyak dalam keluarga ini). Ini adalah campuran dari jenis bahasa statis dan dinamis dan sementara mereka sedikit berbeda pada beberapa konsep mereka sangat mirip dalam bagaimana mereka berpikir tentang OOP. Yang saya maksud dengan itu adalah bagaimana mereka mendekati kopling, enkapsulasi, data dan metode yang mengikat, dan penggunaan kembali kode, dan alat yang mereka sediakan bagi Anda untuk melakukan itu. Dalam keluarga ini banyak konsep yang sama.

Keluarga lainnya adalah OOP berbasis protoype. Bahasa-bahasa ini terlihat sangat berbeda dalam implementasi OOP mereka. Mungkin contoh paling terkenal dari ini adalah Javascript, tetapi Javascript menyalin ide-ide ini dari Skema dan Objek LISP. Ini adalah bahasa yang kurang dikenal dan biasanya diketik secara dinamis. Saya tidak bisa memikirkan bahasa berbasis prototipe yang diketik secara statis, tetapi itu tidak berarti tidak ada satu pun. Anda dapat membacanya di sini: http://en.wikipedia.org/wiki/Prototype-based_programming . Intinya adalah mereka mendekati OOP dengan cara yang sangat berbeda dari bahasa berbasis kelas. Itu berarti konsep tidak portabel antara dua keluarga ini. Hanya karena Anda tahu OO dalam satu keluarga tidak berarti Anda akan dengan mudah mengalihkan ide-ide itu ke keluarga lain.

Ingatlah bahwa sebagian besar bahasa pemrograman memadukan konsep dari banyak ide. Python dan Ruby menggabungkan ide-ide pemrograman OOP dan fungsional ke dalam bahasa mereka. Dan Anda dapat mencampur prototipe OO berbasis dengan ekstensi tertentu ke bahasa berbasis kelas sehingga lebih kompleks.


Saya tidak akan menghitung C ++ ke dalam keluarga Smalltalk. Smalltalk didasarkan pada Simula, dan Alan Kay sengaja mengabaikan sebagian besar perubahan di Simula-II, sedangkan C ++ didasarkan pada itu. C # aneh, dirancang oleh pengguna C ++ dan desainer Pascal untuk menjadi seperti Java.
Jörg W Mittag

1

OOP adalah prinsip pemrograman - ini pada dasarnya sebuah ide. Implementasi OOP bervariasi di seluruh bahasa pemrograman - tetapi pilar (Abstraksi, Warisan, Enkapsulasi, dan Polimorfisme) OOP biasanya hadir dalam beberapa cara atau bentuk.

Saya akan mengatakan tanpa preferensi untuk kedua bahasa, bahwa Java mendorong semantik sedikit lebih keras pada programmer daripada mengatakan Python.

Sebagai contoh,

Kode Java: class Cat extends Animal {}

Apakah sedikit lebih jelas mengenai apa yang Anda lakukan dalam sudut pandang OOP daripada:

Kode python: class Cat(Animal):

Tentu mereka berdua mendefinisikan hierarki kelas tempat Kucing mewarisi dari Hewan. Tetapi saya merasa bahwa untuk seorang programmer yang baru memulai di OOP, aplikasi dan implikasi dari ide-ide OOP mungkin tetap sedikit lebih baik di Jawa karena ini mengeja untuk programmer.


1

Anda secara eksplisit bertanya apa bahasa yang paling mudah untuk mempelajari konsep OOP. Saya pikir jawabannya jelas: python .

Untuk menunjukkan mengapa hal ini terjadi, mari kita lihat program pemula pada Java vs Python. Ayo buat game tebak-tebakan tinggi-rendah sederhana

Jawa

Di Jawa, Anda akan menulis kelas Game.

public class Game {
    public int secretNumber;
    public int tries;

    public Game(int tries, int secretNumber) {
        this.tries = tries;
        this.secretNumber = secretNumber;
    }

    public void guess(int myNumber) {
        if(myNumber > secretNumber)
            System.out.println("Your guess is too high!");
        else if (myNumber < secretNumber)
            System.out.println("Your guess is too low!");
        else
            System.out.println("You win!!");
        tries = tries - 1;
        if(tries == 0) {
            System.out.println("No more tries: you lose :(");
        }
    }

    public static void main(String[] args) {
        Game game = new Game(10, 47);
        while(true) {
            // how do I read a newline again? Something with BufferedInputStreamReader?
            // how do I convert a String to a number?
        }
    }
}

Saya seorang programmer yang berpengalaman, dan bahkan saya mengalami kesulitan. Selanjutnya, lihat apa yang perlu Anda jelaskan kepada calon siswa untuk program sederhana ini:

  • Metode statis
  • Visibilitas (publik vs pribadi). Anda harus selalu menandai bidang sebagai pribadi.
  • this. notasi untuk merujuk ke variabel ketika mereka disembunyikan oleh orang lain
  • Konstruktor menyerupai metode, tetapi bukan metode.
  • System.outadalah outputStream. Dan ya, itu adalah sebuah ladang, tapi itu sebuah staticladang.
  • Terkadang, Anda bisa menghilangkan kurung keriting jika hanya ada satu pernyataan
  • String[]adalah sebuah array. Ini adalah jenis objek khusus, tetapi sekali lagi, tidak juga.
  • intadalah tipe primitif. Itu spesial.
  • Anda membutuhkan banyak metode kerangka kerja

Python

Python jauh lebih murni. Tidak ada tipe primitif. Konstruktor tidak ada, hanya ada metode khusus yang disebut inisialisasi.

Anda tidak perlu berinteraksi dengan konsol, karena Anda punya REPL. Anda cukup memainkan game menggunakan g.guess(35)dan mengembalikan string.

Ini membuat bahasa lebih mudah untuk dipelajari dan memahami konsep OOP dasar.


0

Gagasan inti dalam OOP adalah merangkum (yang berarti bundling atau menyembunyikan) variabel dan metode bersama-sama di dalam kelas (yang python benar-benar mendukung). Ini tentang merancang kode Anda di sekitar kata benda. Kemudian semacam itu berlangsung dari sana.

Meskipun ada perbedaan implementasi (misalnya, python tidak mendukung visibilitas seperti Java) dan perbedaan sintaks (dalam Javascript, Anda harus mewarisi metode sendiri), desain dasar tetap sama.

Saya pikir itu lebih mudah untuk belajar OOP dalam bahasa seperti Jawa, karena bahasa mengharuskannya dan komunitas kurang merugikan daripada, katakanlah, komunitas python.

Tapi ada banyak tulisan tentang desain & praktik OOP di luar sana, dan membaca itu bukan usaha yang sia-sia. Bahkan ketika saya menulis python (yang banyak), saya menulis banyak objek, dan saya menggunakan banyak objek dari perpustakaan pihak ketiga.


Gagasan kode adalah menyampaikan pesan. Juga tidak ada sumber.
Pengguna

1
OOP bukan tentang kelas.
Jörg W Mittag

1
Ide awal @ Pengguna Alan Kay adalah tentang pengiriman pesan, tetapi sejak saat itu praktik OO telah berkembang menjadi desain oleh kata benda, atau kelas objek. Sebagai contoh, Dr. Kay juga berpendapat bahwa Java tidak Berorientasi Objek, karena tidak mendukung pengikatan yang terlambat. @ Jorg lol ya ya
Rob

0

Ketika Anda belajar OOP dalam bahasa Anda mulai berpikir dalam bahasa ini. Bahasa memengaruhi apa yang menurut Anda dapat dilakukan dan bagaimana serta juga menambahkan rasa pada OOP.

  • Haruskah ada Pengumpulan Sampah?
  • Bisakah saya menambahkan metode ke bilangan bulat?
  • Apakah saya menggunakan kelas atau prototipe?
  • Bagaimana benda berefleksi pada diri mereka sendiri?

Beberapa orang tidak dapat melakukan OOP tanpa kelas. Beberapa harus membunuh benda mereka dengan proses itu.

Ada inti dari OOP dan ide-ide orisinil tentangnya. Anda juga dapat melihat Smalltalk, Self, Simula, LISP, Newspeak. Dan juga melihat jenis bahasa non-OOP seperti bahasa aliran data bash, APL, J. Logikal yang Prolog. Haskell (kelas tipe). Mereka semua akan mengajarkan Anda pemikiran yang berbeda dan Anda dapat mempelajarinya

  • OOP bukan tentang bahasa imperatif
  • OOP bukan tentang kelas

Dan pada akhirnya Anda dapat melihat apa manfaat OOP. Setidaknya Anda akan punya ide lain tentang itu. Saya sarankan mencari ceramah oleh Alan Kay .


Jika Anda tidak melihat bahasa pos ini tidak berguna.

Seperti yang Anda lihat di sini: Kami tidak dapat menyepakati apa itu OOP.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.