thảo luận Object-Oriented Programming is Bad

  • Người tạo chủ đề Người tạo chủ đề cs_50i
  • Ngày bắt đầu Ngày bắt đầu
Tôi thường bảo các em sv, tốt nhất học OOP thì đừng xoáy vào mấy cái ví dụ thú với chó làm gì. Nhảy mẹ nó vào Qt C++ mà xem họ thi triển OOP, hoặc fork một project opensource về nghiệp vụ doanh nghiệp viết bằng JAVA mà học. Éo ai suốt ngày lớp thú 4 chân, lớp thú dưới nước kế thừa cái éo gì ở đây, phỏng vấn mấy bạn sv như này tôi phát nhọc. Mà tôi gặp suốt :(

à mà các bạn ấy rất hay nói rất phức tạp về abstraction, encapsulation, inheritance and polymorphism. Trong khi gói gọn là mấy tính chất này là cách để quản lý state.
Xin lỗi nếu quote làm phiền bác nhưng bác nói mấy tính chất đó để quản lý state không thôi thì mình thấy chưa đủ vì nó còn liên quan đến behavior của đối tượng mà cái này là cái mình thấy quan trọng trong OOP

Ví dụ như thằng polymorphism, trong Ruby mà mình học thì với class sau

Ruby:
class Wheel
    def size(rim)
        rim.diameter * 2 + 5
    end
end

Thì thằng Wheel không cần quan tâm thằng rim được truyền vào có class nào miễn sao nó hiểu được diameter mà thằng Wheel send tới.
mà cái này chỉ có dynamic-type mới làm được nên với mình thì dynamic-type là chân ái :sexy_girl:
 
Sửa lần cuối:
Xin lỗi nếu quote làm phiền bác nhưng bác nói mấy tính chất đó để quản lý state không thôi thì mình thấy chưa đủ vì nó còn liên quan đến behavior của đối tượng mà cái này là cái mình thấy quan trọng trong OOP

Ví dụ như thằng polymorphism, trong Ruby mà mình học thì với class sau

Ruby:
class Wheel
    def size(rim)
        rim.diameter * 2 + 5
    end
end

Thì thằng Wheel không cần quan tâm thằng rim được truyền vào có class nào miễn sao nó hiểu được diameter mà thằng Wheel send tới.
mà cái này chỉ có dynamic-type mới làm được nên với mình thì dynamic-type là chân ái :sexy_girl:
Trong thế giới OOP thì sẽ có rất nhiều cái để mà cho là concept. Mỗi người chọn một vài concept để nhận định nó là bản chất của OOP, miễn sao những thứ ấy giúp họ làm kim chỉ nam để viết code OOP cho chuẩn và đơn giản hóa.

Mình thì chọn việc quản lý state làm kim chỉ nam. Vì có code thế nào đi nữa thì vấn đề vẫn là state (data) nó hoạt động ra sao khi bị các behavior tác động vào hoặc nó đang được một data nào khác phụ thuộc nó hoặc nó phụ thuộc data khác. Thế nên bộ môn OOP nó luôn liền tay liền chân với Design pattern cũng là vì câu chuyện quản lý state.
 
nói dài dai như topic FP lần trước, cũng k ai mang được cái ví dụ apply FP thay OOP ntn?
ai có thể cho mình cái keyword tải 1 project web bằng các loại no OOP xem thử k?

vd java: để apply 1 action gì đó cho request, thì sẽ extend/implement cái java.servlet.Filter. nếu k dùng OOP thì làm ntn?
 
nói dài dai như topic FP lần trước, cũng k ai mang được cái ví dụ apply FP thay OOP ntn?
ai có thể cho mình cái keyword tải 1 project web bằng các loại no OOP xem thử k?

vd java: để apply 1 action gì đó cho request, thì sẽ extend/implement cái java.servlet.Filter. nếu k dùng OOP thì làm ntn?
thiếu gì project web no OOP, giờ đang hot cmn golang mà go nó có OOP méo đâu :))
 
nói dài dai như topic FP lần trước, cũng k ai mang được cái ví dụ apply FP thay OOP ntn?
ai có thể cho mình cái keyword tải 1 project web bằng các loại no OOP xem thử k?

vd java: để apply 1 action gì đó cho request, thì sẽ extend/implement cái java.servlet.Filter. nếu k dùng OOP thì làm ntn?
Tùy framework thôi. Cái java.servlet.Filter nhiệm vụ của nó là provide behavior thông qua cái hàm

Mã:
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { 
}

Nên FP có thể dùng Higher Order Function nếu muốn implement giống java: define 1 cái hàm => pass hàm đó vào list interceptor của server config.

Hoặc go full composition như http4s, suave.... : https://http4s.org/v0.21/middleware/
 
thấy mấy bác đưa ví dụ về sinh viên với mớ kiến thức "rác" của họ ra để nói OOP như này như nọ. :gach:

Đấy là học vẹt, đừng đánh giá 1 cái gì nó phiến diện thế
 
thiếu gì project web no OOP, giờ đang hot cmn golang mà go nó có OOP méo đâu :))

ừa Golang đang hot mà, mà học golang thì cái đầu tiên là quên cmn OOP đi :LOL:
code web với Go sướng vl, nhảy qua mấy cái khác code thấy nó ngu ngu thế nào ấy (ruby/java/python), mặc dù tụi nó cũng ko phải là dở.
Phải công nhận là Go nó thiết kế đơn giản mà hiệu quả thật.
 
Code oop giờ còn chơi kế thừa ko nhỉ
Thực tế tôi gặp thì hầu hết không chơi kế thừa nữa vì rất khó quản lý mà lợi ích đem lại không nhiều. Thường cứ tạo hết property vào 1 class và dùng chung cho toàn bộ đối tượng, nếu có lỗi conflict thì ghi log và notify lên slack channel để báo bad data.
 
Thực tế tôi gặp thì hầu hết không chơi kế thừa nữa vì rất khó quản lý mà lợi ích đem lại không nhiều. Thường cứ tạo hết property vào 1 class và dùng chung cho toàn bộ đối tượng, nếu có lỗi conflict thì ghi log và notify lên slack channel để báo bad data.
Thời thế thay đổi nhanh vậy sao bác, nhớ khoảng 1-2 năm trước thôi tôi vào chê mấy cái abstraction bị ném gạch quá trời
 
Mình nghe nói làm game dev thì sẽ cảm nhận OOP rõ ràng hơn mấy cái khác. Bạn nào xác nhận giúp mình với.
Game trước đây thì lua rất phổ biến, đây là ngôn ngữ mà toàn bộ biến điều là dynamic type. Và trick của ngôn ngữ này là đặt tên biến sao cho thể hiện rõ nó là cái gì, khi truyền biến vào function chả phải quan tâm đến lớp kế thừa để gọi tên hàm như oop
 
Thực tế tôi gặp thì hầu hết không chơi kế thừa nữa vì rất khó quản lý mà lợi ích đem lại không nhiều. Thường cứ tạo hết property vào 1 class và dùng chung cho toàn bộ đối tượng, nếu có lỗi conflict thì ghi log và notify lên slack channel để báo bad data.
Vấn đề là ở đây, nếu không dùng kế thừa thì nó đâu thật sự là OOP nữa , nếu tách biệt data với function thì là đang thực hành functional programming
 
Vấn đề là ở đây, nếu không dùng kế thừa thì nó đâu thật sự là OOP nữa , nếu tách biệt data với function thì là đang thực hành functional programming

Tôi chưa làm func program nên không dám chém. Thực tế khó dùng OOP vì nó chặt chẽ quá, mà quy trình release phải qua nhiều bước, merge từng nhánh nhỏ trước, chưa kể các thể loại feature toggling, api versioning, backward compatible... nên không áp dụng triệt để OOP được. Chứ tôi làm side project không có team thì vẫn thích tuân thủ OOP vì code đẹp, ít sai.

Sent from Samsung SM-G973F using vozFApp
 
Thời thế thay đổi nhanh vậy sao bác, nhớ khoảng 1-2 năm trước thôi tôi vào chê mấy cái abstraction bị ném gạch quá trời

Thím làm tôi nhớ đến câu này: chỉ có 2 loại framework, 1 loại bị rất nhiều người chửi, và 1 loại chả có ai xài.

OOP chỉ là cái cơ bản của cơ bản, không thể áp dụng rập khuôn cho mọi tình huống, tùy thực tế mà làm sao cho hợp lý thôi. Nhưng đừng vì vậy mà nói OOP không cần thiết, tùy tiện quá mức thì code sẽ thành 1 nùi rác.

Sent from Samsung SM-G973F using vozFApp
 
Riêng OOP của C/C++ là thể hiện được tính thực dụng nhất. Anh thích thì biến oop như functional được luôn. Còn k thì chủ động huỷ Obj tiếp tục code thủ tục :d
 
ừa Golang đang hot mà, mà học golang thì cái đầu tiên là quên cmn OOP đi :LOL:
code web với Go sướng vl, nhảy qua mấy cái khác code thấy nó ngu ngu thế nào ấy (ruby/java/python), mặc dù tụi nó cũng ko phải là dở.
Phải công nhận là Go nó thiết kế đơn giản mà hiệu quả thật.
Cũng ko hẳn là quên đi mà là golang nó ko có cái món kế thừa đặc trưng của OOP, nên khi code tư duy kiểu khác hẳn như là code C so với code java, cần cái gì thì khai báo struct thay vì cân nhắc class mới kế thừa cái nào...
 

Thống kê chủ đề

Ngày tạo
cs_50i,
Người trả lời cuối
vhptt89,
Trả lời
58
Lượt xem
12.405
Quay lại
Lên đầu trang