cba
Senior Member
Cho dù người ta có nói ngược nói xuôi, chê bôi OOP thì tôi vẫn trung thành với nó và ngày càng yêu thích mô hình lập trình này.
Sở dĩ tôi thích vì cũng code qua Hướng mệnh lệnh - Imperative programming, Hướng thủ tục - Procedural programming, Hướng chức năng - Functional programming, Hướng khai báo - Declarative programming, Sau tất cả tôi quay lại OOP. Lúc mới tìm hiểu về lập trình, chắc tôi cũng giống với nhiều bạn. Hóng thấy cái mô hình mình lập trình bị chê bôi thì lung lay và tìm tới các mô hình khác tinh vi hơn. Nhưng rồi khi va vào vấn đề thì với mô hình lập trình mà mình cho là tinh vi ấy nó giải quyết có vẻ phức tạp, rối rắm thì mới chợt nhận ra là OOP nó giải quyết gọn gàng thật sự.
Thời gian đầu khi viết code OOP tôi thường bị cứng nhắc phải thể hiện sao cho đầy đủ mấy đặc tính của OOP. Tính đóng gói(Encapsulation), Tính kế thừa (Inheritance), Tính đa hình (Polymorphism ), Tính trừu tượng(Abstraction). Chính vì cứ bám lấy cái khuôn phép do mình tự đặt ra này mà bản thân thấy OOP thực sự gò bó. Một lần đọc được lời tâm sự của chính tác giả của mô hình lập trình OOP, mr.Alan Kay một lần nữa thấy thấm thía.
Alan Kay cho rằng các đối tượng trong một hệ thống phần mềm nên giao tiếp với nhau thông qua các thông điệp (messages) thay vì trực tiếp tương tác với nhau. Việc này giúp tách biệt các đối tượng ra khỏi nhau, tăng tính module hóa và đơn giản hóa việc quản lý mã nguồn. Nó cũng giúp cải thiện tính linh hoạt của hệ thống và khả năng mở rộng của nó. Alan Kay cũng nhấn mạnh rằng việc thiết kế giao tiếp giữa các đối tượng là rất quan trọng trong việc xây dựng các hệ thống phần mềm lớn và phức tạp.
Kay đã giải thích rằng lập trình hướng đối tượng cung cấp một số lợi ích quan trọng. Đầu tiên, nó cho phép các lập trình viên chia nhỏ hệ thống phức tạp thành các đối tượng đơn giản hơn, dễ quản lý hơn và tái sử dụng hơn. Thứ hai, nó giúp tăng tính linh hoạt và mở rộng của hệ thống bằng cách cho phép các đối tượng tương tác với nhau một cách tổng hợp hơn.
Từ đây, tôi bắt đầu suy ngẫm về case thực tế:
Một hệ thống, có các đối tượng chính như Khách hàng, Sản phẩm, Giỏ hàng và Đơn hàng. Làm thế nào vận hành nó theo một quy trình? OOP hướng ngay đến việc ta phải mô hình hóa được quy trình vận hành của các hành vi. Từ đấy mới tiến hành viết code.
Quy trình vận hành của các hành vi có thể được mô tả như sau:
Khi khách hàng truy cập vào trang web mua sắm, họ có thể thực hiện các hành động như xem danh sách sản phẩm, thêm sản phẩm vào giỏ hàng và đặt hàng. Những hành động này tương tác giữa các đối tượng trong hệ thống:
1. Khách hàng tương tác với danh sách sản phẩm để xem thông tin sản phẩm.
2. Khách hàng tương tác với giỏ hàng để thêm và xóa sản phẩm.
3. Khách hàng tương tác với đơn hàng để xem trạng thái đơn hàng.
4. Để hỗ trợ các tương tác này, các đối tượng phải giao tiếp với nhau và chia sẻ thông tin. Ví dụ, khi khách hàng thêm sản phẩm vào giỏ hàng, sản phẩm phải được thêm vào giỏ hàng và cập nhật số lượng sản phẩm còn lại trong kho. Các đối tượng phải giao tiếp để cập nhật thông tin sản phẩm và giỏ hàng.
Trong lập trình hướng đối tượng, các đối tượng tương tác với nhau thông qua các phương thức và thuộc tính của chúng. Ví dụ, để thêm sản phẩm vào giỏ hàng, đối tượng Giỏ hàng có thể có phương thức thêm sản phẩm, trong đó sản phẩm được truyền vào như một tham số. Đối tượng Sản phẩm có thể có thuộc tính số lượng còn lại, được cập nhật sau khi sản phẩm được thêm vào giỏ hàng.
Các đối tượng trong hệ thống mua bán trực tuyến phải có khả năng tương tác và giao tiếp với nhau để cung cấp các chức năng và tính năng cho khách hàng.
Để viết một đoạn code mô tả quy trình trên thì dài quá. Tôi sẽ lấy ví dụ với nghiệp vụ ngắn hơn đó là quy trình quản lý đăng nhập:
Giả sử chúng ta có hai đối tượng là User và AuthenticationService.
User đại diện cho người dùng và chứa thông tin về tên đăng nhập và mật khẩu của người dùng.
AuthenticationService đại diện cho dịch vụ xác thực, chứa phương thức authenticate() để xác thực tên đăng nhập và mật khẩu của người dùng.
Sử dụng các đối tượng trên, chúng ta có thể tạo ra một đoạn mã để kiểm tra tên đăng nhập và mật khẩu của người dùng.
Trong đoạn mã trên, đối tượng User được tạo ra với tên đăng nhập và mật khẩu của người dùng. Đối tượng AuthenticationService được sử dụng để kiểm tra tên đăng nhập và mật khẩu của người dùng. Các đối tượng này giao tiếp với nhau thông qua phương thức authenticate() của AuthenticationService.
Ok, Nếu voz thấy hay cho xin 1 like để tôi lấy động lực viết tieetsp
Sở dĩ tôi thích vì cũng code qua Hướng mệnh lệnh - Imperative programming, Hướng thủ tục - Procedural programming, Hướng chức năng - Functional programming, Hướng khai báo - Declarative programming, Sau tất cả tôi quay lại OOP. Lúc mới tìm hiểu về lập trình, chắc tôi cũng giống với nhiều bạn. Hóng thấy cái mô hình mình lập trình bị chê bôi thì lung lay và tìm tới các mô hình khác tinh vi hơn. Nhưng rồi khi va vào vấn đề thì với mô hình lập trình mà mình cho là tinh vi ấy nó giải quyết có vẻ phức tạp, rối rắm thì mới chợt nhận ra là OOP nó giải quyết gọn gàng thật sự.
Thời gian đầu khi viết code OOP tôi thường bị cứng nhắc phải thể hiện sao cho đầy đủ mấy đặc tính của OOP. Tính đóng gói(Encapsulation), Tính kế thừa (Inheritance), Tính đa hình (Polymorphism ), Tính trừu tượng(Abstraction). Chính vì cứ bám lấy cái khuôn phép do mình tự đặt ra này mà bản thân thấy OOP thực sự gò bó. Một lần đọc được lời tâm sự của chính tác giả của mô hình lập trình OOP, mr.Alan Kay một lần nữa thấy thấm thía.
Alan Kay cho rằng các đối tượng trong một hệ thống phần mềm nên giao tiếp với nhau thông qua các thông điệp (messages) thay vì trực tiếp tương tác với nhau. Việc này giúp tách biệt các đối tượng ra khỏi nhau, tăng tính module hóa và đơn giản hóa việc quản lý mã nguồn. Nó cũng giúp cải thiện tính linh hoạt của hệ thống và khả năng mở rộng của nó. Alan Kay cũng nhấn mạnh rằng việc thiết kế giao tiếp giữa các đối tượng là rất quan trọng trong việc xây dựng các hệ thống phần mềm lớn và phức tạp.
Kay đã giải thích rằng lập trình hướng đối tượng cung cấp một số lợi ích quan trọng. Đầu tiên, nó cho phép các lập trình viên chia nhỏ hệ thống phức tạp thành các đối tượng đơn giản hơn, dễ quản lý hơn và tái sử dụng hơn. Thứ hai, nó giúp tăng tính linh hoạt và mở rộng của hệ thống bằng cách cho phép các đối tượng tương tác với nhau một cách tổng hợp hơn.
Từ đây, tôi bắt đầu suy ngẫm về case thực tế:
Một hệ thống, có các đối tượng chính như Khách hàng, Sản phẩm, Giỏ hàng và Đơn hàng. Làm thế nào vận hành nó theo một quy trình? OOP hướng ngay đến việc ta phải mô hình hóa được quy trình vận hành của các hành vi. Từ đấy mới tiến hành viết code.
Quy trình vận hành của các hành vi có thể được mô tả như sau:
Khi khách hàng truy cập vào trang web mua sắm, họ có thể thực hiện các hành động như xem danh sách sản phẩm, thêm sản phẩm vào giỏ hàng và đặt hàng. Những hành động này tương tác giữa các đối tượng trong hệ thống:
1. Khách hàng tương tác với danh sách sản phẩm để xem thông tin sản phẩm.
2. Khách hàng tương tác với giỏ hàng để thêm và xóa sản phẩm.
3. Khách hàng tương tác với đơn hàng để xem trạng thái đơn hàng.
4. Để hỗ trợ các tương tác này, các đối tượng phải giao tiếp với nhau và chia sẻ thông tin. Ví dụ, khi khách hàng thêm sản phẩm vào giỏ hàng, sản phẩm phải được thêm vào giỏ hàng và cập nhật số lượng sản phẩm còn lại trong kho. Các đối tượng phải giao tiếp để cập nhật thông tin sản phẩm và giỏ hàng.
Trong lập trình hướng đối tượng, các đối tượng tương tác với nhau thông qua các phương thức và thuộc tính của chúng. Ví dụ, để thêm sản phẩm vào giỏ hàng, đối tượng Giỏ hàng có thể có phương thức thêm sản phẩm, trong đó sản phẩm được truyền vào như một tham số. Đối tượng Sản phẩm có thể có thuộc tính số lượng còn lại, được cập nhật sau khi sản phẩm được thêm vào giỏ hàng.
Các đối tượng trong hệ thống mua bán trực tuyến phải có khả năng tương tác và giao tiếp với nhau để cung cấp các chức năng và tính năng cho khách hàng.
Để viết một đoạn code mô tả quy trình trên thì dài quá. Tôi sẽ lấy ví dụ với nghiệp vụ ngắn hơn đó là quy trình quản lý đăng nhập:
Giả sử chúng ta có hai đối tượng là User và AuthenticationService.
User đại diện cho người dùng và chứa thông tin về tên đăng nhập và mật khẩu của người dùng.
PHP:
class User
{
private $username;
private $password;
public function __construct(string $username, string $password)
{
$this->username = $username;
$this->password = $password;
}
public function getUsername(): string
{
return $this->username;
}
public function getPassword(): string
{
return $this->password;
}
}
AuthenticationService đại diện cho dịch vụ xác thực, chứa phương thức authenticate() để xác thực tên đăng nhập và mật khẩu của người dùng.
PHP:
class AuthenticationService
{
public function authenticate(User $user): bool
{
// Kiểm tra tên đăng nhập và mật khẩu của người dùng trong cơ sở dữ liệu
// Nếu đúng, trả về true. Nếu sai, trả về false.
}
}
Sử dụng các đối tượng trên, chúng ta có thể tạo ra một đoạn mã để kiểm tra tên đăng nhập và mật khẩu của người dùng.
PHP:
$username = 'john';
$password = 'secret';
$user = new User($username, $password);
$authenticationService = new AuthenticationService();
if ($authenticationService->authenticate($user)) {
echo 'Đăng nhập thành công!';
} else {
echo 'Đăng nhập thất bại!';
}
Trong đoạn mã trên, đối tượng User được tạo ra với tên đăng nhập và mật khẩu của người dùng. Đối tượng AuthenticationService được sử dụng để kiểm tra tên đăng nhập và mật khẩu của người dùng. Các đối tượng này giao tiếp với nhau thông qua phương thức authenticate() của AuthenticationService.
Ok, Nếu voz thấy hay cho xin 1 like để tôi lấy động lực viết tieetsp