私は、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#コード(この投稿で使用した4番目のオブジェクト言語)に出会いました。
byte[] bytes = Encoding.Default.GetBytes(myString);
myString = Encoding.UTF8.GetString(bytes);
また、Encoding
or Charset
クラスが実際に文字列をエンコードすることはあまり意味がないと言わざるを得ません。それは単にエンコーディングが実際に何であるかの表現でなければなりません。
したがって、私はそう思う傾向があります:
File
ファイルを開いたり、読み込んだり、保存したりすることはクラスの責任ではありません。Xml
シリアル化することはクラスの責任ではありません。User
データベースを照会することはクラスの責任ではありません。- 等
私たちはこれらのアイデアを外挿する場合は、なぜでしょうObject
持っているtoString
クラスは?文字列に変換するのは車や犬の責任ではありません。
実用的な観点から、toString
厳密なSOLIDフォームに従うことの美しさのためのメソッドを取り除くことは理解できません。
また、これに対する正確な答え(真剣な答えよりもエッセイ)がない場合や、意見に基づいている場合があることも理解しています。それにもかかわらず、私のアプローチが単一責任原則が実際に何であるかを実際に追っているかどうかを知りたいです。
クラスの責任は何ですか?