“Java OOP” ve “Pythonic OOP” arasındaki farklar nelerdir? [kapalı]


19

ActionScript 2.0 ile başladım ve sonra Java ile devam ettim. O zamandan beri Python (muhtemelen benim favorim) dahil olmak üzere bir grup dil ​​öğrendim ya da en azından kullandım.

Korkarım ki nesne yönelimli programlama tarzım çok kuralsız ve Python sözdizimine sahip Java OOP gibi. Java'yı ve Pythonic OOP'u birbirinden farklı kılan nedir? Java programcıları Python'da nesneye yönelik kod yazarken genellikle "unpythonically" ne yaparlar?

Yanıtlar:


54

Bir Java adamı için Python, herkesin bir kulüp kapıp kafanızı yönetmeye başlayabileceği anarşik bir oyun.

Python'lu bir adam için Java, bir başkasının evrenin nasıl geçtiğine dair azalan görüşüne sürekli olarak bağlandığınız bir Orwellian evrenidir.

Gerçek şu ki, bir dilde yapabileceğiniz her şey, diğer dilde yapabildiğiniz kadar temizdir. Ancak bahsettiğiniz gibi her iki toplumda da temiz ne anlama geldiğinde önemli bir fark vardır .

Java yolu: Temiz bir sistem, ne anlama geldiğini yapan ve başka hiçbir şey yapmayan sistemdir, amaçlanan amacın doğasına aykırı uzantılara veya değişikliklere izin vermez ve bunları derleyici aracılığıyla mümkün olduğunca zorlamaya çalışır. Esneklik, katı yapılar içinde basit arayüzlerin dikkatli bir şekilde hazırlanmasıyla elde edilir. Java'da kum kutusu her zaman açık bir şekilde sınırlandırılmalı ve bunları derleyiciden hızlı geri bildirim ile karşılamalıdır. Java, nesne yapılarını statik olarak tanımlamak ve bunların örneklerinden dinamik etkileşimler oluşturmak için araçlar sağlar . Java ile çalışırken akıllıca ölü beyin çözümüne doğru temel yapı taşları oluşturmaya çalışıyorum. Sorunun üstesinden gelmek için bir çalışma teorisim olduğunda çoğunlukla aşağıdan yukarıya çalışırım.

Java, büyük ekipleri kapsayabilen ve sürüyü kontrol altında tutmak için araçlar ve araçlar sağlayan büyük yazılımlar üretme eğiliminde olacaktır. İşaretlenmezse, bu çok bağımsız ekiplerin bağımsız olarak daha belirsiz bir hedefe doğru çalışmasına yol açacaktır. Sonunda her takım kendi "raison d'être" haline gelir ve bir bütün olarak sistem ana projeyi saptırmak için seyreltilir. Bunlar, aşırı maliyet aşımlarına ve kötü performans gösteren ve bakımını yapan büyük yazılım sistemlerine yol açabilir.

Java'da bir şeyler yapmak için neredeyse hiçbir zaman küçük ve hızlı bir yol yoktur, ancak IDE ve araç, sadece birkaç tık uzakta ağrılı görevleri yapmak için vardır.

Python yolu: Temiz, kısa ve kolay okunabilir anlamına gelir. İyi bir python sistemi, tam olarak kalbine ulaşmanıza izin vermek için tasarlanmıştır ve kodun amaçlanan kullanımını ve amacını anlayabileceğiniz şekilde en içteki sırları ortaya koyar. Aynı zamanda orijinal tasarımı genişleterek ve / veya kapsülleyerek kendi çözümünüzü tasarlamanıza izin verir, böylece tam olarak sizin yönünüze gider. Python, örneği eldeki ihtiyaçlara uyacak şekilde dinamik olarak değiştirebileceğiniz nesne şablonları oluşturmak için araçlar sağlar. Python problemi hemen ele almak ve daha sonra nihai çözüm olabildiğince basit ve okunabilir kalacak şekilde kodu mantıksal bir yapıya yaymak eğilimindedir. Python'da yukarıdan aşağıya çalışma ve artan karmaşıklıkları bir bölme ve fethetme yaklaşımıyla yönetme eğilimindeyim.

Python ekipleri ışık sistemleri üretme eğiliminde olacak ve çalışan bir çözüm sunmada çok hızlı olacaktır. Sistemin herhangi bir kısmında dönüşümlü olarak çalışan birbirine yakın bir grup olma eğilimindedirler. Birbirleriyle beslenirler, oldukça heyecan verici bir sinerji yaratırlar. Ancak bu, daha büyük sistemlere ölçeklenmesi zor olan ve genellikle bir çeşit cam tavana çarpan takımlar yaratır. Ekibe yeni üyeler eklemek yardımcı olacaktır, ancak bilginin ekstra üretkenliğin hissedilmesi için yeterince yayılması biraz zaman alacaktır. Ekip daha sonra bölünür ve tüm sisteme sürekli bakış ilk günlerin atmosferi gibi seyreltilir. Bu, bir zamanlar basit bir problem olana aşırı kıvrımlı bir kod getirebilir,

Python ile işleri yapmanın neredeyse her zaman hızlı ve kolay bir yolu vardır, ancak sistem belirli bir eşiğe ulaştığında karmaşıklığı kontrol altında tutmak daha zor olabilir.

Kısacası, her ikisinin de karanlık bir tarafı vardır ve her ikisinin de net bir gücü vardır. Bununla birlikte, her iki topluluk boyunca prodüksiyon yaparken, birinin gücünün diğerinin karanlık tarafına yol açtığını ve tam tersini göreceksiniz.

Bu nedenle ısıtılan tartışmalar en iyisidir.


14

Yani yöntemlerin ve değişkenlerin görünürlüğünü ayarlama hakkında her şeyi biliyor musunuz? Evet, bunlar artık yok, her şey halka açık. Adlandırma kuralları ve ad yönetimi var, ancak her şey hala mevcut.

Python'un esnekliğinin bir kısmı, neredeyse her şeyi yapmanıza izin verildiği gerçeğinden geliyor. Bu nedenle, felsefe, insanların bir yöntemin uygun şekilde kullanılmasını zorunlu kılan API yerine API'yı nasıl kullanacaklarını bilmeleri gerektiğidir.

Yöntem aşırı yüklemeleri yerine, varsayılan değişkenleriniz vardır. Değişken nesneleri varsayılan değeriniz olarak kullanmayın.

# 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()

İlk başladığınızda sınıf ve örnek değişkenler arasındaki fark çok belirgindir.

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

Bunlar, geçiş yaptığımda alışmam gereken şeylerden birkaçı.


1
Bazılarının iyi bir özetini + 1'ledim, ancak daha önce bunları biliyordum
Anto

6

Python'un arayüzleri yok, metasınıfları var ve ördek yazmasına izin veriyor. Python, çok güçlü ve Java'da bulunmayan liste kavrayışlarına sahiptir. Java, çok sayıda veri yapısına sahip zengin bir tür sistemine sahiptir ve Python'un sadece listeleri vardır. Bu nedenle, Java'nın Python'da olanı yeniden yaratmaya çalışmak yerine Python'un sahip olduğu şeylerden yararlanıyorsanız, muhtemelen Pythonic kodu yazıyorsunuzdur.

Ancak OO kodu gittikçe, dilden dile değişmemesi gereken belirli stil temelleri vardır: Applescript, Python, Java veya C ++ 'da yazıyor olun, her zaman Utangaç ve DRY olan bir kod yazmaya çalışmalısınız.

----Düzenle----

@Delnan bilgeliksel olarak işaret ettiği gibi, aslında Python tarafından Çekirdek düzeyinde tanımlanmış BEŞ kompozit veri türleri vardır ("Özetle Python" kopyama göre, liste, dikte, tuple, set ve frozenset). Bu doğru olsa da, aslında yapmaya çalıştığım nokta ile ilgili değil: Python, temel veri yapısı olarak listeler üzerine kuruludur. Evet, bir listeyi yığın olarak kullanabilirsiniz, ancak listeyi sıra ile tam olarak kullanabilirsiniz . Ve sonra tekrar bir yığın.

Öte yandan Java, bir çekirdek veri yapısına ("Java Pocket Guide'a göre Dizi) sahiptir, ancak genel kullanımda, koleksiyonları içe aktarmadan Java'da fazla bir şey yapamazsınız. Python'un listesiyle aynı işlevselliği elde etmek için 'zengin' (bu anlamda son derece karmaşık) demek istediğim bir tür kütüphaneye.

Tabii ki, her iki dilin sınıfları ve Java'nın arayüzleri vardır, ancak bunlar bileşik veri türleri olsa da, aslında bir ders kitabı anlamında veri yapıları değildir.

Bir fark, bir Java Kuyruğundan bir öğe açamamanız ve bir Java Kuyruk nesnesini Java Bağlantılı Liste bekleyen bir yere iletememenizdir. Belki de "zengin" derken aslında "katı" demek istiyorum.

Yani "Python'un sadece listeleri var" diyerek ne demek istediğimi açıklamak için, Python'da Pythons List türünü kullanarak Java Koleksiyonlar ile yapmanız gereken hemen hemen her şeyi yapabileceğiniz anlamına gelir. Bu tek tür, Java'da birçok türün çalışmasını yapar.

Bu Python programcısı için ne anlama geliyor? Bu, ek kütüphaneler kullanmadan çok özlü, doğrudan kod yazmak için Python Listesi türünden yararlanabileceğiniz anlamına gelir - ve özlülük (yani, daha az karakterde daha fazla değer taşıma özelliği) "Pythonic" kodunun temel bir özelliğidir .


Metasınıflar dışında her şeyi tanıyorum, onları arayacağım. Teşekkür ederim :)
Anto

7
-1 aşağıdakileri açıklayana kadar: (1) "Python'un listeleri vardır" - Python'un zengin veri yapıları vardır. Şimdiye kadar tasarlanan her veri yapısının üç uygulaması yoktur, ancak yine de çoğu insanın ihtiyaç duyacağı her biri hakkında. (2) Java'nın tür sistemi "zengin" olarak adlandırmak, gerçekten sofistike tip sistemlerin alay konusu . Yeni başlayanlar için Haskell'e bakın (herhangi bir uzantı olmadan 98).

Üzgünüm, bu doğru değil. Python'un tam olarak iki veri yapısı vardır: Listeler ve Sözlükler. Bazı Python KÜTÜPHANELERİ bu temel yapıları genişletebilir, ancak bu dilin onlara sahip olduğunu söylemekle aynı şey değildir.
philosodad

5
Bu zaten cevap adlarının iki katıdır. Liste yığın olarak iki katına çıkar. Setler ve tuples de yerleşiktir (Java'ya kaç veri yapısı yerleşiktir?) Ayrıca standart kütüphanede (min-) yığınlar, deques, değiştirilemez kayıtlar ve sıkıca paketlenmiş homojen diziler için modüller de vardır (C ile sınırlıdır) tipleri). Ve bu sadece kafamın tepesinden. Evet, bu listelerin çoğu dahili olarak listeler / diktler kullanır (ancak, kümeler kullanılmayan tuşlarla dikte değildir). Ancak çoğu Java'daki koleksiyonlar da - aslında tüm dillerde. İşte böyle çalışır.

1
Şimdi, yapmaya çalıştığınız noktayı anladığımı düşünüyorum (ve ilk etapta eklediğim downvote'umu kaldırdım - çünkü bu kısım başlangıçta belirtildiği gibi basit yanlıştı ). Hala en az iki veri yapısını (neredeyse evrensel diziler olarak listeler ve neredeyse evrensel eşlemeler olarak dikte etmeyi) düşünmeniz gerektiğini düşünüyorum. Ve bu, en azından listeler olarak en sık kullandığım (ve muhtemelen daha da fazla) çeşitli yineleyiciler ve jeneratörlerden bahsetmiyor.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.