Я продолжаю задаваться вопросом, является ли законным использование глаголов, основанных на существительных в ООП.
Я наткнулся на эту блестящую статью , хотя я все еще не согласен с тем, что она делает.
Чтобы объяснить проблему чуть подробнее, в статье говорится, что не должно быть, например, FileWriter
класса, но поскольку написание является действием, оно должно быть методом класса File
. Вы поймете, что это часто зависит от языка, поскольку программист на Ruby, скорее всего, будет против использования FileWriter
класса (Ruby использует метод File.open
для доступа к файлу), тогда как программист на Java этого не сделает.
Моя личная (и да, очень скромная) точка зрения заключается в том, что это нарушит принцип единой ответственности. Когда я программировал на PHP (потому что PHP, очевидно, лучший язык для ООП, верно?), Я часто использовал такой тип фреймворка:
<?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 );
}
}
?>
Насколько я понимаю, суффикс DataHandler не добавляет ничего значимого ; но суть в том, что принцип единой ответственности диктует нам, что объект, используемый в качестве модели, содержащей данные (может быть, она называется записью), также не должен отвечать за выполнение запросов SQL и доступа к базе данных. Это как-то делает недействительным шаблон ActionRecord, используемый, например, Ruby on Rails.
Я наткнулся на этот код C # (да, четвертый объектный язык, используемый в этом посте) только на днях:
byte[] bytes = Encoding.Default.GetBytes(myString);
myString = Encoding.UTF8.GetString(bytes);
И я должен сказать, что для меня не имеет особого смысла, что класс Encoding
or на Charset
самом деле кодирует строки. Это должно быть просто представление о том, что такое кодировка.
Таким образом, я склонен думать, что:
- Это не
File
класс ответственность открывать, читать или сохранять файлы. - Это не
Xml
ответственность класса, чтобы сериализовать себя. - Это не
User
класс ответственности за запрос базы данных. - и т.п.
Однако, если экстраполировать эти идеи, почему бы Object
иметь toString
класс? Это не ответственность Автомобиля или Собаки, чтобы преобразовать себя в строку, не так ли?
Я понимаю, что с прагматической точки зрения избавление от toString
метода для красоты следования строгой форме SOLID, которая делает код более легким в обслуживании, делая его бесполезным, не является приемлемым вариантом.
Я также понимаю, что на этот вопрос не может быть точного ответа (который был бы скорее эссе, чем серьезного ответа), либо что он может быть основан на мнении. Тем не менее, я все еще хотел бы знать, действительно ли мой подход соответствует принципу единственной ответственности.
Какова ответственность класса?