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 FileWriterklasy, 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 FileWriterklasy (Ruby używa metody File.opendostę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 Encodinglub Charsetklasa faktycznie kodowała łańcuchy. Powinno to być jedynie reprezentacją tego, czym tak naprawdę jest kodowanie.
W związku z tym sądzę, że:
FileOtwieranie, odczytywanie lub zapisywanie plików nie jest klasowym obowiązkiem.XmlSerializacja nie jest obowiązkiem klasowym.UserZapytanie bazy danych nie jest klasowym obowiązkiem.- itp.
Jeśli jednak dokonamy ekstrapolacji tych pomysłów, dlaczego mielibyśmy Objectmieć toStringklasę? Przekształcanie się w sznurek nie jest obowiązkiem samochodu ani psa, prawda?
Rozumiem, że z pragmatycznego punktu widzenia pozbycie się toStringmetody 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?