Tôi cứ tự hỏi liệu có hợp pháp không khi sử dụng các động từ dựa trên danh từ trong OOP.
Tôi đã xem qua bài viết tuyệt vời này , mặc dù tôi vẫn không đồng ý với quan điểm của nó.
Để giải thích vấn đề nhiều hơn một chút, bài viết nói rằng không nên có một FileWriter
lớp, nhưng vì viết là một hành động nên nó là một phương thức của lớp File
. Bạn sẽ nhận ra rằng nó thường phụ thuộc ngôn ngữ vì một lập trình viên Ruby có thể sẽ chống lại việc sử dụng một FileWriter
lớp (Ruby sử dụng phương thức File.open
để truy cập một tệp), trong khi đó, một lập trình viên Java thì không.
Quan điểm cá nhân của tôi (và vâng, rất khiêm tốn) là làm như vậy sẽ phá vỡ nguyên tắc Trách nhiệm duy nhất. Khi tôi lập trình bằng PHP (vì rõ ràng PHP là ngôn ngữ tốt nhất cho OOP, phải không?), Tôi thường sử dụng loại khung này:
<?php
// This is just an example that I just made on the fly, may contain errors
class User extends Record {
protected $name;
public function __construct($name) {
$this->name = $name;
}
}
class UserDataHandler extends DataHandler /* knows the pdo object */ {
public function find($id) {
$query = $this->db->prepare('SELECT ' . $this->getFields . ' FROM users WHERE id = :id');
$query->bindParam(':id', $id, PDO::PARAM_INT);
$query->setFetchMode( PDO::FETCH_CLASS, 'user');
$query->execute();
return $query->fetch( PDO::FETCH_CLASS );
}
}
?>
Theo hiểu biết của tôi thì DataHandler không thêm bất cứ thứ gì có liên quan ; nhưng vấn đề là nguyên tắc trách nhiệm duy nhất cho chúng ta biết rằng một đối tượng được sử dụng làm mô hình chứa dữ liệu (có thể được gọi là Bản ghi) cũng không nên có trách nhiệm thực hiện các truy vấn SQL và truy cập DataBase. Điều này bằng cách nào đó làm mất hiệu lực mẫu ActionRecord được sử dụng bởi Ruby on Rails.
Tôi đã bắt gặp mã C # này (yay, ngôn ngữ đối tượng thứ tư được sử dụng trong bài đăng này) vào một ngày khác:
byte[] bytes = Encoding.Default.GetBytes(myString);
myString = Encoding.UTF8.GetString(bytes);
Và tôi phải nói rằng nó không có ý nghĩa gì với tôi rằng một Encoding
hoặc một Charset
lớp thực sự mã hóa các chuỗi. Nó chỉ nên là một đại diện cho những gì một mã hóa thực sự là.
Vì vậy, tôi có xu hướng nghĩ rằng:
- Việc
File
mở, đọc hoặc lưu tệp không phải là trách nhiệm của lớp. - Nó không phải là một
Xml
trách nhiệm giai cấp để tuần tự hóa chính nó. User
Truy vấn cơ sở dữ liệu không phải là trách nhiệm của lớp.- Vân vân.
Tuy nhiên, nếu chúng ta ngoại suy những ý tưởng này, tại sao lại Object
có một toString
lớp học? Bây giờ không phải là trách nhiệm của một chiếc Xe hay Chó để chuyển đổi thành một chuỗi, phải không?
Tôi hiểu rằng từ quan điểm thực dụng, loại bỏ toString
phương pháp cho vẻ đẹp của việc tuân theo một hình thức RẮN nghiêm ngặt, làm cho mã dễ duy trì hơn bằng cách làm cho nó vô dụng, không phải là một lựa chọn chấp nhận được.
Tôi cũng hiểu rằng có thể không có câu trả lời chính xác (sẽ là một bài luận hơn là một câu trả lời nghiêm túc) cho vấn đề này, hoặc nó có thể dựa trên ý kiến. Tuy nhiên, tôi vẫn muốn biết liệu cách tiếp cận của tôi có thực sự tuân theo nguyên tắc trách nhiệm đơn lẻ thực sự là gì không.
Trách nhiệm của một lớp học là gì?