2011-12-02 2 views
5

모든 모델이 매우 유사하게 보입니다. 대부분은 활성 레코드 코드를 포함하는 메소드 컬렉션 인 패턴을 따르는 경향이 있습니다. 다음은 그 예입니다.내 모델이 모두 동일하게 보입니다.

class Site extends CI_Model { 

    public function get_site_by_id($id) 
    { 
     // Active record code to get site by id 
    } 

    public function get_sites_by_user_id($user_id) 
    { 
     // ... 
    } 

    // ... 

    public function get_site_by_user_id_and_url_string($user_id, $url_string) 
    { 
     // ... 
    } 

    // Non active record methods and business logic 
    // ... 

} 

이 접근법은 저에게는 잘 돌아 갔지만 좀 더 우아한 해결책이 있는지 궁금합니다. 새로운 방식으로 데이터를 검색해야 할 때마다 새로운 방법을 만들어야한다고 생각합니다. 이게 일반적인 관행입니까 아니면 이것을 리펙토링하는 방법을 놓치고 있습니까?

+1

이것은 대부분 [활성 레코드] 그룹 (http://martinfowler.com/eaaCatalog/activeRecord.html)을 전체 구현 모드 레이어 대신 사용하는 부작용입니다. 리팩터링 옵션과 관련된 [this] (http://stackoverflow.com/a/11943107/727208)을 참조하십시오. –

답변

2

, 당신은

class MyCommonMethodsClass extends CI_Model { 
} 

같은 주요 모델 클래스 (CI_Model)와 클래스 (사이트), 뭔가 사이의 중간 클래스를 추가 할 수 있으며 (사이트) 수업에 확장 것 , 그것에 공통 코드를 넣는 동안. 그것은 작동 할 것이고 어떻게 든 '우아 할 수있다'. 실제로 마지막에 사이트에 적용된 기본 액션을 추가하게됩니다.

이제 '깨끗한'것이라면 그건 또 다른 문제입니다. 다시 말하지만, 엄격히 말하면 모델은 그렇게합니다. 그것은 일반적인 "고급"게터를 처리합니다. 그리고 예, 거의 항상 웹 사이트에서 동일한 코드를 사용하는 경향이 있습니다. 문제는 귀하의 코드 (코드가 적음)에서 멋지게 보일지라도 비즈니스 논리와 db 사이의 추상화를 기술적으로 희생한다는 것입니다. 당신은 모델 순수 주의자인가 실제적인 사람입니까?

+0

+1 "순정 주의자"대 "실용적인"사람 - 너무 여러 번 사람들은 일을 "올바른"방식으로하려고 더 많은 일을합니다. – swatkins

+0

네, 그게 맞아, 응용 프로그램을 함께 때리고 노크 와서 문제를 기다립니다 수 있습니다. –

1

나는 이것이 의견의 문제라고 생각하지만, 가장 좋은 방법은 GetID, UpdateByID, GetById 등과 같은 많은 기본 SQL 기능을 수행하는 CRUD (Create, Retrieve, Update, Delete) 모델을 만드는 것입니다.

CRUD 모델은 더 많은 모듈 식 쿼리를 수행하는 데 도움이 될 수 있습니다. 그러나 GetId라는 함수를 호출하고 각 테이블에 다른 기능을 갖는 것보다 매개 변수를 전달하는 것이 좋습니다.

내가 말했듯이, CRUD는 지금까지만 갈 수 있습니다. 예를 들어 데이터베이스 사용자 테이블을 쿼리하여 사용자가 확인했는지 확인하고 사용자 이름이 &이고 일치하는지 확인하는 함수를 갖는 것이 좋습니다. 이것은 고유하고 추상적 인 함수가 아니기 때문에 자체 함수를 정의해야합니다.

또한 최적의 방법으로 논리 및 데이터베이스 액세스를 같은 파일에 혼합해서는 안됩니다.

는 엄밀히 요청 다음
0

이렇게 데이터를 처리하는 데는 다른 방법을 사용하는 것이 일반적입니다. Single Responsibility Principal은 모든 개체가 매우 특정한 데이터를 얻는 여러 메서드를 만들어 유지 관리가 쉽고 코드를 디버그하기 쉽도록 만들어서 한 가지만 수행해야한다고 말합니다.

+0

특정 일을하는 경향이 있지만 많은 다른 상황에 적용 할 수있는 매우 추상적 인 기능에는 적합하지 않은 기능 일 수도 있습니다. –

+0

나는 또한 당신이 '단일 책임'이라는 말을 잘못 이해했다고 생각합니다. 이것은 함수가 데이터베이스 연결을 활성화하는 싱글 톤과 같은 하나의 액션을 갖고 있지만 여전히 재사용 될 수 있음을 의미합니다. '단일 책임'은 OOP의 캡슐화의 일부이며, 캡슐화는 재사용 가능한 코드의 원칙입니다. –

+0

모델은 매우 구체적이라고 가정합니다. 즉, 모델의 "단일 책임"은 특정 작업을 수행하는 메소드가있는 모델의 도메인에 대한 특정 검사입니다. 똑같은 일을하는 여러 모델을 가지고 있다면 코드 냄새가 난 다음 공통 코드를 새 클래스로 이동 한 다음 공용 클래스로 모델을 확장하십시오. –

0

본질적으로 동일한 기능을 제공하는 여러 클래스가있는 경우 클래스 계층 구조에 이상이있을 수 있습니다 (소위 "코드 냄새"). 그들이 유사한 상호 작용을한다면, 그것은 그들이 어떤면에서 연관되어 있음을 암시합니다. 그렇다면 모든 하위 클래스에 공통된 기능을 구현하는 공통 수퍼 클래스에서 모든 것이 상속되어야하며 각 하위 클래스는 수퍼 클래스의 일반화 된 기능을 전문으로 할 가능성이 있습니다.이 방법의

장점은 다음과 같습니다

    당신은 일을 반복하지 않을
  • 더 일반적인 방식으로 작성 될 수있는 클래스와 상호 작용 개체를 처리 할 수 ​​있습니다 (SPOT, DRY)
  • 코드 (치환)
0

다른 모델을 확장하기 위해 '기본'모델 클래스를 만드는 데 문제가 있다고 생각하지 않습니다. 견고하고 잘 테스트되면 삶이 더 쉬워 질 수 있습니다. 동일한 CRUD 함수를 반복해서 만드는 점은 무엇입니까?

새 프로젝트를 시작하기 위해 복제 한 기본 개발 리포지토리를 가질 수 있다는 또 다른 이점이 있습니다.

이 작업을 수행하는 방법에 대한 예제가 필요하면 이전에 물어 본 question을 살펴보십시오.

controllers과 동일하게 수행 할 수도 있습니다.

관련 문제