OOP에서 명사를 기반으로하는 동사를 사용하는 것이 합법적인지 궁금합니다.
이 기사 의 요점에 여전히 동의하지 않더라도이 훌륭한 기사를 발견 했습니다.
문제를 조금 더 설명하기 위해이 기사에서는 FileWriter
클래스 가 없어야한다고 기술 하지만, 글쓰기는 액션 이므로 클래스 의 메소드 여야합니다 File
. 루비 프로그래머가 FileWriter
클래스를 사용하지 않을 가능성이 있기 때문에 (언제나 File.open
파일에 액세스하는 방법 ), 자바 프로그래머는 그렇지 않기 때문에 언어에 의존한다는 것을 알게 될 것 입니다.
저의 개인적인 관점 (그리고 매우 겸손한)은 그렇게하면 단일 책임 원칙을 어기 게됩니다. 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
또는 Charset
클래스가 실제로 문자열을 인코딩 한다는 것이 의미가 없다고 말해야합니다 . 인코딩이 실제로 무엇인지를 나타내는 것일뿐입니다.
따라서 다음과 같이 생각하는 경향이 있습니다.
File
파일을 열거 나 읽거나 저장 하는 것은 수업 책임 이 아닙니다 .Xml
직렬화 하는 것은 클래스 책임 이 아닙니다 .User
데이터베이스를 쿼리하는 것은 클래스 책임 이 아닙니다 .- 기타
우리는 이러한 아이디어를 추정하는 경우에는, 왜 것 Object
이 toString
클래스를? 스스로를 문자열로 변환하는 것은 자동차 또는 개의 책임이 아닙니다.
실용적 관점에서 볼 toString
때 엄격한 SOLID 형식을 따르는 아름다움을 제거하는 방법을 없애는 것은 쓸모없는 코드를 만들어서 코드를 유지 관리하는 것이 허용 가능한 옵션이 아니라는 것을 이해합니다.
또한 이에 대한 정확한 답변이 없을 수도 있고 ( 심각한 답변보다 에세이 일 수도 있음) 의견에 기반한 것일 수도 있습니다. 그럼에도 불구하고 내 접근 방식이 실제로 단일 책임 원칙이 무엇인지 따르는 지 알고 싶습니다.
수업의 책임은 무엇입니까?