Я продолжаю задаваться вопросом, является ли законным использование глаголов, основанных на существительных в ООП.
Я наткнулся на эту блестящую статью , хотя я все еще не согласен с тем, что она делает.
Чтобы объяснить проблему чуть подробнее, в статье говорится, что не должно быть, например, 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);
И я должен сказать, что для меня не имеет особого смысла, что класс Encodingor на Charsetсамом деле кодирует строки. Это должно быть просто представление о том, что такое кодировка.
Таким образом, я склонен думать, что:
- Это не
Fileкласс ответственность открывать, читать или сохранять файлы. - Это не
Xmlответственность класса, чтобы сериализовать себя. - Это не
Userкласс ответственности за запрос базы данных. - и т.п.
Однако, если экстраполировать эти идеи, почему бы Objectиметь toStringкласс? Это не ответственность Автомобиля или Собаки, чтобы преобразовать себя в строку, не так ли?
Я понимаю, что с прагматической точки зрения избавление от toStringметода для красоты следования строгой форме SOLID, которая делает код более легким в обслуживании, делая его бесполезным, не является приемлемым вариантом.
Я также понимаю, что на этот вопрос не может быть точного ответа (который был бы скорее эссе, чем серьезного ответа), либо что он может быть основан на мнении. Тем не менее, я все еще хотел бы знать, действительно ли мой подход соответствует принципу единственной ответственности.
Какова ответственность класса?