10/10/2018, 10:58

Xin ví dụ về lỡi ích của con trỏ và OOP

Có 2 vấn đề trong lập trình mà kẻ tự học như em nghi hoài không hiểu!

tại sao lại cần tới con trỏ
Một người bạn của em giải thích rằng, ví dụ ta có biến a, thoạt đầu ta cho a=1, sau đó a=2, a=3 lặp đi lặp lại tới 1 tr thì mất 1 tr ô nhớ. nếu dùng con trỏ thì chỉ mất bi nhiu đấy..
Em không biết có đúng không, nhưng nếu dúng thì ô nhớ là cái gì mà phải để dành!?

OOP tốt hơn Functional chở nào
Em đã cố đọc rất nhiều tài liệu về OOP để học đc cách lập trình mà hầu hết mọi người đều cho là nó tối ưu, nhưng cuối cùng em vẫn thấy nó không hơn gì kiểu lập trình viết hàm.
Em cảm thấy OOP dài dòng và chỉ là một hình thức. Ví dụ khi OO.MMM(data) thì có khác gì mình viết 1 Hàm MMM để áp giá trị vào OO đâu!?
Chỉ duy thấy có vài trường hợp khi có nhiều cái na ná, ví dụ trò chơi bán súng thì có nhiều loại súng, viết 1 đối tượng súng AK rồi thêm, bớt, thay đổi thuộc tính cho nó ra M16 thì em thấy OOP hửu dụng.


Việc tự học chủ yếu dựa trên ví dụ, em mong mọi người cho em một vài ví dụ dể hiểu để cho em khai sáng, chứ cả thế giới khen nó hay mà mình chả hiểu nó hay như thế nào thì....

Biết rằng cách tốt nhất là tự làm thật nhiều rồi nhận ra cái lợi, nhưng mà nó lại đi trái với quy trình lập trình hướng đối trong tài liệu em đọc, phải nắm rỏ vấn đề trước rồi mới vọc

Mong đc mọi người chia sẽ kiến thức!

Cảm ơn
rockydant viết 13:12 ngày 10/10/2018
Câu 1:
Giả sử CPU bạn là core i7(khoảng 3Ghz) => tốc độ CPU là 3 * 8= 24Ghz, bạn làm apps nào đó mà mỗi ô nhớ khoảng 100Mb, nếu không xài con trỏ bạn nhắm apps của bạn tối đa được bao nhiêu ô là hết chỗ chứa CPU, chưa kể còn tốn dung lượng cho windows và các apps khác
Câu 2:
Nếu có ai nói OOP tối ưu hơn Functional thì mình thấy chưa chắc, nhưng nếu nói OOP dễ hiểu hơn thì mình OK 100%. Giả sử bài toán đưa ra là lưu trữ thông tin của 1000 học sinh trong 20 lớp gồm có: mã số, tên, điểm bạn sẽ làm thế nào với Funtional ?

Nếu là mình mình sẽ xài OOP, viết class lớp học, class học sinh, class thông tin học sinh... cực dễ hiểu và dễ trình bày

=> Nói bậy bạ hi vọng giúp bạn phần nào
zmt264 viết 13:01 ngày 10/10/2018
Được gửi bởi rockydant
Câu 1:
Giả sử CPU bạn là core i7(khoảng 3Ghz) => tốc độ CPU là 3 * 8= 24Ghz, bạn làm apps nào đó mà mỗi ô nhớ khoảng 100Mb, nếu không xài con trỏ bạn nhắm apps của bạn tối đa được bao nhiêu ô là hết chỗ chứa CPU, chưa kể còn tốn dung lượng cho windows và các apps khác
Thế giả sử tình huống như bạn nói đi, thì bạn tính thử xem tối đa bao nhiêu ô???????????????
haicop viết 13:13 ngày 10/10/2018
Cái gì làm đc = OOP thì đều làm đc = function và ngược lại, vì thế bạn viết bằng cách nào cũng ra kết quả , nhưng cái hay của OOP là thuộc tính được bảo vệ và thừa hưởng, do đó code rất khoa học, ngắn gọn và dễ hiểu. 1 cái rất hay của OOP nữa là có thể truyền tham số bất cứ lúc nào thay vì phải thêm tham số liên tục cho hàm. Do đó với dự án nhỏ có thể viết = function , nhưng đối với dự án lớn mà viết function thuần túy thì vỡ mặt.

Mình đưa ra VD về lợi thế của OOP so với làm function thuần túy

VD1.Tính thừa hưởng ( thừa kế )
Trong lập trình Visual Basic, Visual Foxpro bạn tạo 1 loạt các class như nút lệnh , text box, Label để dùng trong toàn bộ ứng dụng rất lớn. Khi mình cần thay đổi style của toàn bộ ứng dụng như đổi sang font đậm thì chỉ việc sửa Class đã khai báo. Đó là cái hay của tính thừa hưởng.
Trong PHP cũng có vụ này
class class_a extends class_b
{

}


VD2.Tính bảo vệ.
Giả sử ở 1 số nút bạn muốn font in nghiêng, bạn chỉ việc gán cho nút đó thuộc tính font in nghiêng, các nút còn lại được "Bảo vệ" nên không bị nghiêng

Trong 2 VD 1 và 2, nếu bạn dùng function để tạo ra các nút lệnh, bạn sẽ phải giải quyết rất nhiều việc. viết thêm function hay truyền thêm biến.

VD3.Tạo phân trang trong PHP
làm bằng function:

function phantrang($so_sanpham,$so_sanpham_1_trang, $so_sanpham_dong, $style_phan_trang,$kieu_url,$kieu_muiten...)
{

}

sau 1 thời gian code option cho phantrang này là rất nhiều, mỗi lần bạn nâng cấp bạn sẽ phải nhét tham số vào hàm, sửa 1 loạt code ở nhiều nơi dùng đến nó

Cách làm class OOP

$paging=new class_phantrang();
$paging->html=$this->html_paging;
$paging->so_sanpham=$num_row;
$paging->$so_sanpham_1_trang=10;
$paging->$so_sanpham_dong=2;
$paging->create();
$paging1=$paging->content;

Các thuộc tính khác có thể không truyền mà mình sẽ khai báo mặc định trong class. Cần thuộc tính nào truyền thuộc tinh đó, do đó nâng cấp code rất dễ.

Sử dụng tiếp tục phân trang với tùy chọn khác thì bạn chỉ cần

$paging->$so_sanpham_dong=3;
$paging->create();
$paging2=$paging->content;
sieu_nhan viết 13:04 ngày 10/10/2018
Cám ơn mọi người, em phần nào hiểu thêm một ít về 2 thứ trên, nhưng chắc vẫn cần phái nghiên cứu thêm!

P/s:
Được gửi bởi rockydant
Nếu có ai nói OOP tối ưu hơn Functional thì mình thấy chưa chắc, nhưng nếu nói OOP dễ hiểu hơn thì mình OK 100%. Giả sử bài toán đưa ra là lưu trữ thông tin của 1000 học sinh trong 20 lớp gồm có: mã số, tên, điểm bạn sẽ làm thế nào với Funtional ?
Với bài toán này em dùng SQL 1 phát, 2 table, rồi cứ thế functional mà xong
BnoL viết 13:03 ngày 10/10/2018
Giả sử bài toán đưa ra là lưu trữ thông tin của 1000 học sinh trong 20 lớp gồm có: mã số, tên, điểm bạn sẽ làm thế nào với Funtional ?
Dùng struct?

Do đó với dự án nhỏ có thể viết = function , nhưng đối với dự án lớn mà viết function thuần túy thì vỡ mặt.
Thế Drupal core của nó có viết cái class nào trong đó đâu nhỉ?
ngoc_viet08 viết 13:08 ngày 10/10/2018
ừm drupal số 1 thế giới cms nhưng kinh lắm ...
oop , function , fw chỉ là way làm web , hok phải là tất nhiên cần có
haicop viết 13:07 ngày 10/10/2018
Được gửi bởi BnoL
Dùng struct?



Thế Drupal core của nó có viết cái class nào trong đó đâu nhỉ?
<-- cãi cùn, không giải thích hộ người ta còn phá.
jiSh@n viết 13:00 ngày 10/10/2018
Được gửi bởi BnoL
Thế Drupal core của nó có viết cái class nào trong đó đâu nhỉ?
D7 có ko ít class đâu
VnVision viết 13:08 ngày 10/10/2018
Được gửi bởi haicop
<-- cãi cùn, không giải thích hộ người ta còn phá.
Cách đây vài năm có đọc lý giải của tác giả 1 trong những web cms nổi tiếng nhất thế giới là drupal, đại ý là hướng đối tượng không phải là ở cách thể hiện ra code với các class, inheritance... mà cốt lõi là ở trong tư duy lập trình. Có những chương trình sử dụng code có chứa object nhưng tư duy của người thiết kế lại ko phải là OOP, và code đó còn khó maintain hơn cả những code functional. Ngược lại có những code theo lối functional (như drupal), nhưng lại được thiết kế theo tư duy OOP nên maintainability & extensibility rất cao.
Bài liên quan
0