Perbedaan antara "Java OOP" dan "Pythonic OOP"? [Tutup]

19

Saya mulai dengan ActionScript 2.0 dan kemudian melanjutkan dengan Java. Saya telah belajar, atau setidaknya menggunakan, banyak bahasa sejak saat itu, termasuk Python (mungkin favorit saya).

Saya takut bahwa gaya pemrograman berorientasi objek saya sangat unpythonic, dan lebih seperti Java OOP dengan sintaksis Python. Apa yang membuat Java seperti dan OTH Pythonic berbeda satu sama lain? Hal-hal apa yang sering dilakukan oleh programmer Java "secara unpythonically" ketika menulis kode berorientasi objek dengan Python?

Anto
sumber

Jawaban:

54

Untuk seorang pria Jawa, Python adalah sebuah permainan anarkis di mana siapa pun dapat mengambil sebuah klub dan mulai menganiaya kepala Anda.

Untuk seorang lelaki Python, Jawa adalah sebuah alam semesta Orwellian di mana Anda terus-menerus dibelenggu oleh pandangan orang lain yang semakin berkurang tentang bagaimana jagat raya berdetak.

Yang benar adalah apa pun yang dapat Anda lakukan dalam satu bahasa yang dapat Anda lakukan dalam bahasa lain sama baiknya. Namun seperti yang telah Anda sebutkan ada perbedaan penting di kedua komunitas untuk apa arti bersih .

Cara Java: Sistem bersih adalah sistem yang melakukan apa yang dimaksudkan dan tidak ada yang lain, itu tidak akan mengizinkan ekstensi atau modifikasi yang bertentangan dengan sifat tujuan yang dimaksudkan dan akan berusaha untuk menegakkan ini sebanyak mungkin melalui kompiler. Fleksibilitas diperoleh melalui pembuatan antarmuka sederhana yang cermat dalam struktur yang ketat. Di Jawa, satu kotak pasir harus selalu dibatasi dengan jelas dan melewati ini dengan umpan balik cepat dari penyusun. Java menyediakan sarana untuk secara statis menentukan struktur objek dan membuat interaksi dinamis dari instance mereka. Ketika saya bekerja di Jawa, saya mencoba secara cerdik membuat blok bangunan dasar menuju solusi mati otak. Saya sebagian besar bekerja dari bawah ke atas begitu saya memiliki teori kerja tentang cara mengatasi masalah.

Java akan cenderung menghasilkan perangkat lunak besar yang dapat menjangkau tim besar dan menyediakan alat dan sarana untuk menjaga kawanan tetap terkendali. Jika terus dicentang, ini akan menyebabkan tim yang sangat terpisah bekerja secara mandiri menuju tujuan yang semakin tidak jelas. Akhirnya masing-masing tim menjadi "raison d'être" miliknya sendiri dan sistem secara keseluruhan menjadi pengemudi yang terdilusi yang menyimpang dari proyek utama. Ini dapat menyebabkan kelebihan biaya yang ekstrem dan sistem perangkat lunak besar yang berkinerja buruk.

Hampir tidak pernah ada cara kecil cepat dan mudah untuk melakukan hal-hal di Jawa, tetapi IDE dan tooling ada untuk membuat tugas-tugas yang menyakitkan hanya dengan beberapa klik saja.

Cara Python: Bersih berarti ringkas dan mudah dibaca. Sebuah sistem python yang baik dirancang untuk memungkinkan Anda untuk langsung ke inti dan mengungkapkan rahasia yang paling dalam dengan cara yang dapat Anda pahami dari kode tentang tujuan penggunaan dan tujuan penggunaannya. Ini juga akan memungkinkan Anda untuk merancang solusi Anda sendiri dengan memperluas dan / atau merangkum desain asli sehingga akan tepat ke arah Anda. Python menyediakan sarana untuk membuat templat objek yang darinya Anda dapat mengubah instance secara dinamis agar sesuai dengan kebutuhan. Dalam python saya cenderung untuk menangani masalah segera dan kemudian menyebar kode dalam struktur logis sehingga solusi akhir tetap sesederhana dan mudah dibaca. Dalam python saya cenderung bekerja top-down dan mengelola peningkatan kompleksitas melalui pendekatan divide-and-conquer.

Tim Python akan cenderung menghasilkan sistem yang ringan dan sangat cepat dalam memberikan solusi yang berfungsi. Mereka akan cenderung menjadi kelompok yang dekat yang bekerja secara bergantian pada bagian mana pun dari sistem yang saling memvalidasi solusi setiap kesempatan yang mereka dapatkan. Mereka saling memberi makan menciptakan sinergi yang cukup menggembirakan. Namun ini menciptakan tim yang sulit untuk skala ke sistem yang lebih besar dan sering menabrak semacam langit-langit kaca. Memperkenalkan anggota baru dalam tim akan membantu tetapi perlu beberapa waktu agar pengetahuan tersebar cukup agar produktivitas ekstra dapat dirasakan. Tim kemudian menjadi terpecah dan gambaran umum yang konstan atas seluruh sistem mencair seperti halnya atmosfer di masa-masa awal. Hal ini dapat menyebabkan kode yang terlalu berbelit-belit ke masalah yang dulu merupakan masalah sederhana,

Hampir selalu ada cara cepat dan mudah untuk melakukan hal-hal dengan Python tetapi kerumitan bisa lebih sulit untuk di cek setelah sistem mencapai ambang tertentu.

Singkatnya, keduanya memiliki sisi gelap dan keduanya memiliki kekuatan yang jelas. Namun, ketika berdesak-desakan di kedua komunitas Anda akan menemukan bahwa kekuatan satu mengarah ke sisi gelap yang lain dan sebaliknya.

Oleh karena itu perdebatan sengit tentang yang terbaik.

Newtopian
sumber
14

Jadi, Anda tahu semuanya tentang pengaturan visibilitas metode dan variabel? Ya, itu tidak ada lagi, semuanya publik. Ada konvensi penamaan dan nama mangling, tetapi semuanya benar-benar masih tersedia.

Bagian dari fleksibilitas Python berasal dari fakta bahwa Anda diperbolehkan melakukan hampir semua hal. Karena itu, filosofinya adalah bahwa orang harus tahu cara menggunakan API daripada API yang menegakkan bahwa metode digunakan dengan benar.

Alih-alih kelebihan metode, Anda memiliki variabel default. Jangan gunakan objek yang bisa berubah-ubah sebagai nilai default Anda.

# bad
def fL(x=[])
  x.append(1)
  print x
# good
def fN(x=None)
  if (x is None):
    x = []
  x.append(1)
  print x

fL()
fL()
fN()
fN()

Perbedaan antara variabel kelas dan contoh sangat halus ketika Anda pertama kali memulai.

class Obj(object):
   thing = "class variable"
   def __init__(self):
      self.thing1 = "instance variable"
      print self.thing, self.thing1

Itulah beberapa hal yang saya harus terbiasa ketika saya beralih.

unholysampler
sumber
1
+1 ringkasan yang baik dari beberapa hal, meskipun saya tahu itu dari sebelumnya
Anto
6

Nah, Python tidak memiliki antarmuka, memang memiliki metaclasses, dan memang memungkinkan mengetik bebek. Python memiliki daftar pemahaman, yang sangat kuat dan tidak ada di Jawa. Java memiliki sistem tipe kaya dengan banyak struktur data, dan Python hanya memiliki daftar. Jadi jika Anda memanfaatkan apa yang dimiliki Python alih-alih mencoba menciptakan kembali apa yang dimiliki Java di Python, Anda mungkin menulis kode Pythonic.

Namun sejauh kode OO berjalan, ada dasar-dasar gaya tertentu yang tidak boleh berubah dari bahasa ke bahasa: Anda harus selalu berusaha keras untuk menulis kode yang Pemalu dan KERING, baik saat Anda menulis dalam Applescript, Python, Java, atau C ++.

---- Edit ----

Seperti @delnan tunjukkan dengan pedant, sebenarnya ada LIMA tipe data komposit yang didefinisikan oleh Python pada level Kernel (daftar, dict, tuple, set, dan frozenset, menurut salinan saya "Python in a Nutshell"). Meskipun ini benar, sebenarnya tidak relevan dengan poin yang saya coba buat: Python dibangun berdasarkan daftar sebagai struktur data penting. Ya, Anda BISA menggunakan daftar sebagai tumpukan, tetapi Anda dapat menggunakan daftar yang sama persis sebagai antrian. Dan kemudian tumpukan lagi.

Java, di sisi lain, memiliki satu struktur data kernel (Array, menurut "The Java Pocket Guide), tetapi secara umum, Anda tidak dapat menyelesaikan banyak hal di Java tanpa mengimpor koleksi. Setelah Anda melakukannya, Anda memiliki akses ke perpustakaan tipe 'kaya' (yang saya maksud sangat kompleks) untuk mendapatkan fungsi yang sama dengan yang Anda miliki dengan daftar Python.

Tentu saja, kedua bahasa memiliki kelas dan Java memiliki antarmuka, tetapi sementara itu adalah tipe data komposit, mereka tidak benar-benar struktur data dalam arti buku teks.

Satu perbedaan adalah bahwa Anda tidak dapat memunculkan item dari Java Queue, dan Anda tidak bisa melewatkan objek Java Queue di suatu tempat yang mengharapkan Java Linked List. Jadi mungkin dengan "kaya" yang saya maksud sebenarnya adalah "kaku".

Jadi untuk menjelaskan apa yang saya maksud dengan mengatakan "Python hanya memiliki daftar", yang saya maksud adalah bahwa Anda dapat melakukan hampir semua yang perlu Anda lakukan dalam Python yang akan Anda lakukan dengan Java Collections menggunakan tipe Python Daftar. Jenis tunggal ini berfungsi sangat baik di Jawa.

Apa artinya ini bagi programmer Python? Ini berarti bahwa Anda dapat memanfaatkan tipe Daftar Python untuk menulis kode langsung yang sangat empuk tanpa menggunakan pustaka tambahan - dan kekesalan (yaitu, karakteristik menyampaikan nilai lebih dalam karakter yang lebih sedikit) adalah karakteristik inti dari kode "Pythonic" .

philosodad
sumber
Saya akrab dengan semua kecuali metaclasses, akan mencarinya. Terima kasih :)
Anto
7
-1 hingga Anda dapat menjelaskan yang berikut: (1) "Python hanya memiliki daftar" - Python memiliki banyak struktur data. Itu tidak memiliki tiga implementasi dari setiap struktur data tunggal yang pernah dikandung, tetapi masih tentang setiap satu kebanyakan orang akan membutuhkan. (2) Memanggil sistem tipe Java "kaya" adalah ejekan dari sistem tipe yang benar - benar canggih. Sebagai permulaan , lihat Haskell (98 tanpa ekstensi apa pun).
Maaf, ini tidak benar. Python memiliki dua struktur data: Daftar dan Kamus. Beberapa PERPUSTAKAAN Python mungkin memperluas struktur inti ini, tetapi itu tidak sama dengan mengatakan bahwa bahasa tersebut memilikinya.
philosodad
5
Itu sudah dua kali lebih banyak dari nama jawaban. Daftar ini berfungsi sebagai tumpukan. Set dan tupel juga built-in (berapa banyak struktur data built-in ke Jawa?) Ada juga modul di perpustakaan standar untuk (min-) tumpukan, deques, catatan tidak berubah dan array homogen yang padat (terbatas pada C jenis). Dan itu hanya dari atas kepala saya. Ya, sebagian besar dari mereka menggunakan daftar / dicts secara internal (namun, set tidak dicts dengan kunci yang tidak digunakan). Namun demikian, kebanyakan koleksi di Jawa - pada kenyataannya, dalam semua bahasa. Begitulah cara kerjanya.
1
Sekarang saya pikir saya mengerti poin yang Anda coba buat (dan menghapus downvote saya - yang saya tambahkan di tempat pertama karena bagian itu jelas salah seperti cara awalnya dinyatakan). Saya masih berpikir Anda perlu mempertimbangkan setidaknya dua struktur data (daftar sebagai urutan yang hampir universal dan dicts sebagai pemetaan yang hampir universal). Dan itu belum lagi berbagai iterator dan generator, yang saya gunakan paling tidak (dan bahkan lebih sering) sebagai daftar.