Nên chọn ngôn ngữ nào để học OOP

  1. Nếu công việc của bạn ý nằm trong ecosystem của Windows thì C# không nằm trong mục không nên bắt đầu. Mình cũng có nói rồi mà.
  2. Mình thậm chí nói Python là ngôn ngữ nên học khi bắt đầu học lập trình nói chung chứ không riêng gì khi học OOP, dĩ nhiên là nhận định cá nhân thôi, vì tính đơn giản, dễ đọc, dễ đọc, dễ hiểu và tạo hứng thú khi học của nó chứ không chỉ là vì nó hỗ trợ multi-paradigm.

Vậy là bạn lại đem cách tư duy của ngôn ngữ khác vào với Python rồi. Đúng như bạn nói, không một attribute nào trong Python thực sự là non-public, thay vào đó là convention [1] giúp lập trình viên chọn biến nào là public (normal) hay non-public ( with leading underscore _ ) và những lập trình viên sau này đọc lại code hiểu. Điều này ép lập trình viên phải thận trọng hơn, suy nghĩ nhiều hơn trong quá trình xây dựng app.

[1] https://www.python.org/dev/peps/pep-0008/#designing-for-inheritance

các NNLT OOP thông dụng khác đều có public/protected/private, tự dưng Python lại ko có, OOP nửa mùa còn hơn C++ nữa :V Thêm __ vô trước tên biến là các ltv phải tự biến tấu để có cái tính năng giấu data này, ông Python kêu ko cần giấu data nhưng thực tế lại rất cần :V

câu hỏi là ngôn ngữ nào để học OOP mà ông xếp Python lên trên C# thì kì quá. Thay vì xếp C# ở list ko nên sao ko quẳng nó lên list “có” nên, thay vì nói nếu chỉ lập trình trên Windows sao ko nói chưa lập trình trên Linux, dìm hàng C# quá trong khi nó là “clone” Java nổi tiếng về OOP.

OOP thì cứ Java và C# mà phang thôi. Vì sao á ? Vì nó nhiều tài liệu :v:, mỗi nơi viết mỗi kiểu đọc nhiều là nó tự thấm. M chưa bao giờ đụng C++ OOP nhưng mà thấy cãi nhau thế này tức là nó phức tạp rồi bạn, học 1 cái mới mà đụng ngay đến cái phức tạp thì nãn lắm :smiley:.

Bạn có thể cho mình ví dụ use-case cụ thể trong việc C#/Java hay C++ có private/protect/public để giải quyết 1 công việc mà Python không thể giải quyết không? Mình làm việc với Python mà chưa bao giờ gặp phải vấn đề này cả.

Theo mình hiểu, Method Visibility hay Access Modifiers không ảnh hưởng tới tới cách thức thực thì mà chỉ ảnh hưởng tới cách thức mà method/variable đó được gọi[1].

Việc không cho C# vào danh sách không phải mình đánh giá thấp C#, chỉ là xét trên mối tương quan giữa nền tảng mà bạn ấy có thể hướng tới. Với mình không có cái gọi là bảng xếp hạng ngôn ngữ nào trên ngôn ngữ nào, chỉ là việc “using right tools for the right job”, và vì Python là ngôn ngữ mà mình thấy đơn giản, phù hợp cho người mới học lập trình nhất chứ mình không nói đến nó hỗ trợ lập trình OOP tốt hơn hay kém hơn những ngôn ngữ khác.

Mình thấy các bạn tranh luận về việc OOP phải thế này, OOP phải thế khác, Polymorphism phải như vậy, phải như kia, hay ngôn ngữ này hỗ trợ tốt cái này trong OOP hơn ngôn ngữ kia, do đó học ngôn ngữ này tốt hơn… Mình thấy suy nghĩ như vậy là chưa đúng, OOP được ưa chuộng là do nó gần gũi với cách thức tư duy của con người nhất, nhưng suy cho cùng nó cũng chỉ là một mô hình, định hướng cho lập trình viên để giải quyết 1 bài toán cụ thể. Thậm chí, gần đây OOP nhận nhiều chỉ trích từ chính thiết kế của nó [2.3.4]

[1] https://stackoverflow.com/questions/643775/private-methods-and-properties-vs-public-ones-regarding-their-memory-footprints?lq=1
[2] http://www.oocities.org/tablizer/myths.htm
[3] https://medium.com/@cscalfani/goodbye-object-oriented-programming-a59cda4c0e53
[4] https://news.ycombinator.com/item?id=18381640
[5] bonus: Google keyword: banana-gorilla-jungle problem

cái pubic/private ko ảnh hưởng tới code chạy thế nào nhưng cú pháp viết ra rất mù mờ ko trong sáng. Python nó nửa nạc nửa mỡ, nửa OOP nửa hàm, ví dụ như tại sao method nào cũng phải có cái self ở trỏng, giống như code OOP kiểu C vậy. Ko ảnh hưởng gì nhưng viết rất là đau mắt mỏi tay. Bất tiện như vậy tại sao lại cho ưu tiên hơn C# :dizzy_face: À ngoài ra bản thân nó còn có vụ mixin gì đó rất kì lạ hay kì diệu :V Bản thân nó là script nên OOP trong Python khá lỏng lẻo ko giống OOP “truyền thống”. Mới học thì nên học cái truyền thống trước :V

ví dụ thế này:

class A:
    def print(self):
        print("A")
class B:
    def print(self):
        print("B")
class C:
    pass
        
p = [A(), B(), C()]
p[2].__dict__['print'] = lambda: print("C")
p[0].print()
p[1].print()
p[2].print()

cả 2 đều in ra được, A và B chả liên quan tới nhau, vậy cần gì tới đa hình nữa :V Thêm cái nữa nhìn 2 chữ “self” là thấy ngứa mắt rồi :joy: Thêm cái nữa 1 object lúc nào cũng thêm bớt tính năng vào được rất là dị hợm :V

2 Likes

Nếu tranh cãi vậy thì đến sang năm cũng không hết cái để nói. Java/C# cũng có điểm không tuân theo nguyên tắc của OOP: primitive data types, nhưng điều đó không làm lập trình viên muốn học OOP dời bỏ Java, cũng không làm khó lập trình viên khi giải 1 bài toán cụ thể. Nếu bạn muốn ngôn ngữ pure-OOP, hay ngôn ngữ OOP truyền thống thì nên chọn Smalltalk ấy.

Public/non-public method/variable trong Python mình chưa thấy ai nói mù mờ, thậm chí được người mới chuyển từ ngôn ngữ khác vào thấy nó thú vị. Việc thêm keyword public/private/protect chỉ là vấn đề về syntax, để implement không có gì phức tạp, chỉ cần thêm keyword vào Python Interpreter khi tokenize, thêm metadata visibility vào method/variable có flag tương ứng. Mặc dù mình có đơn giản hóa công đoạn phía trên, nhưng cơ bản là không khó với những core-developers của Python. Nhưng nó không phải là những gì Python developers muốncần.

self, mixins, metaclass... trong Python tồn tại mà các ngôn ngữ khác có hoặc không có đều là do thiết kế chủ ý, giải quyết bài toán mà đa số lập trình viên đến với Python gặp phải.

Mình không hiểu ví dụ của bạn liên quan gì tới đa hình?

sao lại ko liên quan :v nó là đa hình đó, same interface cho các data khác nhau. Dị ở chỗ là A và B đều ko cần kế thừa từ 1 class cha chung. “Truyền thống” thì phải cần, ví dụ A kế thừa từ X, B kế thừa từ X, X có virtual print(), A, B override print(), p sẽ là array of X ref, chứa được A và B. Trong khi Python chả cần kế thừa cái gì hết, khác hoàn toàn với các ngôn ngữ OOP khác, vậy giải thích sao đây :V

hơn nữa đa hình ko dừng ở mức class, mà xuống tận luôn mức object, object có thể thay đổi và thêm function bất cứ lúc nào, rất là lỏng lẻo :V

import types

class A:
    def __init__(self, value):
        self.value = value

a = A(11)
a.print = types.MethodType(lambda self: print(self.value), a)
a.print()
1 Like

Về đa hình trong Python bạn có thể coi comment của mình cũng tại DNH.

Không biết đây là lần thứ bao nhiêu mình nhắc đến việc bạn đang so sánh Apple vs Orange. Việc bạn cảm thấy Python lỏng lẻo là do chính Python cung cấp Freedom cho lập trình viên, khiến productivity tăng lên (mình không làm việc nhiều với Java/C# nên khó đánh giá nhưng với PHP/C/C++ mình cảm giác công việc thực hiện nhanh hơn nhiều lần), nhiều bài toán ở NNLT khác cảm giác phải viết rất dài nhưng với Python lại đơn giản. Dĩ nhiên nó cũng đi liền với drawback mà bạn mới nói. Đó là trade-off mà NNLT nào cũng gặp phải, không riêng gì Python/Java/C#,…

thêm nữa kế thừa trong Python thì hình như ko phải là kế thừa, mà là mixin. Thay vì class kế thừa X sẽ implement các tính năng, thì ở đây class được kế thừa X sẽ implement các tính năng đó, trái ngược hoàn toàn với các ngôn ngữ OOP truyền thống:

class X:
    def print(self):
        print(self.value)
        
class A(X): # mixin, A kế thừa X là auto có tính năng print()
    def __init__(self, value):
        self.value = value
        
a = A(11)
a.print()
1 Like

vậy người ta hỏi gọt vỏ cam thế nào sao bạn lại đề cao học gọt vỏ táo trước :V Trong khi cam sành C# lại chê >< Chưa học bò đã lo học chạy, nên học truyền thống trước rồi bay nhảy sau :V

1 Like

Đây là lần thứ N tôi phải nói câu này: Tôi không chê C# nhà bạn, mong bạn đọc lại comment dùm.

Bạn bảo C# không nên học mà :smile:

Như bạn ở trên bảo C++ là nhất, bạn khác bảo Java là nhất, trong khi C# cũng có toán tử tham chiếu, cũng có con trỏ, cũng có nạp chồng toán tử, cũng có OOP luôn, lại còn OOP chuẩn, hiện đại, sao lại không học :smile:

Mình học một ngôn ngữ, hiểu được những gì mình gõ ra thì nhảy sang ngôn ngữ nào tương tự chả được. Giống như C# nhảy sang JavaScript đây, vẫn khoẻ XD

1 Like

Nếu em đã học C và C++ thì em có thể tiếp tục học C++.
Học vững rồi thì có thể học qua ngôn ngữ khác.

3 Likes

Cãi nhau làm gì, em này đã học C++ thì cứ tiếp tục học C++ và lên học C++11/14/17. Chuẩn mới của C++ cho phép làm nhiều thứ khiến C++ ko khác C# là mấy, tiện dụng và nhanh, nhưng vẫn ko lược bỏ bản chất low-level của mình (memory management). Sau này vững rồi thì qua học NNLT phù hợp cho công việc sau.

Ai muốn học gì thì học nấy thôi, có gì đâu mà phải tranh cãi. Nnlt cũng là một công cụ, các ngôn ngữ khác nhau sẽ có một số điểm phù hợp với từng tình huống thôi. Chứ không cùng một suy nghĩ thì khó nói chuyện với nhau, ai cũng có lí lẽ riêng

ko cãi chả lẽ ngồi code hoài chán lắm :smiling_imp:

2 Likes

Em cảm ơn anh. Anh có biết link video với tài liệu tiếng Việt oop c++ ko cho em xin với?

Đây bạn, của anh Đạt trong DNH.

2 Likes

Thôi chốt lại các thánh ơi

  1. JAVA hay C++ đều ok, đối với mình 2 thằng này coi như ngang nhau. Ai thích thách thức thì chơi với C++ (vì phải giải quyết các vấn đề khác ngoài OOP, tự quản lí bộ nhớ, con trả, bla bla). JAVA thì đúng như bạn trên kia nói là nó không có gì ngoài OOP :smiley:
  2. Nói chuyện OOP thì nói nhưng một số bạn lại mỉa mai cái chuyện python nó dễ dãi vào thì không hợp lý lắm. Python, js nó cho thay đổi, chỉnh sửa object thì đã sao, những cái đó ra đời điều có mục đích của nó cả, lúc code không thích thì đừng xài, còn đã ko xài mấy ngôn ngữ đó thì nó ra sao cũng cứ kệ nó đi. Cá nhân mình luôn ưu tiên js, python để làm việc vì nó dễ dãi và hầu như c# với java mình điều deny nếu có thể mặc dù tụi nó chẳng có tội tình gì :))

Nếu đã biết sơ qua về C++ thì cứ C++ mà thẳng tiến thôi. Nhưng cơ bản là định hướng của bạn là gì?
Nếu học làm game hay cái gì cần ưu tiên hiệu suất thì C++. Không biết mình có thiên vị hay không vì C++ là ngôn ngữ mình thích nhất.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?