thật sự ngưỡng mộ tinh thần hiếu học, sự chia sẻ và cầu tiến của chú khi thấy đồng hồ máy tính chỉ 5h sáng và khi chú nói rằng chữ mình xấu và muốn cải thiện luyện chữ đẹp hơn. Ở lứa bọn cháu, dù còn rất nhiều thiếu sót về cả kiến thức lẫn đời sống, nhưng vẫn hay tự cảm thấy hài lòng và quá thiếu sự kỷ luật, khắt khe hơn với bản thân mình. Mong chú có thể chia sẻ thêm về kiến thức chuyên môn và giúp đỡ cộng đồng lập trình ở Việt Nam. Chúc chú và gia đình nhiều niềm vui và sức khỏe ạ!
-Cảm ơn chú đã làm ra video bổ ích này, nếu ai đã học qua Java OOP thì 'Virtual' bên C++ nó là kỹ thuật Dynamic Binding mặc định bên Java khi kế thừa và thực hiện tính chất đa hình
Cảm ơn anh, sau khi nghe xong thì em hiểu class Dog kế thừa class Animal, vậy từ góc nhìn của Dog thì ta có thể tái sử dụng lại code của Animal, từ góc nhìn của Animal thì ta có thể mở rộng code của chính nó (bằng đa hình), điều này dẫn đến tình chất cuối là tính trừu tượng, Animal không biết cụ thể loài vật nào kế thừa nó, chỉ cần cam kết có phương thức move() là được.
Rất cám ơn anh Nam về bài học bổ ích này. Em đang có một câu hỏi là theo anh trong 4 tính chất thì tính chất nào là quan trọng nhất và tại sao ah. Cám ơn anh và chúc anh sức khỏe ah
@@hoc-lap-trinh dạ em chỉ đơn giản nghĩ đến những câu hỏi liên quan đến một vấn đề thôi anh ah. Và em xem nhiều video về Oop thì cũng ko thấy nói gì về việc tính chất nào là quan trọng nhất cả. Nhưng khi em search chatgpt thì lại thấy nói tính chất đóng gói là quan trọng nhất nên muốn hỏi thêm ý kiến của anh xem thế nào ah. Em cám ơn anh
Anh có thể làm 1 video nói về golang được không ạ. có thể áp dụng oop cho golang được không cũng như là các design pattern, clean architecture. Chúc anh và gia đình nhiều sức khoẻ
Em chào anh Nam, e có 1 thắc mắc về OOP muốn được anh giúp đỡ Em có một interface InterfaceA và nhiều lớp A1, A2,... A10 implement từ nó. Mỗi lớp này có các thuộc tính và phương thức riêng. InterfaceA: String Name{set;get;} Void Insert(string para) ClassA1:InterfaceA String ParaA1{set;get;}.. Void Insert(paraA1). ….Method Insert()lại nhận chính các thuộc tính tương ứng làm tham số đầu vào . Tương tự Các classA2..A10 chứa các paraA2…A10 tương ứng E đã dùng Factory Pattern. FactoryClassA: InterfaceA CreateClassA(string name) => để trả ra các class tương ứng Tuy nhiên, mặc dù có thể truy cập các phương thức như Insert() từ interface InterfaceA,nhưng để truy cập các thuộc tính riêng của từng lớp (như ParaA1 trong ClassA1), e phải sử dụng ép kiểu hoặc cách khác như Reflection, nhưng e cảm thấy điều này làm mã nguồn trở nên phức tạp. Anh có thể gợi ý cho e một cách tiếp cận nào đơn giản hơn để quản lý và sử dụng các thuộc tính này mà không cần phải sử dụng các kỹ thuật phức tạp như vậy không?
Ở đây InterfaceA em đang có vấn đề về thiết kế, anh không rõ bài toán em đang giải quyết là gì nên khó có thể có lời khuyên chính xác. Nhưng để sửa lại thì có thể có vài cách: - Method Insert sẽ là Insert(InterfaceA obj), trong mỗi lớp thừa kế nó sẽ tự kiểm tra kiểu và ép về kiểu nó cần. - Sử dụng generic: interface A{ void Insert(T t) ; } - Tách ra làm hai interface: interfaceA và interfaceACollection (tạm đặt tên như vậy), void insert sẽ thuộc interfaceACollection, anh nghĩ đây là phương án hợp lý nhất vì nó tách biệt chức năng của interfaceA ra (trong thiết kế của em thì interfaceA đang đảm nhiệm hai chức năng khác nhau). Tạm là vậy, nếu có bài toán cụ thể thì sẽ dễ tìm phương án tốt hơn.
Bài học rất thực tế và dễ hiểu, cảm ơn chú ạ. Chú có biết nguồn nào mà cung cấp các bài toán, bài tập để thực hành OOP không chú, nếu có chú có thể chia sẻ được không ạ.
Đừng làm nhiều bài nhỏ, thay vì vậy nghĩ ra 1 bài dài làm trong một vài tuần, mình sẽ học được nhiều thứ hơn. Chạy 1 lần 10km sẽ khác nhiều so với chạy 10 lần mỗi lần 1km.
Anh Nam ơi, cho em hỏi là các khái niệm Generalisation và Specialisation tương ứng với các tính chất nào trong OOP vậy ạ? Em đọc thấy có nơi bảo Generalisation tương ứng với Interface, specialisation tương ứng với Inheritance. Nhưng cũng có nơi bảo Generalisation tương ứng Inheritance, còn specialisation tương ứng polymorphism. Nên em đang không biết cái nào chính xác ạ. Em cảm ơn anh
Thực ra nó không tương ứng với các khái niệm trong OOP, generalisation và specialisation, gọi là tổng quát hóa hoặc chi tiết hóa, được coi là các quá trình hơn là các tính chất, thường người ta dùng hai từ này trong quá trình thiết kế, để chỉ đến các bước làm việc. Ví dụ sau khi generalization thì kết quả em có có thể là một cây class chẳng hạn, hoặc một lược đồ ER được tối ưu... Nói chung em đừng cố tìm cách map 2 khái niệm đó với 4 tính chất trong OOP, nó không hoàn toàn tương đương nên sẽ gây khó hiểu.
Em có một câu hỏi ạ, vậy là sau này mình muốn đọc dữ liệu từ XML, Word hoặc 1 loại hình dữ liệu khác thì mình phải viết thêm các method implement DataReader như XMLDataReader - WordDataReader phải không ạ, vậy thì khi thiết kế Windows khi có 1 loại máy in mới thì họ cũng phải viết thêm các triển khai cho loại máy in đó phải không ạ
Đúng rồi em, khi em có một loại máy in mới thì em phải cài driver cho nó, lý do thường hiện nay chúng ta không phải cài là vì các thế hệ Windows mới có khả năng nhận dạng thiết bị rất tốt, vậy nên nó sẽ tự tìm và cài đặt driver phù hợp, người dùng không cần làm gì khác. Thêm nữa là các chuẩn thiết bị hiện tại đã rất ổn định, không có tình trạng mỗi thứ làm một kiểu khác nhau, nên một loại driver cũng có thể dùng cho nhiều loại thiết bị khác nhau.
mọi khi học các tính chất OOP không biết ứng dụng vào việc gì nhưng sau khi xem video của anh em đã hình dung được, cảm ơn anh nhiều ạ!
thật sự ngưỡng mộ tinh thần hiếu học, sự chia sẻ và cầu tiến của chú khi thấy đồng hồ máy tính chỉ 5h sáng và khi chú nói rằng chữ mình xấu và muốn cải thiện luyện chữ đẹp hơn. Ở lứa bọn cháu, dù còn rất nhiều thiếu sót về cả kiến thức lẫn đời sống, nhưng vẫn hay tự cảm thấy hài lòng và quá thiếu sự kỷ luật, khắt khe hơn với bản thân mình. Mong chú có thể chia sẻ thêm về kiến thức chuyên môn và giúp đỡ cộng đồng lập trình ở Việt Nam. Chúc chú và gia đình nhiều niềm vui và sức khỏe ạ!
Chắc là đồng hồ sai hay sao í chứ lúc đó đang buổi chiều mà :D. Nhưng dù sao cũng cảm ơn em.
-Cảm ơn chú đã làm ra video bổ ích này, nếu ai đã học qua Java OOP thì 'Virtual' bên C++ nó là kỹ thuật Dynamic Binding mặc định bên Java khi kế thừa và thực hiện tính chất đa hình
Hay quá anh ạ, rất thích cách anh giảng dạy như này! E rất thích xem những video có kiến thức sâu như này !
Hi hi cảm ơn em
con cảm ơn chú vì bài giảng ạ. Con sẽ cố gắng học và tìm hiểu để kiến thức sâu giống chú
Cố lên!
thật sự cảm ơn anh rất nhiều rất chi tiết và dễ hiểu !
cảm ơn em :)
Cảm ơn anh, sau khi nghe xong thì em hiểu class Dog kế thừa class Animal, vậy từ góc nhìn của Dog thì ta có thể tái sử dụng lại code của Animal, từ góc nhìn của Animal thì ta có thể mở rộng code của chính nó (bằng đa hình), điều này dẫn đến tình chất cuối là tính trừu tượng, Animal không biết cụ thể loài vật nào kế thừa nó, chỉ cần cam kết có phương thức move() là được.
Đúng rồi em
Kiến thức a sâu thật đấy. E rất thích xem những video như thế này
Cảm ơn em, vậy nhớ theo dõi thêm nhé
Cháu chào chú ạ, cháu chỉ muốn nói là chú dạy cuốn quá ạ! Vừa được học vừa được chill! Chúc chú nhiều sức khỏe ạ!
cảm ơn bạn =))
cảm ơn chú đã chia sẻ, hay quá ạ
Mong bác ra nhiều video hơn nhé, cũng từ fb qua bên này :v
video hay quá ạ, nếu có thời gian mong anh ra thêm kiến thức về design pattern
Ok em, hi vọng trong tương lai sẽ có
bài viết từ 2020 mà 2023 mới ra vid :(. Đùa thôi cảm ơn anh :D
:D
cảm ơn chú nhiều
Mong chú làm thêm kiến thức về SQL, con học trên trường rồi vẫn có nhiều cái không hiểu, cám ơn chú
SQL thì chắc lâu, mình chưa đưa nó vào plan làm video :)
Qúa tuyệt chú ạ
Cảm ơn em
Dễ hiểu quá ạ. Cảm ơn a
Nhớ theo dõi thêm những video dễ hiểu khác nữa nhé.
Hay quá chú Nam ơi 🎉🎉. Cháu xem trên điện thoại thấy chữ hơi nhỏ ạ
Cảm ơn em. Vụ chữ nhỏ thì hơi khó, để hôm sau cố gắng zoom to hơn, nhưng nghe thôi chắc cũng hiểu.
Rất cám ơn anh Nam về bài học bổ ích này. Em đang có một câu hỏi là theo anh trong 4 tính chất thì tính chất nào là quan trọng nhất và tại sao ah. Cám ơn anh và chúc anh sức khỏe ah
Cảm ơn em, nhưng e phải trả lời trước là tại sao phải so sánh vậy? 😌
@@hoc-lap-trinh dạ em chỉ đơn giản nghĩ đến những câu hỏi liên quan đến một vấn đề thôi anh ah. Và em xem nhiều video về Oop thì cũng ko thấy nói gì về việc tính chất nào là quan trọng nhất cả. Nhưng khi em search chatgpt thì lại thấy nói tính chất đóng gói là quan trọng nhất nên muốn hỏi thêm ý kiến của anh xem thế nào ah. Em cám ơn anh
Anh có thể làm 1 video nói về golang được không ạ. có thể áp dụng oop cho golang được không cũng như là các design pattern, clean architecture. Chúc anh và gia đình nhiều sức khoẻ
Anh không rành golang lắm em ạ
Hay quá cuối cùng cũng có kiến thức mà em có thể liên hệ trực tiếp với việc học của em rồi :))
Cảm ơn em
Cam on anh rat nhieu.
cháu mong chú sẽ nói về SOLID nữa ạ
từ từ thì khoai mới nhừ
Em chào anh Nam, e có 1 thắc mắc về OOP muốn được anh giúp đỡ
Em có một interface InterfaceA và nhiều lớp A1, A2,... A10 implement từ nó. Mỗi lớp này có các thuộc tính và phương thức riêng.
InterfaceA:
String Name{set;get;}
Void Insert(string para)
ClassA1:InterfaceA
String ParaA1{set;get;}..
Void Insert(paraA1). ….Method Insert()lại nhận chính các thuộc tính tương ứng làm tham số đầu vào . Tương tự Các classA2..A10 chứa các paraA2…A10 tương ứng
E đã dùng Factory Pattern.
FactoryClassA:
InterfaceA CreateClassA(string name) => để trả ra các class tương ứng
Tuy nhiên, mặc dù có thể truy cập các phương thức như Insert() từ interface InterfaceA,nhưng để truy cập các thuộc tính riêng của từng lớp (như ParaA1 trong ClassA1), e phải sử dụng ép kiểu hoặc cách khác như Reflection, nhưng e cảm thấy điều này làm mã nguồn trở nên phức tạp.
Anh có thể gợi ý cho e một cách tiếp cận nào đơn giản hơn để quản lý và sử dụng các thuộc tính này mà không cần phải sử dụng các kỹ thuật phức tạp như vậy không?
Ở đây InterfaceA em đang có vấn đề về thiết kế, anh không rõ bài toán em đang giải quyết là gì nên khó có thể có lời khuyên chính xác. Nhưng để sửa lại thì có thể có vài cách:
- Method Insert sẽ là Insert(InterfaceA obj), trong mỗi lớp thừa kế nó sẽ tự kiểm tra kiểu và ép về kiểu nó cần.
- Sử dụng generic: interface A{
void Insert(T t) ;
}
- Tách ra làm hai interface: interfaceA và interfaceACollection (tạm đặt tên như vậy), void insert sẽ thuộc interfaceACollection, anh nghĩ đây là phương án hợp lý nhất vì nó tách biệt chức năng của interfaceA ra (trong thiết kế của em thì interfaceA đang đảm nhiệm hai chức năng khác nhau).
Tạm là vậy, nếu có bài toán cụ thể thì sẽ dễ tìm phương án tốt hơn.
Anh nên chỉnh âm to lên xíu ạ, cảm ơn anh đã chia sẻ kiến thức!
OK em, anh sẽ cố gắng cải tiến dần dần
Bài học rất thực tế và dễ hiểu, cảm ơn chú ạ.
Chú có biết nguồn nào mà cung cấp các bài toán, bài tập để thực hành OOP không chú, nếu có chú có thể chia sẻ được không ạ.
Đừng làm nhiều bài nhỏ, thay vì vậy nghĩ ra 1 bài dài làm trong một vài tuần, mình sẽ học được nhiều thứ hơn. Chạy 1 lần 10km sẽ khác nhiều so với chạy 10 lần mỗi lần 1km.
Anh Nam ơi, cho em hỏi là các khái niệm Generalisation và Specialisation tương ứng với các tính chất nào trong OOP vậy ạ? Em đọc thấy có nơi bảo Generalisation tương ứng với Interface, specialisation tương ứng với Inheritance. Nhưng cũng có nơi bảo Generalisation tương ứng Inheritance, còn specialisation tương ứng polymorphism. Nên em đang không biết cái nào chính xác ạ. Em cảm ơn anh
Thực ra nó không tương ứng với các khái niệm trong OOP, generalisation và specialisation, gọi là tổng quát hóa hoặc chi tiết hóa, được coi là các quá trình hơn là các tính chất, thường người ta dùng hai từ này trong quá trình thiết kế, để chỉ đến các bước làm việc. Ví dụ sau khi generalization thì kết quả em có có thể là một cây class chẳng hạn, hoặc một lược đồ ER được tối ưu...
Nói chung em đừng cố tìm cách map 2 khái niệm đó với 4 tính chất trong OOP, nó không hoàn toàn tương đương nên sẽ gây khó hiểu.
làm về entityframework đi anh
EF thấy nhiều lắm rồi mà 😮
theo cách hiểu của em thì:
protected là private đối với bên ngoài class, nhưng là public đối với bên trong class =))
đơn giản là chỉ có các phương thức của chính nó và lớp con mới truy cập được
56:20 🤣🤣
😂😂
Không biết chú có lớp dạy lập trình không ạ?
Hiện không có bạn ạ
anh nói về microservices đi anh 😁
Cái đó khó quá, từ từ để anh học đã 😁
@@hoc-lap-trinh anh nam 10/10
Em có một câu hỏi ạ, vậy là sau này mình muốn đọc dữ liệu từ XML, Word hoặc 1 loại hình dữ liệu khác thì mình phải viết thêm các method implement DataReader như XMLDataReader - WordDataReader phải không ạ, vậy thì khi thiết kế Windows khi có 1 loại máy in mới thì họ cũng phải viết thêm các triển khai cho loại máy in đó phải không ạ
Đúng rồi em, khi em có một loại máy in mới thì em phải cài driver cho nó, lý do thường hiện nay chúng ta không phải cài là vì các thế hệ Windows mới có khả năng nhận dạng thiết bị rất tốt, vậy nên nó sẽ tự tìm và cài đặt driver phù hợp, người dùng không cần làm gì khác. Thêm nữa là các chuẩn thiết bị hiện tại đã rất ổn định, không có tình trạng mỗi thứ làm một kiểu khác nhau, nên một loại driver cũng có thể dùng cho nhiều loại thiết bị khác nhau.
@@hoc-lap-trinh 😍vâng anh, em hiểu rồi ạ
Cảm ơn chú ạ, chia sẻ nhiều kiến thức bổ ích quá ạ