Мені цікаво, чи законним є використання дієслів, заснованих на іменниках в ООП.
Я зіткнувся з цією блискучою статтею , хоча я все ще не згоден з моментом, який вона висуває.
Щоб пояснити проблему трохи більше, у статті зазначено, що FileWriter
класу не повинно бути, наприклад , але написання є дією, це має бути методом класу File
. Ви зрозумієте, що це часто залежить від мови, оскільки програміст Ruby, ймовірно, буде проти використання FileWriter
класу (Ruby використовує метод File.open
для доступу до файлу), тоді як Java-програміст цього не зробив.
Моя особиста (і так, дуже скромна) точка зору полягає в тому, що це може порушити принцип єдиної відповідальності. Коли я програмував на PHP (адже PHP, очевидно, найкраща мова для OOP, правда?), Я часто використовував такий тип фреймворку:
<?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
чи Charset
клас насправді кодує рядки. Це має бути лише уявленням про те, що таке кодування насправді.
Таким чином, я схильний би думати, що:
File
Відкриття, читання або збереження файлів не є відповідальністю за клас.Xml
Серіалізація себе не є класною відповідальністю.User
Запит на базу даних не несе відповідальність за клас.- тощо.
Однак, якщо ми екстраполюємо ці ідеї, навіщо Object
мати toString
клас? Це не відповідальність автомобіля чи собаки перетворити себе на струну, зараз це?
Я розумію, що з прагматичної точки зору позбавлення від toString
способу краси дотримуватися суворої форми SOLID, що робить код більш доцільним, роблячи його марним, не є прийнятним варіантом.
Я також розумію, що на це може бути не точної відповіді (що більше буде нарисом, ніж серйозною відповіддю) на це, або що це може бути на основі думки. Тим не менш, я все одно хотів би знати, чи дійсно мій підхід відповідає принципу єдиної відповідальності.
Яка відповідальність класу?