2009-06-09 4 views
0

테이블의 행을 나타내는 클래스가 있습니다. 행에있는 데이터를 조작하는 함수를 추가하고 싶습니다. 함수를 어디에 추가해야합니까?어디로 가야합니까?

1) 클래스와 관련되어 있으므로 2) 별도의 도우미 클래스로 클래스 외부에 있습니까?

과거에는 항상 1을 선택했을 것입니다. 논리를 자체 캡슐화 된 클래스로 분리하고 데이터 클래스의 복잡성을 줄이기 때문에 숫자 2가 더 나은 대답이라고 생각하기 시작했습니다. 나는 데이터 클래스가 가능한 맨손으로 남겨져 야하고, 논리가 전혀없는 데이터 멤버만을 포함해야한다고 생각하고있다.

가장 효과적인 방법은 무엇입니까?

답변

2

단일 책임 원칙은 "개체가 변경되는 유일한 이유가 있어야합니다."라고 명시되어 있습니다. 옵션 1을 사용하면 오브젝트가 변경 될 수있는 두 가지 이유가 있습니다. 오브젝트에 저장된 데이터를 변경하거나 다른 데이터베이스 시스템 (예 : mySQL에서 PostgrSQL)으로 변경할 수있는 이유가 있습니다.

당연히 모든 것과 마찬가지로 트레이드 오프입니다. 한 곳에서 모든 코드를 사용하면 몇 가지 이점이 있습니다. 앞으로 다른 RDBMS로 전환 할 것 같지 않다면 모든 것을 하나의 클래스로 결합하는 것이 좋습니다.

미래에는 다른 데이터베이스로 전환하거나 심지어 여러 데이터베이스 백엔드를 지원할 것으로 예상되는 경우 별도의 클래스에 지속성을 설정하는 것이 좋습니다.

+1

재사용 가능한 프레임 워크를 개발하지 않는 한 데이터베이스 시스템 변경에 대해 걱정하지 마십시오.대부분의 응용 프로그램은 결국 데이터베이스 시스템을 변경하지 않으므로 일반적으로 낭비되는 작업입니다. 물론, 예기치 않은 환경에서 다른 사람들이 사용할 재사용 가능한 프레임 워크를 사용하고 있다면 그렇습니다. 구현에 시간을 투자하는 것이 좋습니다. –

+0

때때로 (예상치 못한) 데이터베이스 시스템을 변경해야합니다. 그러나 필요한 경우에만 해결해야 할 부분입니다. 아직 필요하지 않으면 복잡성을 감당할 가치가 없습니다. –

3

"활성 레코드"또는 "저장소"가 더 많은지 여부에 따라 다릅니다. 나는 정말로 옳은 대답이 있는지 모르겠다. 단지 코드베이스에서 의미가있다. 또한 일관성을 좋은 디자인만큼이나 중요하게 여기는 방식으로 나머지 코드를 디자인하는 방법을 고려할 것입니다.

2

순수 MVC의 의미에서 번호 2가 최선의 방법입니다. 데이터 모델을 생성하고 모든 구현 로직이없는 상태로 두십시오. 이렇게하면 잠재적으로 응용 프로그램에서 모델을 재사용 할 수 있습니다. 그런 다음 컨트롤러는 데이터를 조작하는 응용 프로그램 별 구현 논리를 저장할 수 있습니다.

0

기능에 따라 다릅니다. 클래스의 요점은 일반적으로 함수와 데이터를 캡슐화하는 것입니다.

함수가 행 클래스에 보유 된 데이터 유형과 관련이 있고 행 클래스가 일] 적이면 행에서 서브 클래스 화하여 함수를 스틱 할 수 있습니다.

도우미 클래스는 클래스의 복잡도를 줄이는 데 유용하지만 도우미와 클래스의 역할이 명확하게 정의되어 향후 유지 관리가 해당 계약을 진절머리 나게하지 않도록해야합니다.

1

정답은 "의존적"입니다. "행의 데이터 조작"은 어느 쪽이든 대답을 정당화 할 수 있습니다.

관심사를 구분할 때이 기능이 어떤 추상화를 조작하는지 식별해야합니다. 데이터베이스에있는 행의 추상화입니까? 그 수업에 넣으세요. 데이터 모델에서 데이터베이스의 행으로 구현되는 객체입니까? 그 수업에 넣으세요.

더 일반적으로 말해서 함수를 적용 할 추상 수준에서 함수를 배치해야하며 이는 전반적인 디자인에 크게 좌우됩니다.

관련 문제