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

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?