Wciąż zastanawiam się, czy uzasadnione jest używanie czasowników opartych na rzeczownikach w OOP.
Natknąłem się na ten genialny artykuł , choć nadal nie zgadzam się z jego racją.
Aby wyjaśnić problem bardziej szczegółowo, artykuł stwierdza, że nie powinno być na przykład FileWriter
klasy, ale ponieważ pisanie jest akcją , powinna być metodą klasy File
. Zrozumiesz, że często zależy to od języka, ponieważ programista Ruby prawdopodobnie byłby przeciwny użyciu FileWriter
klasy (Ruby używa metody File.open
dostępu do pliku), podczas gdy programista Java nie.
Moim osobistym (i tak, bardzo skromnym) punktem widzenia jest to, że złamałoby to zasadę pojedynczej odpowiedzialności. Kiedy programowałem w PHP (ponieważ PHP jest oczywiście najlepszym językiem dla OOP, prawda?), Często używałem tego rodzaju frameworka:
<?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 );
}
}
?>
Rozumiem, że przyrostek DataHandler nie dodaje nic istotnego ; ale chodzi o to, że zasada pojedynczej odpowiedzialności dyktuje nam, że obiekt używany jako model zawierający dane (może być nazywany rekordem) nie powinien również odpowiadać za wykonywanie zapytań SQL i dostępu do bazy danych. To w jakiś sposób unieważnia wzorzec ActionRecord używany na przykład przez Ruby on Rails.
Natknąłem się na ten kod C # (tak, czwarty język obiektowy użyty w tym poście) innego dnia:
byte[] bytes = Encoding.Default.GetBytes(myString);
myString = Encoding.UTF8.GetString(bytes);
Muszę powiedzieć, że nie ma dla mnie większego sensu, aby klasa Encoding
lub Charset
klasa faktycznie kodowała łańcuchy. Powinno to być jedynie reprezentacją tego, czym tak naprawdę jest kodowanie.
W związku z tym sądzę, że:
File
Otwieranie, odczytywanie lub zapisywanie plików nie jest klasowym obowiązkiem.Xml
Serializacja nie jest obowiązkiem klasowym.User
Zapytanie bazy danych nie jest klasowym obowiązkiem.- itp.
Jeśli jednak dokonamy ekstrapolacji tych pomysłów, dlaczego mielibyśmy Object
mieć toString
klasę? Przekształcanie się w sznurek nie jest obowiązkiem samochodu ani psa, prawda?
Rozumiem, że z pragmatycznego punktu widzenia pozbycie się toString
metody upiększania przestrzegania ścisłej SOLIDNEJ formy, która sprawia, że kod jest łatwiejszy do utrzymania przez uczynienie go bezużytecznym, nie jest akceptowalną opcją.
Rozumiem również, że może nie być dokładnej odpowiedzi (która byłaby bardziej esejem niż poważną odpowiedzią) na to pytanie lub że może być oparta na opiniach. Niemniej jednak nadal chciałbym wiedzieć, czy moje podejście faktycznie jest zgodne z zasadą pojedynczej odpowiedzialności.
Jaka jest odpowiedzialność klasy?