2010-12-01 6 views
6

데이터로드, 때로는 원격, 때로는 로컬, 때로는 JSON, 때로는 XML로드와 관련된 몇 가지 프로젝트를 진행하고 있습니다. 내가 겪고있는 문제는 개발 속도와 다양한 고객의 변화하는 마음으로 인해 내 디자인이 너무 단단하다는 것을 알게되었고, 나는 더 유연 해지기를 바랍니다. 나는 데이터 로딩에 대한 재사용 가능한 솔루션을 생각하려고 노력해 왔으며, 많은 사람들이 같은 문제를 안고 있다고 상상해보십시오. 내가하고 싶은 무엇디자인 패턴/데이터 로딩 솔루션

는 respectivly 구문 분석()와 loadData() 메소드가 유형 파서로더의 멤버 변수를 가지고 일반적인 LoadingOperation 추상 클래스를 만드는 것입니다. 분류 파서로더 내가로드 할 각 건에 대한 LoadingOperation를 확장하는 새로운 클래스를하고 싶은 인터페이스와이 이런 식으로 뭔가로 등 XmlParser가와 JSONParser, LocalLoader 및 RemoteLoader이 될 수 구현하는 클래스입니다 , 날씨는 로컬 XML 파일 또는 원격 JSON 또는 무엇이든간에. 문제는

특정 파서 구현이 LoadingOperation 클래스의 다형성 (polymorphic)을 깨지 않고 사용자 정의 데이터 형식을 반환 할 수 있다는 것입니다. 나는 제네릭 장난과 선언 서브 클래스를 LoadingOperation

class SpecificLoader extends LoadingOperation<CustomDataType> 

추천하고 파서 클래스와 비슷한 일을하지만,이 조금 이상한 것 같다되었다.

누구든지 잘못하고 있거나 더 잘할 수있는 것에 대한 제안 사항이 있습니까? 나는 변화하는 명세에 빨리 반응 할 수 있기를 원한다. (사실을 무시하면 그만큼 변하지 않을 것이다!) 코드의 논리적 분리가있다.

어떤 도움을 주셔서 감사합니다!

편집 : 문제는 또한 당신이 정말로 요구가 너무 빨리 변화로 부드럽게 가능한 한 적은 코드로 입력 된 무언가를 원하는 나에게 소리 여기 link text

+1

다른 출처의 동일한 데이터를 다루고 있습니까? 나는. 이 데이터로 동일한 비즈니스 모델 객체를 채우고 있습니까? 그렇지 않다면 나는 전체 접근법이 의미가 있다는 것을 의심한다 ... – Jules

+0

내 생각은 이것이 로컬 데이터/웹 서비스 등을 다루기위한 reuable 패턴이 될 것이라고 생각한다. (이것들은 짧은 dev times와 prototype을 가진 작은 모바일 어플리케이션이다. 일반적으로 로컬 데이터 만 있음). 각 프로젝트마다 때로는 변경 가능한 소스의 데이터가 동일하지만 다른 프로젝트의 경우 데이터와 모델이 완전히 다릅니다. :) – Dori

+0

죄송합니다, 이것이 어떻게 작동하는지 모르겠습니다. 구문 분석은 비즈니스 논리를 따르는 데이터를 처리하는 것으로 분명히이 논리와 데이터가 변경되므로 특정 시점에 특정 방법이 필요합니다. 특정 변형을 수행 할 때까지 레이어를 오버 레이어로 만들면 아무런 효과가 없습니다. 필자가 이해할 수있는 유일한 추상화 계층은 파서 특성을 래핑하면 myObject = loadData()의 상위 수준 호출 만 사용할 수 있습니다. 또는 loadData (myObject);를 사용하면 실제 파서 구현을 신속하게 대체 할 수 있습니다. – Jules

답변

1

물었다. 다음은 PHP를 백 엔드에 사용하는 프로젝트를 수행하는 방법입니다. 나는 sql과 json을 사용하여 데이터베이스에서 데이터를 빠르게 가져와 클라이언트로 리턴했다.

일반적으로 데이터베이스에서 select를 수행합니다. 각 결과 행에 대해 행을 맵으로 변환합니다. 여기서 각 열은 해당 열의 결과 값과 함께 키가됩니다. 이지도 목록은 일반 json rutine을 통해 json으로 변환되고 json은 서버에서 전송됩니다.

이 같은 설정은 서버에서 클라이언트로 일부 데이터를 전송하기가 매우 쉽지만 :

  • 당신이 최대 절전/XML/원격을 사용하여 얻을 수있는 느슨한 형태의 안전성.
  • 클라이언트가 데이터베이스 스키마와 밀접하게 연결되어 있습니다.
  • 데이터를 가져 와서 전송하는 것은 사악합니다.
  • 더 많은 데이터를 얻기 위해 쿼리를 변경하면 새 데이터를 사용해야하는 경우가 아니면 클라이언트를 다시 컴파일 할 필요가 없습니다.

당신이 PHP에서 내가 어떻게 보이는지의 아이디어를 제공하려면 :

내 데이터 액세스 개체에서

:

function getAllPortal() { 
    $sql = "select firstname, lastname, U.* from person, portal_user U where id=person order by firstname, lastname"; 
    $prep = $this->db->prepare($sql); 
    return $prep->execute(); 
} 

그리고 내 HTTP 서비스에

(휴식 기준) 코드 :

$accPerson = new AccountPerson($db); 
    echo json_encode($accPerson->getAllPortal()); 

Java에서 이것을 수행하려면지도 목록 (또는 전송하려는 다른 쉬운 구조)에서 데이터를 가져 오기위한 프레임 워크를 만들 필요가 있습니다 클라이언트에게). 필자는 준비된 문장을 사용할 수있는 PHP를 만들었습니다.

(위와 같이하지 않는 경우에도) 당신이 고려해야 수있는 몇 가지 다른 고려 사항가 될 수있다 :

하는 층을 피하십시오. 가능한 한 적게 가지고 가십시오. 당신이 최대 절전 모드를 사용한다면 - 포옹하십시오. 쿼리에서 직접 개체를 사용하여 json으로 변환하고 배에서 가져옵니다. 여러 사람 (또는 클라이언트)이 데이터를 사용해야하는 경우 계층이 코드를 강력하게 만듭니다. 코드가 빠르게 변경되는 것을 꺼리게 만듭니다. 언제 레이어를 할 것인지 알지 못하면 트릭을 할 수있는 한 오랫동안 저항해야합니다. 레이어 쓰기에는 시간이 필요합니다.

XML 또는 더 나은 JSON으로 이동하십시오. xml과 같은 변경에 저항하는 스키마 나 pojos 로의 직렬화를 위해 가지 마라. Pojos는 비즈니스 로직에 적합하지만 데이터 전송에는 짜증이납니다. 클라이언트가 충분히 얇 으면 json을 오브젝트로 다시 직렬화하지 마십시오. JSON을 직접 사용하십시오. 다시 말하지만, 레이어와 마찬가지로, 트릭은 pojos를 재현 할 때 비즈니스 가치를 부여 할 때와 그렇지 않은 경우를 아는 것입니다. 레이어와 마찬가지로 가치가 나타날 때까지 해당 작업을 수행하지 마십시오. 디시리얼라이저 작성/유지에는 시간이 필요합니다.