Sự khác nhau giữa nhóm Java Java OOP và người hâm mộ Pythonic OOP? [đóng cửa]


19

Tôi đã bắt đầu với ActionScript 2.0 và sau đó tiếp tục với Java. Tôi đã học, hoặc ít nhất là sử dụng, một loạt các ngôn ngữ kể từ đó, bao gồm cả Python (có lẽ là sở thích của tôi).

Tôi e rằng phong cách lập trình hướng đối tượng của tôi rất không đẹp mắt và giống như Java OOP với cú pháp Python. Điều gì làm cho Java like và Pythonic OOP khác nhau? Những điều mà các lập trình viên Java thường làm "không thực tế" khi viết mã hướng đối tượng trong Python?

Câu trả lời:


54

Đối với một anh chàng Java, Python là một người chơi vô chính phủ, nơi bất kỳ ai cũng có thể lấy một câu lạc bộ và bắt đầu hành hạ đầu của bạn.

Đối với một anh chàng Python, Java là một vũ trụ Orwellian, nơi bạn liên tục bị xiềng xích trước cái nhìn giảm dần của người khác về cách vũ trụ đánh dấu.

Sự thật là bất cứ điều gì bạn có thể làm trong một ngôn ngữ bạn có thể làm bằng ngôn ngữ khác một cách sạch sẽ. Tuy nhiên, như bạn đã đề cập, có sự khác biệt quan trọng trong cả hai cộng đồng về ý nghĩa của việc sạch sẽ .

Cách Java: Một hệ thống sạch là một hệ thống có ý nghĩa và không có gì khác, nó sẽ không cho phép các phần mở rộng hoặc sửa đổi đi ngược lại với bản chất của mục đích đã định và sẽ cố gắng thực thi những điều này càng nhiều càng tốt thông qua trình biên dịch. Tính linh hoạt có được thông qua việc chế tạo cẩn thận các giao diện đơn giản trong các cấu trúc nghiêm ngặt. Trong hộp cát của một người phải luôn luôn được giới hạn rõ ràng và vượt qua những điều này đã gặp phản hồi nhanh chóng từ trình biên dịch. Java cung cấp các phương tiện để xác định tĩnh các cấu trúc đối tượng và tạo các tương tác động từ các thể hiện của chúng. Khi tôi làm việc trong Java, tôi cố gắng khéo léo tạo ra các khối xây dựng cơ bản hướng tới một giải pháp chết não. Tôi chủ yếu làm việc từ dưới lên một khi tôi có một lý thuyết làm việc về cách giải quyết vấn đề.

Java sẽ có xu hướng sản xuất phần mềm lớn có thể bao trùm các nhóm lớn và cung cấp các công cụ và phương tiện để kiểm soát đàn. Nếu không được kiểm tra, điều này sẽ dẫn đến các đội rất tách rời hoạt động độc lập hướng tới một mục tiêu không rõ ràng hơn bao giờ hết. Cuối cùng, mỗi đội trở thành "raison d'être" của riêng mình và toàn bộ hệ thống trở nên loãng dần dẫn đến dự án chính. Những điều này có thể dẫn đến vượt chi phí cực lớn và các hệ thống phần mềm khổng lồ hoạt động và bảo trì kém.

Hầu như không bao giờ có một cách nhanh chóng và dễ dàng để làm mọi thứ trong Java, nhưng IDE và công cụ có sẵn để thực hiện các nhiệm vụ đau đớn chỉ bằng vài cú nhấp chuột.

Cách Python: Clean có nghĩa là súc tích và dễ đọc. Một hệ thống python tốt được thiết kế để cho phép bạn đi thẳng vào trung tâm của nó và tiết lộ những bí mật bên trong của nó theo cách mà bạn có thể hiểu từ mã về mục đích sử dụng và mục đích của nó. Nó cũng sẽ cho phép bạn thiết kế giải pháp của riêng mình xung quanh bằng cách mở rộng và / hoặc đóng gói thiết kế ban đầu để nó đi chính xác theo hướng của bạn. Python cung cấp phương tiện để tạo các mẫu đối tượng mà từ đó bạn có thể tự động thay đổi thể hiện để phù hợp với nhu cầu trong tay. Trong python tôi có xu hướng giải quyết vấn đề ngay lập tức và sau đó trải mã theo cấu trúc logic sao cho giải pháp cuối cùng vẫn đơn giản và dễ đọc nhất có thể. Trong python tôi có xu hướng làm việc từ trên xuống và quản lý sự phức tạp gia tăng thông qua cách tiếp cận phân chia và chinh phục.

Các nhóm Python sẽ có xu hướng sản xuất các hệ thống ánh sáng và rất nhanh trong việc cung cấp một giải pháp làm việc. Họ sẽ có xu hướng trở thành một nhóm đan chặt chẽ làm việc thay thế cho nhau trên bất kỳ phần nào của hệ thống xác nhận giải pháp của nhau mỗi khi họ có cơ hội. Chúng ăn lẫn nhau tạo ra một sức mạnh tổng hợp khá phấn khởi. Tuy nhiên, điều này tạo ra các đội khó mở rộng quy mô cho các hệ thống lớn hơn và thường xuyên chạm vào một loại trần kính. Giới thiệu các thành viên mới trong nhóm sẽ giúp ích nhưng sẽ mất một thời gian để kiến ​​thức được lan truyền đủ xung quanh để có thể cảm nhận được năng suất tăng thêm. Sau đó, nhóm trở nên chia rẽ và tổng quan liên tục trên toàn bộ hệ thống cũng như không khí của những ngày đầu. Điều này có thể dẫn đến mã quá phức tạp đối với những gì từng là một vấn đề đơn giản,

Hầu như luôn luôn có một cách nhanh chóng và dễ dàng để làm mọi thứ với Python nhưng sự phức tạp có thể khó kiểm tra hơn một khi hệ thống đạt đến một ngưỡng nhất định.

Nói tóm lại, cả hai đều có một mặt tối và cả hai đều có sức mạnh rõ ràng. Tuy nhiên, khi đi dọc theo cả hai cộng đồng, bạn sẽ thấy rằng sức mạnh của một người dẫn đến mặt tối của người kia và ngược lại.

Do đó các cuộc tranh luận sôi nổi là tốt nhất.


14

Vì vậy, bạn biết rằng toàn bộ về việc thiết lập khả năng hiển thị của các phương thức và biến? Vâng, những người không tồn tại nữa, mọi thứ đều công khai. Có những quy ước đặt tên và xáo trộn tên, nhưng mọi thứ vẫn thực sự có sẵn.

Một phần của tính linh hoạt của Python xuất phát từ thực tế đó là bạn được phép làm hầu hết mọi thứ. Do đó, triết lý là mọi người nên biết cách sử dụng API thay vì API thực thi rằng một phương thức được sử dụng đúng cách.

Thay vì quá tải phương thức, bạn có các biến mặc định. Đừng sử dụng các đối tượng có thể thay đổi làm giá trị mặc định của bạ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()

Sự khác biệt giữa các biến lớp và biến là rất tinh tế khi bạn lần đầu tiên bắt đầu.

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

Đó là một vài trong số những điều mà tôi phải làm quen khi thực hiện chuyển đổi.


1
+1 tóm tắt tốt về một số điều, mặc dù tôi biết những điều đó từ trước
Anto

6

Chà, Python không có giao diện, không có siêu dữ liệu và không cho phép gõ vịt. Python có khả năng hiểu danh sách, rất mạnh mẽ và không tồn tại trong Java. Java có một hệ thống kiểu phong phú với nhiều cấu trúc dữ liệu và Python chỉ có các danh sách. Vì vậy, nếu bạn đang tận dụng những gì Python có thay vì cố gắng tạo lại những gì Java có trong Python, có lẽ bạn đang viết mã Pythonic.

Nhưng theo như mã OO, có một số nguyên tắc cơ bản nhất định không nên thay đổi từ ngôn ngữ này sang ngôn ngữ khác: bạn nên luôn cố gắng viết mã đó là Shy và DRY, cho dù bạn đang viết bằng Applescript, Python, Java hay C ++.

----Chỉnh sửa----

Như @delnan chỉ ra về mặt giáo dục, thực sự có các kiểu dữ liệu tổng hợp FIVE được xác định bởi Python ở cấp Kernel (danh sách, dict, tuple, set và froundredet, theo bản sao "Python in a Nutshell" của tôi). Mặc dù điều này là đúng, nhưng nó thực sự không liên quan đến điểm tôi đang cố gắng thực hiện: Python xây dựng trên các danh sách dưới dạng cấu trúc dữ liệu thiết yếu. Có, bạn CÓ THỂ sử dụng danh sách dưới dạng ngăn xếp, nhưng bạn có thể sử dụng danh sách chính xác giống như hàng đợi. Và sau đó một chồng một lần nữa.

Mặt khác, Java có một cấu trúc dữ liệu hạt nhân (Mảng, theo "Hướng dẫn bỏ túi Java), nhưng sử dụng chung, bạn không thể thực hiện được nhiều việc trong Java mà không cần nhập các bộ sưu tập. Khi bạn làm điều đó, bạn có quyền truy cập đến thư viện loại 'giàu có' (theo nghĩa tôi có nghĩa là vô cùng phức tạp) để có cùng chức năng bạn có với danh sách của Python.

Tất nhiên, cả hai ngôn ngữ đều có các lớp và Java có giao diện, nhưng trong khi đó là các kiểu dữ liệu tổng hợp, chúng không thực sự là cấu trúc dữ liệu theo nghĩa sách giáo khoa.

Một điểm khác biệt là bạn không thể bật một mục từ Hàng đợi Java và bạn không thể vượt qua một đối tượng Hàng đợi Java ở nơi nào đó mong đợi Danh sách được liên kết Java. Vì vậy, có lẽ bởi "giàu" tôi thực sự có nghĩa là "cứng nhắc".

Vì vậy, để giải thích điều tôi muốn nói bằng cách nói "Python chỉ có danh sách", ý tôi là bạn có thể làm khá nhiều thứ bạn cần làm trong Python mà bạn sẽ làm với Bộ sưu tập Java bằng cách sử dụng loại Danh sách Pythons. Kiểu đơn này thực hiện công việc của rất nhiều loại trong Java.

Điều này có ý nghĩa gì với lập trình viên Python? Điều đó có nghĩa là bạn có thể tận dụng loại Danh sách Python để viết rất chính xác, mã trực tiếp mà không cần sử dụng các thư viện bổ sung - và tính chính xác (nghĩa là đặc tính truyền tải nhiều giá trị trong ít ký tự hơn) là một đặc điểm cốt lõi của mã "Pythonic" .


Tôi quen thuộc với tất cả trừ siêu dữ liệu, sẽ tìm kiếm chúng. Cảm ơn bạn :)
Anto

7
-1 cho đến khi bạn có thể giải thích các điều sau: (1) "Python chỉ có danh sách" - Python có rất nhiều cấu trúc dữ liệu. Nó không có ba triển khai của mọi cấu trúc dữ liệu từng được hình thành, nhưng vẫn là về mọi thứ mà hầu hết mọi người sẽ cần. (2) Gọi hệ thống kiểu Java là "giàu" là một sự nhạo báng của những hệ thống kiểu thực sự tinh vi đó. Để bắt đầu , hãy xem Haskell (98 mà không có bất kỳ tiện ích mở rộng nào).

Tôi xin lỗi, điều này không đúng. Python có chính xác hai cấu trúc dữ liệu: Danh sách và Từ điển. Một số LIBRAR Python có thể mở rộng các cấu trúc cốt lõi này, nhưng điều đó không giống như nói rằng ngôn ngữ có chúng.
philosodad

5
Đó là gấp đôi số tên câu trả lời. Danh sách tăng gấp đôi như ngăn xếp. Các bộ và bộ dữ liệu cũng được tích hợp sẵn (có bao nhiêu cấu trúc dữ liệu được tích hợp vào Java?) Ngoài ra còn có các mô-đun trong thư viện chuẩn cho (heap), deques, bản ghi không thay đổi và mảng đồng nhất được đóng gói chặt chẽ (giới hạn ở C các loại). Và đó chỉ là từ đỉnh đầu của tôi. Vâng, hầu hết những người sử dụng danh sách / dicts trong nội bộ (tuy nhiên, các bộ không phải là dicts với các khóa không sử dụng). Nhưng hầu hết các bộ sưu tập trong Java - trên thực tế, trong tất cả các ngôn ngữ. Đó là cách nó hoạt động.

1
Bây giờ tôi nghĩ rằng tôi hiểu điểm mà bạn đã cố gắng thực hiện (và loại bỏ downvote của tôi - mà tôi đã thêm vào ở vị trí đầu tiên vì phần đó hoàn toàn sai theo cách ban đầu được nêu). Tôi vẫn nghĩ rằng bạn cần xem xét ít nhất hai cấu trúc dữ liệu (liệt kê dưới dạng các chuỗi gần như phổ quát và các ký hiệu là ánh xạ gần như phổ quát). Và đó là không đề cập đến các trình lặp và trình tạo khác nhau, mà tôi sử dụng ít nhất là (và thậm chí nhiều hơn) thường xuyên như danh sách.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.