2017-02-27 1 views
1

(제목이 있는지, 적절하지 않은 경우 죄송합니다 어떻게 제대로 단어 질문에) (거리 주소와 집, 등)OOP 기본 - C# 리팩토링?

User (사람)는 Property를 소유하고있다.

프로젝트를 리팩터링하고 다음과 같은 상황이 발생합니다. 나는 Property 클래스와 User 클래스를 가지고 있습니다.

비즈니스 규칙 : 사용자 은 하나 이상의 속성이입니다.

그럼, 더 의미가 있습니다 :

User.GetProperties()또는

Properties.Get(userId)

은 현재 내가 User 클래스를 통해 속성에 액세스하고 있습니다. 이 관계를 처리하는 일반적인 방법인지 확실하지 않습니다. 너/할머니가 뭐라 생각하니?

여기 앞으로 생각하고 내가 나중에이 있기 때문에 우려에 대한 이유는 다음과 같습니다

Property.Get(state)

Property.Get(zip)

Property.Get(city)

Property.Get(numberOfBedroom)

속성을 얻는 다른 방법은 입니다.Property 클래스를 통해 액세스 할 수 있습니다. 권리? (나는 이것에 대해 확고합니다.) 이렇게하면, 이것으로 액세스하는 방법이 변경됩니까 사용자 속성?

업데이트 나는 내가 두 개의 클래스가 말했듯이 제대로의 클래스를 만드는 방법을 요구하고 있지 않다

.내 질문은, 더 나은 진술입니다 :

해야 주어진 시나리오에 대한 내 웹 API (User은 하나 이상의 Property [이거]가) :

/api/user/properties/{userId} // get all user properties

또는

api/property/user/{userId} // get all user properties

api/property/zip/{zipCode} // get all properties by zip

api/property/state/{state} // get all properties by state

api/property/city/{city} // get all properties by city

지난 3 예 주어진 그래서

, 이후 3 경우에 대한 모든 api/property/...을 구현하는 동안

(A) /api/user/properties/{userId}를 구현하는 것이

또는

(b) 일관성을 유지하고 api/property/user/... 관점에서 UserProperty [ies]를 쿼리 하시겠습니까?

다음,이 질문에 대답 한 후, 난 여전히이 List<Property>

또는

나는 List<Property>

을 반환하는 GetByUser(int userId) 방법으로 Property 클래스를 가질 수 반환하는 GetProperties() 방법과 User 클래스를 가질 수있다

현실 세계에서 User은 하나 이상의 Property을 가지지 않으므로 주위에 없습니다. 그래서 우리의 기본적인 OOP 본능은 그것을 모델링하는 것이지만 WebApi와 잠재적으로 공개적으로 노출 된 API를 생각할 때 나중에 사용하는 것이 더 좋을 것이라고 생각하지만 User에서 Propert을 얻는 C# (서버 쪽) 감각이지만 프런트 엔드 개발자 (jQuery, Angular, JavaScript 등)는 API를 원하고 유창하게 사용하기 때문에 api/property/user/...은 논리적 일 수 있으며 api/user/propties/... (또는 내가 볼 수 있습니다.)을 생각하지 못할 수도 있습니다 ...

그래서 어떤 API 메소드를 사용하겠습니까? 왜, 어떤 클래스 모델을 사용할 것이며 그 이유는 무엇입니까?

감사합니다.

업데이트 2

같은 클래스의 메소드를 유창 API의 API를 OOP의 정확성 및 api/property/user/...에 대한 두 가지 api/user/properties/...를 생성하고이 모두를 호출 "대답은 모두가 될 수있다"(자신에게 생각)? 권리?

+0

에 대한 유용한 참조 그것은 당신의 비즈니스 규칙은 더 복잡한 것 같다 : 속성 기술자의 목록이, 사용자는 이러한 설명자에 대해 하나 이상의 속성 값을 가질 수 있습니다. 사실입니까? –

+1

커프 추측을 벗어남 - 사용자를 추적/식별하는 것보다 속성을 추적/식별하는 것이 더 중요합니다. 귀하의 API가 등록 정보 및 사용자, ZIP 또는 주에 관한 것보다 관심있는 등록 정보 모음을 가져 오는 다양한 방법에 관한 것이어야한다고 생각합니다. 간단히 말해서, 나는 api/properties/[속성의 일부 속성/{[attribute value]}이 비교적 깨끗하고 이해하기 쉬운 형식을 만들 것이라고 생각한다. –

+0

업데이트 됨, "사용자 (개인)가 재산 (집, 주소 등)을 소유하고 있지 않습니다." –

답변

1

엔티티 (사람, 속성)와 비즈니스 논리라는 두 가지 별도의 항목을 혼합합니다. 제 생각에는 Person 및 Property 클래스가 있어야하며 Person 클래스에는 Properties 컬렉션이 있지만 비즈니스 로직은 별도의 구성 요소로 이동해야합니다.GetPropertiesByState, GetPropertiesByUser 등의 메소드를 가지는 PropertyComponent (또는 PropertyRepo 만).

1

나머지는 리소스 식별자를 사용하여 리소스를 식별해야합니다. 제 생각에는, API 구조가

/api/users/ --> Get all users 
/api/users/{userId} --> Ger one user 
/api/users/{userId}/properties/ --> Get properties of one user 
/api/users/{userId}/properties/{propertyid} --> Get one property of one user 

이 속성

/api/properties/ --> Get all properties 
/api/properties/{propertyid} --> Get one properties 
/api/properties?filter=(zip:zipCodeValue) --> Get all properties by zip code 
/api/properties?filter=(state:stateValue) --> Get all properties by state 
를 얻을 수 있어야한다

나머지 https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm