tính trừu tượng trong lập trình hướng đối tượng là một trong những từ khóa được search nhiều nhất trên google về chủ đề tính trừu tượng trong lập trình hướng đối tượng. Trong bài viết này,xaydungweb.vn sẽ viết bài viết Tổng hợp các tính trừu tượng trong lập trình hướng đối tượng
Tổng hợp các tính trừu tượng trong lập trình hướng đối tượng.
Lập trình hướng đối tượng là gì?
Lập trình hướng thị trường (tiếng Anh: Object-oriented programming, viết tắt: OOP) là một mẫu ảnh lập trình dựa trên định nghĩa “công nghệ đối tượng”, mà trong đó, đối tượng chứa đựng các dữ liệu, trên các trường, thường được gọi là các thuộc tính; và mã nguồn, được tổ chức thành các bí quyết. mẹo giúp cho thị trường đủ sức truy xuất và hiệu chỉnh các trường dữ liệu của đối tượng khác, mà phân khúc hiện giờ có tương tác (đối tượng được hỗ trợ các công thức “this” hoặc “self”). Trong lập trình hướng phân khúc, chương trình máy tính được thiết kế bằng cách tách nó ra khỏi phạm vi các thị trường tương tác với nhau.[1][2] Ngôn ngữ lập trình hướng đối tượng khá đa dạng, phần đông là các ngôn ngữ lập trình theo lớp, nghĩa là các phân khúc trong các ngôn ngữ này được xem giống như thực thể của một lớp, được dùng để định nghĩa một kiểu dữ liệu. (Theo wiki)
Bốn tính chất của OOP
Lập trình hướng phân khúc là một cách thức lập trình có 4 tính chất chính sau:
- Tính trừu tượng (abstraction): Đây là cấp độ của chương trình bỏ qua hay k chú ý đến một số góc cạnh của thông tin mà nó đã trực tiếp làm việc lên, nghĩa là nó có cấp độ tụ họp vào những cốt lõi quan trọng. Mỗi thị trường giúp sức như là một “động tử” đủ sức hoàn tất các công việc một phương pháp nội bộ, báo cáo, thay đổi trạng thái của nó và liên lạc với các phân khúc khác mà không cần lý giải làm phương pháp nào phân khúc tiến hành được các thao tác. tính chất này thường được gọi là sự trừu tượng của dữ liệu.
Tính trừu tượng còn thể hiện qua việc một phân khúc ban đầu đủ nội lực có một số đặc điểm chung cho nhiều thị trường khác như là sự xây dựng rộng của nó nhưng bản thân đối tượng ban đầu này đủ nội lực k có các biện pháp thi hành. Tính trừu tượng này thường được định hình trong khái niệm gọi là lớp trừu tượng hay lớp cơ sở trừu tượng.
- Tính đóng gói (encapsulation) và che giấu thông tin (information hiding): tính chất này k cho phép người dùng các phân khúc refresh tình trạng nội tại của một phân khúc. Chỉ có các mẹo nội tại của thị trường cho phép thay đổi trạng thái của nó. Việc cho phép nơi bên ngoài ảnh hưởng lên các dữ liệu nội tại của một đối tượng theo mẹo nào là hoàn toàn tùy thuộc vào người viết mã. Đây là tính chất đảm bảo sự vẹn toàn của phân khúc.
- Tính đa hình (polymorphism): Thể hiện thông qua việc send các thông điệp (message). Việc gửi các thông điệp này có thể so sánh như việc gọi các hàm bên trong của một thị trường. Các bí quyết sử dụng trả lời cho một thông điệp sẽ tùy theo thị trường mà thông điệp đó được gửi tới sẽ có bức xúc khác nhau. Người lập trình đủ sức định nghĩa một đặc tính (chẳng hạn thông qua tên của các phương thức) cho một loạt các đối tượng gần nhau nhưng khi thi hành thì dùng cùng một tên gọi mà sự thi hành của mỗi phân khúc sẽ tự động xảy ra tương ứng theo đặc tính của từng đối tượng mà không bị lầm lẫn.
gợi ý khi định nghĩa hai đối tượng “hinh_vuong” và “hinh_tron” thì có một phương thức chung là “chu_vi”. Khi gọi bí quyết này thì nếu phân khúc là “hinh_vuong” nó sẽ tính theo phương pháp không giống với khi đối tượng là “hinh_tron”.
- Tính kế thừa (inheritance): Đặc tính này cho phép một đối tượng có thể có sẵn các đặc tính mà đối tượng khác vừa mới có thông qua kế thừa. Điều này cho phép các đối tượng chia sẻ hay xây dựng rộng các đặc tính sẵn có mà không phải tiến hành định nghĩa lại. ngoài ra, không phải ngôn ngữ định dạng phân khúc nào cũng có thuộc tính này. (Theo wiki)
Tính trừu tượng và tìm hiểu trong lập trình OOP
Thầy giáo dạy công nghệ software trước đây của tôi vừa mới từng nói một câu đại loại rằng:
cấp độ yếu nhất của lập trình viên Việt Nam là tính trừu tượng hoá.
Thời điểm đó tôi k thực sự tán đồng, nhưng trớ trêu thay càng ngày tôi càng mất đi những lý lẽ quá đủ thuyết phục để phản biện lại nhận xét này.
Tôi đã từng làm việc ở khá nhiều công ty về công nghệ, từ những tập đoàn to cho tới những startup chỉ khoảng vài ba người, từ outsourcing cho tới những công ty làm về product, ERP hay dịch vụ tài chính.
ở đâu tôi cũng tình cờ gặp những đoạn code kiểu dạng giống như sau: Một ngày nọ chúng tôi được yêu cầu khai triển chức năng cho phép send email cho KH khi phát sinh biến đổi về tài chính trong account một mình. Ai đó ngay lập tức tạo class mail
với phương thức sendEmail()
nhằm hiện thực hoá chức năng này trong vòng 30 phút. So far so good.
public void sendEmail(string email, string nội dung...)
Một thời gian sau, chúng tôi được yêu cầu thường xuyên khai triển thêm chức năng send sms vào luồng xử lý bây giờ. Một vài người đề xuất tạo thêm mẹo sendSMS()
vào class email
đã có (wtf, tống một mẹo send tin nhắn và object Email?). Có vẻ ai cũng nhận ra đó là một ý tưởng tồi, và họ quyết định tạo class sms
mới với bí quyết sendSMS()
.
public void sendSMS(string phoneNumber, string nội dung...)
Mọi chuyện có vẻ luôn luôn ổn, cho đến khi chúng tôi thường xuyên được đề xuất triển khai tính năng send notification vào profile của KH. Một vài người luôn luôn cố chấp tin tưởng rằng nên liên tục tạo thêm class với tên gọi Notification, một vài mọi người khởi đầu lờ mờ nhận ra rằng họ đã sai ngay từ những design ban đầu, nhưng bởi đang có quá nhiều dependencies
được tạo ra và không còn mẹo nào khác ngoài việc thường xuyên chuỗi sai lầm tệ hại để không phá vỡ kết cấu nền tảng (mà họ cho rằng hợp lý).
Bất cứ lập trình viên nào hiểu biết về OOP đều đủ nội lực nhận thức được rằng, toàn bộ những gì nên được xây dựng là class Sender
với công thức sendMessage()
, nhưng không nhiều người nhận ra ý tưởng đó ngay từ những bước thiết kế đầu tiên.
lỗi lầm thông dụng trong design nền móng là người đọc quá tin tưởng và những gì mình biết và khẳng định sẽ k có sự cải thiện. Nhưng không! Chúng ta không hiểu rõ như chúng ta tưởng. Tôi đang từng đọc được một câu nói (nào đó), của một người nổi tiếng (nào đó k nhớ tên), đại loại là:
Sau một thời gian khai triển, chúng tôi nhận ra rằng thứ mình tạo ra hoàn toàn không giống đối với những tưởng tượng ban đầu về chúng.
Nếu k thể biết trước những gì sẽ cải thiện, hãy trừu tượng hoá nó nhiều nhất đủ nội lực. Abstraction luôn là một trong những nguyên nhân quan trọng nhất của OOP, nhưng không nhiều người thực sự nhận thức được điều này. Nhưng ngay cả khi chúng ta hiểu được điều đó, liệu đã là đủ? Tôi đang từng thấy một lập trình viên “có kinh nghiệm” triển khai class Sender với những công thức sau:
public void sendEmail(string email, string nội dung...)
public void sendSMS(string phoneNumber, string nội dung...)
rạch ròi rằng mail, phoneNumber hay nội dung nên là những thuộc tính của object và chỉ được phép tương tác thông qua method get(), set() hay contructor(). vấn đề ngay lập tức phát sinh khi tôi muốn lưu trữ lại mail và phoneNumber vào một temp table nào đó. Một vài người sẽ vã thẳng đoạn code lưu trữ này vào từng method (f***), một vài người xung quanh tạo một method mới kiểu dạng như:
public void logging(string something...)
Nhưng rạch ròi phương pháp làm này ẩn chứa nhiều nguy cơ conflict dữ liệu không đáng có. Chúng ta luôn luôn thường ra rả nói về OOP, trong khi lại liên tục vi phạm nghiêm trọng tính encapsulation của đối tượng.
Lượm lặt đâu đó, bạn đủ nội lực gặp một vài người sử dụng strategy pattern, bản thân tôi thì like observer pattern hơn. tìm hiểu trong lập trình là thứ đủ nội lực không khó khăn cải thiện, nhưng nghiệt ngã ở chỗ, thuyết phục được một người refresh tư duy lại chông gai hơn gấp bội.
Tôi đã nhiều lần gặp những lập trình viên phủ định ngay những ý tưởng mới, ngay cả khi họ chưa hiểu rõ ý tưởng đó là gì. Tiếc thay, những lời biện hộ lại có vẻ rất thuyết phục như “tôi cho rằng thiết kế này là thêm vào với chức năng hiện có” hay “các hệ thống vừa mới có đều design giống như vậy”. Chúng ta thường vận dụng những tìm hiểu cũ cho một nền móng mới và hy vọng vào một sự biến động mang chiều hướng tích cực. Nhưng sự thuyết phục để thay đổi là vô cùng chông gai khi mà ngay cả loose coupling hay high cohesion luôn luôn còn là những ý niệm hết sức mơ hồ.
Nguồn: internet.com