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 형식을 따르는 아름다움을 제거하는 방법을 없애는 것은 쓸모없는 코드를 만들어서 코드를 유지 관리하는 것이 허용 가능한 옵션이 아니라는 것을 이해합니다.
또한 이에 대한 정확한 답변이 없을 수도 있고 ( 심각한 답변보다 에세이 일 수도 있음) 의견에 기반한 것일 수도 있습니다. 그럼에도 불구하고 내 접근 방식이 실제로 단일 책임 원칙이 무엇인지 따르는 지 알고 싶습니다.
수업의 책임은 무엇입니까?