2012-09-08 4 views
1

다음은 데이터 매핑 패턴 (단순화 된)에 대한 클래스 구조의 예입니다. save 및 find 메소드는 기술적으로 구체적인 클래스에서 구현되지만 아직 아무 것도하지 않습니다. 이것을 피하기위한 대안은 무엇입니까? 내가 현재 사용하고있는 하나의 옵션은 인터페이스를 구현하는 추상 DataMapperAbstract 클래스이며, 모든 메소드에 대한 예외를 throw 한 다음 모든 구체적인 데이터 매퍼는 사용하는 함수 만 구현하면됩니다. 단지 나쁜 냄새가납니다. 개인적으로, 각 메서드 (DataMapper_FindInterface, DataMapper_SaveInterface, DataMapper_DeleteInterface 등)에 대해 별도의 인터페이스를 만드는 방법을 생각해 보았지만 약간 냄새가 난다.구현되지 않은 추상 메소드가 설계 결함입니까?

interface DataMapperInterface 
    { 
      public function find($params); 
      public function save($object); 
      public function delete($object); 
    } 

    class DataMapper_User implements DataMapperInterface 
    {        
      public function find($params) 
      {      
        //Execute code to retrieve data from data source 
        return someDataRetrievalMethod($params); 
      } 

      public function save($object) 
      { 
        throw new Exception('Method not yet implemented.'); 
      } 

      public function delete($object) 
      { 
        throw new Exception('Method not yet implemented.'); 
      } 
    } 
+3

를이 방법은 * 아직 * 구현되지 있다면, 그때는 괜찮습니다. 일시적으로 누락 된 기능입니다. 결국, 당신은 그것을 추가 할 것입니다. 그렇지 않다면 나는 그것이 꽤 큰 결함이라고 말하고 싶습니다. 클래스 사용자가 기능이 지원되는지 여부를 감지 할 수있는 방법이 없으므로 다른 방법이 없습니다. 나는 여분의 인터페이스를 만들거나 "canSave"/ "canDelete"메서드를 추가합니다. – luiscubal

+0

@luiscubal 좋은 아이디어 ..'false' 값을 가진'canSave \ canDelete'에 대한 추상적 인 클래스를 제공하는 것이 훨씬 낫습니다. –

답변

1

다른 메소드를 구현하는 클래스에 속하지 않는 한 클래스를 추상화하십시오.

추상 클래스는 인스턴스화 할 수 없으며 구현을 통해 추상 클래스를 확장하는 다른 클래스가 있어야합니다.

그래서 지금까지의 코드는 다음과 같습니다

interface DataMapperInterface 
    { 
      public function find($params); 
      public function save($object); 
      public function delete($object); 
    } 

    abstract class DataMapper_User implements DataMapperInterface 
    {        
      public function find($params) 
      {      
        //Execute code to retrieve data from data source 
        return someDataRetrievalMethod($params); 
      } 

    } 
+0

DataMapper_User는 인스턴스화 될 최종 클래스이지만, <> DataMapper_User를 확장하더라도 PHP는 '추상 메소드 2 개를 포함하므로 추상 메소드로 선언하거나 나머지 메소드를 구현해야합니다.'. 따라서 아무 것도하지 않더라도 여전히 메소드를 구현해야합니다. –

+0

나는 대중들에게 방법을 찾고, 저장하고, 삭제할 것을 강요하지만, 구현할 것을 요구하지 않는다. 우리의 데이터 맵퍼 중 일부는 세 가지 작업 중 일부를 담당 할 필요가있다. 궁극적으로 우리는 이들 모두가 모든 것을 책임지기를 원하지만 시스템에서 시스템으로 장기간 마이그레이션을하고 있습니다. –

관련 문제