Відмінності між "Java OOP" та "Pythonic OOP"? [зачинено]


19

Я почав з ActionScript 2.0, а потім продовжив роботу з Java. Я з того часу вивчив або принаймні використовував купу мов, включаючи Python (напевно, мій улюблений).

Боюся, що мій стиль об’єктно-орієнтованого програмування дуже непітонічний, і більше схожий на Java OOP з синтаксисом Python. Що відрізняє Java від подібних та Pythonic OOP? Які речі Java-програмісти часто роблять "непітонічно" під час написання об'єктно-орієнтованого коду в Python?

Відповіді:


54

Для хлопця Java Python - це анархічний гравець, де кожен бажаючий може схопити клуб і почати маліти голову.

Для хлопця з Python Java - це орувелівський всесвіт, де ви постійно забиті на чужий зменшуючий погляд на те, як клічуть Всесвіт.

Правда - це все, що ти можеш зробити на одній мові, а в іншій зробити так само чисто. Однак, як ви вже згадували, існують важливі відмінності в обох громадах щодо того, які чисті засоби.

Спосіб Java: чиста система - це те, що робить те, що призначено, і нічого іншого, вона не дозволить розширень або модифікацій, які суперечать природі передбачуваної мети, і спробує їх максимально застосувати через компілятор. Гнучкість досягається ретельним складанням простих інтерфейсів у строгих структурах. У Java один пісочний ящик завжди повинен бути чітко обмежений і переступати з ним, швидко відповідати компілятором. Java надає засоби для статичного визначення об'єктних структур та створення динамічних взаємодій з їх примірників. Коли я працюю на Яві, я намагаюся вміло створити основні будівельні блоки для мертвого рішення мозку. Я здебільшого працюю знизу вгору, коли маю робочу теорію щодо вирішення проблеми.

Java, як правило, виробляє велике програмне забезпечення, яке може охоплювати великі команди та надає інструменти та засоби, щоб тримати стадо під контролем. Якщо це буде без нагляду, це призведе до того, що дуже чіткі команди працюватимуть незалежно для досягнення незрозумілої мети. Врешті-решт кожна команда стає власною «raison d'être», і система в цілому стає розбавленою, відводячи головний проект. Це може призвести до надзвичайних перевитрат витрат та величезних програмних систем, які працюють погано та працюють.

Майже ніколи не існує невеликого швидкого та простого способу робити речі на Java, але IDE та інструменти є для того, щоб зробити болісні завдання лише за кілька кліків.

Спосіб Python: Clean означає стислий і легко читабельний. Хороша система пітонів розроблена так, щоб ви могли потрапити до її серця і розкриває її найпотаємніші таємниці таким чином, щоб ви могли зрозуміти з коду передбачуване використання та призначення його. Це також дозволить вам розробити власне рішення навколо, розширивши та / або інкапсулювавши оригінальний дизайн так, щоб він ішов саме у вашому напрямку. Python надає засоби для створення шаблонів об'єктів, з яких ви можете динамічно змінювати екземпляр, щоб відповідати потребам. У python я схильний вирішувати проблему одразу, а потім поширюю код у логічній структурі таким чином, що остаточне рішення залишається настільки ж простим і читабельним, як може бути. У python я схильний працювати зверху вниз і керувати збільшеннями складності за допомогою підходу «ділити і перемогти».

Команди Python прагнуть виробляти легкі системи та будуть дуже швидкими в наданні робочого рішення. Вони будуть, як правило, тісними в'язаними зв'язками, що працюють взаємозамінно в будь-якій частині системи, що підтверджує рішення один одного, кожен шанс, який вони отримають. Вони живляться один одним, створюючи синергію, яка досить хвилює. Однак це створює команди, які важко масштабувати до великих систем і часто потрапляють у своєрідну скляну стелю. Представлення нових членів команди допоможе, але знадобиться певний час, щоб знання поширилися навколо, щоб відчути додаткову продуктивність. Потім команда розбивається, і постійний огляд всієї системи розбавляє, як і атмосфера перших днів. Це може призвести до занадто заплутаного коду до того, що колись було простою проблемою,

Майже завжди є швидкий і простий спосіб зробити речі з Python, але складність може бути важче контролювати, як тільки система досягне певного порогу.

Коротше кажучи, обидва мають темну сторону і обидва мають чітку міцність. Однак, просуваючись по обох спільнотах, ви побачите, що сила однієї веде до темної сторони іншої та навпаки.

Звідси гарячі дебати щодо того, що найкраще.


14

Отже, ви знаєте, що вся справа в налаштуванні наочності методів і змінних? Так, таких більше не існує, все публічно. Існують конвенції щодо імен та керування іменами, але все дійсно все ще доступно.

Частина гнучкості Python випливає з того факту, що вам дозволяється робити майже все. Через це філософія полягає в тому, що люди повинні знати, як використовувати API, а не API, що вимагає правильного використання методу.

Замість перевантаження методу у вас є змінні за замовчуванням. Не використовуйте змінні об'єкти як значення за замовчуванням.

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

Різниця між змінними класу та екземпляра дуже тонка при першому запуску.

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

Це декілька речей, до яких мені довелося звикнути, коли перемикався.


1
+1 хороший підсумок деяких речей, хоча я знав їх раніше
Анто,

6

Ну, Python не має інтерфейсів, має метакласи та дозволяє вводити качок. У Python є списки розумінь, які дуже потужні і не існують на Java. У Java є система багатого типу з великою кількістю структур даних, а у Python просто списки. Отже, якщо ви використовуєте те, що має Python, замість того, щоб намагатися відтворити те, що має Java в Python, ви, ймовірно, пишете Pythonic-код.

Але що стосується коду OO, є певні основи стилю, які не повинні змінюватися від мови до мови: ви завжди повинні прагнути писати код Shy і DRY, чи ви пишете в Applescript, Python, Java або C ++.

---- Редагувати ----

Як педантично вказує @delnan, насправді є П'ять складених типів даних, визначених Python на рівні ядра (список, диктант, кортеж, набір та заморожений набір, відповідно до моєї копії "Python in the Nutshell"). Хоча це правда, це насправді не стосується моменту, який я намагаюся зробити: Python будує списки як основну структуру даних. Так, ви можете використовувати список як стек, але ви можете використовувати такий самий список, як і в черзі. А потім знову стек.

Java, з іншого боку, має одну структуру даних ядра (масив, відповідно до "Посібника по кишені Java), але в загальному використанні ви не можете багато зробити в Java без імпорту колекцій. Після цього ви отримаєте доступ до "багатої" (в цьому сенсі я маю на увазі надзвичайно складну) бібліотеку типів, за допомогою якої можна отримати таку ж функціональність, яку ви мали у списку Python.

Звичайно, обидві мови мають класи, а у Java є інтерфейси, але, хоча це комбіновані типи даних, вони насправді не є структурами даних у сенсі підручника.

Однією з різниць є те, що ви не можете перенести елемент з черги на Java і не можете передати об’єкт Java Queue кудись, де очікує список пов’язаних з Java. Тому, мабуть, під "багатим" я маю на увазі "жорсткий".

Отже, щоб пояснити, що я маю на увазі, кажучи "Python просто має списки", я маю на увазі те, що ви можете зробити майже все, що вам потрібно зробити в Python, що ви зробили б з колекціями Java, використовуючи тип списку Pythons. Цей єдиний тип виконує роботу дуже багатьох типів на Java.

Що це означає для програміста Python? Це означає, що ви можете використовувати тип списку Python для того, щоб писати дуже пікантний, прямий код без використання додаткових бібліотек - і жалюгідність (тобто характеристика передачі більшої кількості меншої кількості символів) є основною характеристикою коду "Pythonic" .


Я знайомий з усіма, крім метакласів, буду їх шукати. Дякую :)
Anto

7
-1, поки ви не зможете пояснити наступне: (1) "Python просто має списки" - Python має безліч структур даних. У ньому немає трьох реалізацій кожної єдиної структури даних, коли-небудь задуманої, але все-таки про кожну, яка найбільше потребуватиме людей. (2) Називання системи типу Java "багатою" - це насмішка над тими дійсно складними системами типу. Для початку подивіться на Haskell (98 без будь-яких розширень).

Вибачте, це просто не так. У Python є рівно дві структури даних: Списки та словники. Деякі бібліотеки Python можуть поширювати ці основні структури, але це не те саме, що говорити про те, що мова їх має.
philosodad

5
Це вже вдвічі більше, ніж імена відповідей. Список подвоюється як стек. Набори та кортежі також вбудовані (скільки структур даних вбудовано в Java?) У стандартній бібліотеці також є модулі для (min-) купи, deques, незмінні записи та щільно упаковані однорідні масиви (обмежено на C типи). І це просто з моєї голови. Так, більшість із них використовує списки / дикти внутрішньо (однак, набори не є диктами з невикористаними ключами). Але так є більшість колекцій на Java - насправді на всіх мовах. Ось як це працює.

1
Тепер я думаю, що я розумію точку, яку ви намагалися зробити (і усунув мій нижній запис, який я додав, в першу чергу, тому що ця частина була явно неправильною так, як це було спочатку зазначено). Я все ще думаю, що вам потрібно враховувати принаймні дві структури даних (списки як майже універсальні послідовності, а дикти - як майже універсальні відображення). І це не кажучи про різні ітератори та генератори, які я використовую принаймні так само (і, можливо, ще більше) як списки.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.