Różnice między „Java OOP” a „Pythonic OOP”? [Zamknięte]

19

Zacząłem od ActionScript 2.0, a następnie kontynuowałem z Javą. Od tego czasu nauczyłem się lub przynajmniej używałem wielu języków, w tym Python (prawdopodobnie mój ulubiony).

Obawiam się, że mój styl programowania obiektowego jest jednak bardzo mało mityczny i bardziej przypomina Java OOP ze składnią Pythona. Co wyróżnia Java i Pythonic OOP od siebie? Co robią programiści Java często „nietytonicznie”, pisząc kod zorientowany obiektowo w Pythonie?

Anto
źródło

Odpowiedzi:

54

Dla gościa z Javy Python jest anarchiczną zabawą, w której każdy może złapać klub i zacząć manipulować głową.

Dla faceta Python Java jest orwellowskiego wszechświat, w którym stale przykuty do czyimś zmniejsza widok tego, jak kleszcza wszechświata.

Prawda jest wszystkim, co możesz zrobić w jednym języku, możesz zrobić w drugim równie czysto. Jednak, jak wspomniałeś, w obu społecznościach istnieje istotna różnica co do tego, co oznacza czyste .

Sposób Java: czysty system to taki, który robi to, co jest przeznaczone i nic więcej, nie pozwoli rozszerzeń ani modyfikacji, które są sprzeczne z charakterem zamierzonego celu i będzie próbował je egzekwować w jak największym stopniu za pośrednictwem kompilatora. Elastyczność uzyskuje się poprzez staranne wykonanie prostych interfejsów w ścisłych strukturach. W Javie piaskownica zawsze powinna być wyraźnie ograniczona, a przekroczenie ich spotkało się z szybkim sprzężeniem zwrotnym z kompilatora. Java zapewnia środki do statycznego definiowania struktur obiektów i tworzenia dynamicznych interakcji z ich wystąpień. Kiedy pracuję w Javie, staram się sprytnie tworzyć podstawowe elementy składowe w kierunku rozwiązania martwego mózgu. Przeważnie pracuję oddolnie, gdy mam już roboczą teorię, jak rozwiązać problem.

Java będzie produkować duże oprogramowanie, które może obejmować duże zespoły oraz zapewnia narzędzia i środki do kontrolowania stada. Jeśli pozostanie niezaznaczone, doprowadzi to do tego, że bardzo oderwane zespoły będą działać niezależnie w kierunku coraz bardziej niejasnego celu. W końcu każda drużyna staje się własną „raison d'être”, a system jako całość ulega rozcieńczeniu, prowadząc na manowce główny projekt. Mogą one prowadzić do skrajnych przekroczenia kosztów i ogromnych systemów oprogramowania, które wykonują i utrzymują słabo.

Prawie nigdy nie ma małego, szybkiego i łatwego sposobu na robienie rzeczy w Javie, ale IDE i oprzyrządowanie służą do wykonywania bolesnych zadań zaledwie kilkoma kliknięciami.

Sposób w języku Python: czysty oznacza zwięzły i czytelny. Dobry system python został zaprojektowany tak, abyś mógł dostać się do jego serca i ujawnić jego najskrytsze sekrety w sposób, który można zrozumieć z kodu zamierzonego zastosowania i celu. Pozwoli również na zaprojektowanie własnego rozwiązania poprzez rozszerzenie i / lub zamknięcie oryginalnego projektu, tak aby działał dokładnie w twoim kierunku. Python zapewnia środki do tworzenia szablonów obiektów, z których można dynamicznie zmieniać instancję w celu dopasowania do potrzeb. W Pythonie mam tendencję do natychmiastowego rozwiązania problemu, a następnie rozłożenia kodu w logicznej strukturze, dzięki czemu ostateczne rozwiązanie pozostaje tak proste i czytelne, jak to tylko możliwe. W Pythonie mam tendencję do pracy z góry na dół i zarządzania złożonością wzrostu poprzez podejście dziel i zwyciężaj.

Zespoły Python będą miały tendencję do produkowania lekkich systemów i bardzo szybko dostarczą działające rozwiązanie. Będą raczej zwartą grupą działającą zamiennie na dowolnej części systemu, sprawdzając nawzajem swoje rozwiązania przy każdej okazji. Żywią się nawzajem, tworząc synergię, która jest dość ekscytująca. Tworzy to jednak zespoły, które trudno skalować do większych systemów i często uderzają w coś w rodzaju szklanego sufitu. Wprowadzenie nowych członków do zespołu pomoże, ale zajmie to trochę czasu, zanim wiedza rozprzestrzeni się na tyle, aby odczuć dodatkową wydajność. Zespół zostaje podzielony, a stały przegląd całego systemu osłabia się, podobnie jak atmosfera z pierwszych dni. Może to prowadzić do nadmiernie skomplikowanego kodu tego, co kiedyś było prostym problemem,

Jest prawie zawsze szybki i łatwy sposób robić rzeczy z Pythona, ale złożoność może być trudniejsze do utrzymania w ryzach gdy system osiągnie określony próg.

Krótko mówiąc, oba mają ciemną stronę i oba mają wyraźną siłę. Jednakże, popychając wzdłuż obu społeczności, przekonasz się, że siła jednej prowadzi do ciemnej strony drugiej i odwrotnie.

Stąd ożywione debaty na temat tego, który jest najlepszy.

Newtopian
źródło
14

Więc wiesz wszystko o ustawianiu widoczności metod i zmiennych? Tak, one już nie istnieją, wszystko jest publiczne. Istnieją konwencje nazewnictwa i zmiany nazw, ale wszystko jest nadal dostępne.

Część elastyczności Pythona wynika z faktu, że możesz robić prawie wszystko. Ze względu, że filozofia jest taka, że ​​ludzie powinni wiedzieć, jak korzystać z API zamiast egzekwującego API, że metoda jest właściwie wykorzystywany.

Zamiast przeciążeń metody masz zmienne domyślne. Nie używaj zmiennych obiektów jako wartości domyślnej.

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

Różnica między zmiennymi klasy i instancji jest bardzo subtelna podczas pierwszego uruchomienia.

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

To tylko niektóre z rzeczy, do których musiałem się przyzwyczaić, kiedy dokonałem zmiany.

unholysampler
źródło
1
+1 dobre podsumowanie niektórych rzeczy, choć znałem je wcześniej
Anto
6

Cóż, Python nie ma interfejsów, ma metaklasy i pozwala na pisanie kaczek. W Pythonie dostępne są listy, które są bardzo wydajne i nie istnieją w Javie. Java ma bogaty system typów z dużą ilością struktur danych, a Python ma tylko listy. Więc jeśli wykorzystujesz to, co ma Python, zamiast próbować odtworzyć to, co Java ma w Pythonie, prawdopodobnie piszesz kod w języku Python.

Ale jeśli chodzi o kod OO, istnieją pewne podstawy stylu, które nie powinny zmieniać się z języka na język: zawsze powinieneś starać się pisać kod, który jest Nieśmiały i SUCHY, niezależnie od tego, czy piszesz w Applescript, Python, Java lub C ++.

----Edytować----

Jak pedantycznie wskazuje @delnan, w rzeczywistości istnieje PIĘĆ typów danych złożonych zdefiniowanych przez Pythona na poziomie jądra (lista, dict, krotka, zestaw i zamrożony, zgodnie z moją kopią „Python w pigułce”). Chociaż jest to prawda, nie ma to istotnego znaczenia do tego, co próbuję zrobić: Python opiera się na listach jako podstawowej strukturze danych. Tak, możesz użyć listy jako stosu, ale możesz użyć dokładnie tej samej listy jako kolejki. A potem znowu stos.

Z drugiej strony Java ma jedną strukturę danych jądra (tablicę, zgodnie z „The Java Pocket Guide”), ale w powszechnym użyciu nie można wiele zrobić w Javie bez importowania kolekcji. Gdy to zrobisz, masz dostęp do „bogatej” (w tym sensie mam na myśli niezwykle złożoną) biblioteki typu, za pomocą której można uzyskać taką samą funkcjonalność, jak w przypadku listy Pythona.

Oczywiście oba języki mają klasy, a Java ma interfejsy, ale chociaż są to złożone typy danych, to tak naprawdę nie są strukturami danych w sensie podręcznikowym.

Jedną różnicą jest to, że nie można wstawić elementu z kolejki Java i nie można przekazać obiektu kolejki Java w miejscu, w którym oczekuje się listy połączonej z Javą. Być może przez „bogaty” rozumiem „sztywny”.

Aby wyjaśnić, co mam na myśli mówiąc „Python po prostu ma listy”, mam na myśli to, że możesz zrobić prawie wszystko, co musisz zrobić w Pythonie, co zrobiłbyś z kolekcjami Java przy użyciu typu Listy Pythonów. Ten pojedynczy typ działa w Javie bardzo wielu typów.

Co to oznacza dla programisty Python? Oznacza to, że możesz użyć typu Python List do napisania bardzo zwięzłego, bezpośredniego kodu bez użycia dodatkowych bibliotek - a zwięzłość (to jest cecha przekazywania większej wartości w mniejszej liczbie znaków) jest podstawową cechą kodu „Pythonic” .

filozofodad
źródło
Znam wszystkie oprócz metaklas, sprawdzę je. Dziękuję :)
Anto
7
-1, dopóki nie wyjaśnisz, co następuje: (1) „Python po prostu ma listy” - Python ma wiele struktur danych. Nie ma trzech implementacji każdej pojedynczej struktury danych, jaką kiedykolwiek wymyślono, ale wciąż prawie każdej, której większość ludzi kiedykolwiek będzie potrzebować. (2) Nazywanie systemu typu Java „bogatym” jest kpiną z tych naprawdę wyrafinowanych systemów typu. Na początek spójrz na Haskell (98 bez żadnych rozszerzeń).
Przepraszam, to po prostu nieprawda. Python ma dokładnie dwie struktury danych: Listy i Słowniki. Niektóre BIBLIOTEKI Python mogą rozszerzyć te podstawowe struktury, ale to nie to samo, co stwierdzenie, że język je ma.
philosodad
5
To już dwa razy więcej niż imiona odpowiedzi. Lista podwaja się jako stos. Wbudowane są również zestawy i krotki (ile struktur danych jest wbudowanych w Javę?) Istnieją również moduły w standardowej bibliotece dla (min-) hałd, deques, niezmiennych zapisów i ciasno upakowanych jednorodnych tablic (ograniczone do C typy). I to tylko z czubka mojej głowy. Tak, większość z nich korzysta wewnętrznie z list / nagrań (jednak zestawy nie są nagraniami z nieużywanymi kluczami). Podobnie jak większość kolekcji w Javie - w rzeczywistości we wszystkich językach. Tak to działa.
1
Teraz myślę, że rozumiem punkt, który próbowałeś poruszyć (i usunąłem mój głos negatywny - który dodałem w pierwszej kolejności, ponieważ ta część była po prostu błędna w pierwotnym brzmieniu). Nadal uważam, że należy wziąć pod uwagę co najmniej dwie struktury danych (listy jako prawie uniwersalne sekwencje i dyktusy jako prawie uniwersalne odwzorowania). Nie wspominając już o różnych iteratorach i generatorach, których używam przynajmniej tak często (a prawdopodobnie jeszcze częściej) jako list.