我一直想知道在OOP中使用基于名词的动词是否合法。
我遇到了这篇精彩的文章,尽管我仍然不同意它的观点。
为了进一步解释该问题,文章指出,例如,不应有一个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查询和数据库访问的责任。这使Ruby on Rails例如使用的ActionRecord模式无效。
前几天,我遇到了这个C#代码(是,本文中使用的第四种目标语言):
byte[] bytes = Encoding.Default.GetBytes(myString);
myString = Encoding.UTF8.GetString(bytes);
我得说,Encoding
or或Charset
class实际上编码字符串对我来说没有多大意义。它仅应表示编码的真正含义。
因此,我倾向于认为:
File
打开,读取或保存文件不是类的责任。Xml
序列化自己不是阶级责任。User
查询数据库不是类责任。- 等等
然而,如果我们推断这些想法,为什么Object
有toString
课吗?现在,将自身转换为字符串不是汽车或狗的责任吗?
我了解从务实的角度出发,toString
放弃遵循严格的SOLID格式的美的方法是不可接受的选择,该方法通过使代码变得无用而使代码更易于维护。
我也理解,可能对此没有确切的答案(更多的是论文,而不是严肃的答案),或者可能是基于观点的。不过,我仍然想知道我的方法是否真正遵循单一责任原则。
班级有什么责任?