OOP의 기본 개념은 데이터와 동작 (데이터 위에 있음)을 분리 할 수 없으며 클래스 객체의 아이디어와 연결되어 있다는 것입니다. 객체에는 그와 함께 작동하는 데이터 및 메소드가 있습니다. 분명히 OOP의 원칙에 따르면 데이터 (C 구조체와 같은) 인 객체는 반 패턴으로 간주됩니다.
여태까지는 그런대로 잘됐다.
문제는 요즘 내 코드 가이 안티 패턴의 방향으로 점점 더 많이 가고있는 것으로 나타났습니다. 클래스와 느슨하게 결합 된 디자인 사이에 정보 숨기기를 더 많이 시도할수록 내 클래스는 순수한 데이터 동작 클래스가 아닌 모든 동작 데이터 클래스가 아닌 혼합 클래스가됩니다.
나는 일반적으로 다른 클래스의 존재에 대한 인식을 최소화하고 다른 클래스의 인터페이스에 대한 지식을 최소화하는 방식으로 클래스를 디자인합니다. 나는 특히 이것을 하향식으로 시행합니다. 저급 수업은 높은 수준의 수업에 대해 알지 못합니다. 예 :
일반적인 카드 게임 API가 있다고 가정하십시오. 수업이 Card
있습니다. 이제이 Card
클래스는 플레이어의 가시성을 결정해야합니다.
한 가지 방법은 수업 boolean isVisible(Player p)
을 Card
듣는 것입니다.
또 다른 것입니다 boolean isVisible(Card c)
에 Player
클래스입니다.
나는 특히 높은 수준의 Player
클래스 에 대한 지식 을 낮은 수준의 Card
클래스 에 부여하기 때문에 첫 번째 접근법을 싫어합니다 .
대신, 우리는 Viewport
클래스가 있고 Player
카드 목록에 따라 어떤 카드가 보이는지 결정 하는 클래스 가있는 세 번째 옵션을 선택했습니다 .
그러나이 방법은 가능한 멤버 함수의 클래스 Card
와 Player
클래스를 모두 빼앗습니다 . 당신이 카드의 가시성 이외의 물건에 대해이 작업을 수행하면, 당신은 남아 있습니다 Card
및 Player
모든 기능이 대부분 같은 데이터가없는, 단지 방법과 클래스를 다른 클래스에서 구현 될 때 순수하게 데이터를 포함하는 클래스 Viewport
위.
이것은 OOP의 주요 아이디어와는 분명히 반대입니다.
올바른 방법은 무엇입니까? 클래스 상호 종속성을 최소화하고 가정 지식과 결합을 최소화하는 작업을 어떻게 수행해야합니까? 그러나 모든 하위 레벨 클래스에 데이터 만 포함되고 상위 레벨 클래스에 모든 메소드가 포함되는 이상한 디자인으로 마무리하지 마십시오. 누구든지 전체 문제를 피하는 클래스 디자인에 대한 세 번째 해결책이나 관점이 있습니까?
추신 : 여기 또 다른 예가 있습니다 :
DocumentId
변경할 수없는 클래스 가 있고이 BigDecimal id
멤버에 대한 단일 멤버와 getter 만 있다고 가정하십시오 . 이제 어딘가에 메소드가 필요합니다.이 메소드 는 데이터베이스 에서이 ID에 대한 DocumentId
리턴 Document
을 제공 합니다.
당신은 :
- 클래스에
Document getDocument(SqlSession)
메소드를 추가DocumentId
하고 갑자기 퍼시스턴스 ("we're using a database and this query is used to retrieve document by id"
), DB에 액세스하는 데 사용되는 API 등에 대한 지식을 소개합니다 . 또한이 클래스는 이제 컴파일하기 위해 지속성 JAR 파일이 필요합니다. - method가있는 다른 클래스를 추가하여 클래스를 죽은
Document getDocument(DocumentId id)
상태로두고DocumentId
동작이없고 구조체와 유사한 클래스를 유지하십시오.