모든 정렬 전략 (SortPostsByTop, SortPostsByBest, SortPostsByNew)에 대한 ISortPostsStrategy 인터페이스가 있습니다. 하나가없는 모든 정렬 유형의 시간 프레임을 선택하려면 옵션으로 정렬해야하며 전략 패턴을 사용하려고 시도했지만 문제는 ISortPostsStrategy에 SortPostByNew가하지 않는 시간대 매개 변수가 있다는 것입니다 필요하고 사용하지 않게됩니다.
public interface ISortPostsStrategy
{
Task<IEnumerable<Post>> SortAsync(string userId, DateTime startDate);
}
public class SortPostsByNew : ISortPostsStrategy
{
private readonly UnitOfWork unitOfWork;
public SortPostsByNew(UnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork;
}
public async Task<IEnumerable<Post>> SortAsync(string userId, DateTime startDate)
{
var dbPosts = await this.unitOfWork.Posts.GetBySubcribedUserOrderedByNewAsync(userId);
return dbPosts;
}
}
public class SortPostsByBest : ISortPostsStrategy
{
private readonly UnitOfWork unitOfWork;
public SortPostsByBest(UnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork;
}
public async Task<IEnumerable<Post>> SortAsync(string userId, DateTime startDate)
{
var dbPosts = await this.unitOfWork.Posts.GetBySubscribedUserOrderedByBestAsync(userId, startDate);
return dbPosts;
}
}
전략 패턴 전에 피하려고하는 전환 사례입니다
IEnumerable<Post> dbPosts = null;
if (sortType == PostSortType.New)
{
dbPosts = await this.redditCloneUnitOfWork.Posts
.GetBySubcribedUserOrderedByNewAsync(dbUser.Id);
}
else if (sortType == PostSortType.Top)
{
dbPosts = await this.redditCloneUnitOfWork.Posts
.GetBySubcribedUserOrderedByTopAsync(dbUser.Id, startDate);
}
else if (sortType == PostSortType.Controversial)
{
dbPosts = await this.redditCloneUnitOfWork.Posts
.GetBySubscribedUserOrderedByControversialAsync(dbUser.Id, startDate);
}
else if (sortType == PostSortType.Best)
{
dbPosts = await this.redditCloneUnitOfWork.Posts
.GetBySubscribedUserOrderedByBestAsync(dbUser.Id, startDate);
}
var models = this.mapper.Map<IEnumerable<PostConciseViewModel>>(dbPosts);
- 답변 # 1
- 답변 # 2
내 이해에서, DateTime은 구체적인 전략 중 하나 (또는 일부)의 구현 세부 사항이라는 것입니다. 따라서 고급 인터페이스에는이 정보가 없어야합니다. 그러나 여러 전략에 걸쳐이 DateTime이 여전히 필요한 경우
ISortStrategy GetSortStrategy(GetSortedPostsRequestDto dto) { switch case dto.SortMode { case SortMode.New: return new SortByNewStrategy(); case SortMode.Top: return new SortByTopStrategy(); case SortMode.Recent: return new SortByRecentStrategy(dto.StartDate); //etc. } }
를 만들 수 있습니다 (또는 원하는 이름)의존성 주입을 사용하여 메소드에 DateTime을 제공하고 있습니다. 대신 시간 범위가 필요한 유형의생성자에 삽입 할 수 있습니다.
startDate
면책 조항 : 컴파일되지 않았을 수 있습니다. 테스트하지 않았습니다.
그래도 귀하의 질문에 대한 답변이 없으면 추가 정보를 제공해 주시면 도와 드리겠습니다.
BaseTimeDependentPostSortingStrategy
관련 자료
- php - Laravel로 작업하는 동안 마이그레이션을 실행하는 동안 오류를 피할 수있는 방법이 있습니까?
- Kafka에서 메시지를 처리하는 동안 데이터 손실 방지
- java - 안심하고 get 요청을 구현하는 동안 특정 조건으로 대기하는 방법
- assembly - 조건부 점프를 구현하는 동안 파이프 라인에서 명령어를 찾는 방법
- php - 삽입 작업 중 MySql 생략 + 부호 방지
- shell - ggsci에서 복제를 삭제하는 동안 메시지가 표시되지 않도록하는 방법
- Jxls에서 각각을 사용하는 동안 셀을 삽입하지 마십시오
- android - 인스트루먼트 된 테스트를 구현하는 동안 어떻게 활동을 얻거나 조롱 할 수 있습니까?
- c# - aspnet을 사용하여 데이터베이스에 데이터를 삽입하는 동안 중복 값을 피하는 방법은 무엇입니까?
- android - 탐색 라이브러리를 구현하는 동안 InflateException
- java - 내 JDA Music Bot에 대한 투표 건너 뛰기 명령을 구현하는 동안 발생하는 문제
- java - 퍼센트 기호를 가져 오는 동안 UnsupportedOperationException을 피하는 방법은 무엇입니까?
- bash - 여러 줄 문자열을 반복하는 동안 \ r을 피하는 방법
- python - 이미지에서 윤곽을 선택할 때 이미지 (바)를 그룹화하지 않으려면 어떻게해야합니까?
- python - 어레이에서 기능 엔지니어링 기능을 구현하는 동안 NumPy 오류
- Pandas 데이터 프레임을 반복하는 동안 매우 긴 시간의 Python 계산을 피하는 방법
- python - 병합 정렬을 구현하는 동안 오류가 발생했습니다 [attributeerror - 'int'object has no attribute 'data']
- python - CSV를 JSON (Pandas)으로 변환하는 동안 \ n 방지하려면 어떻게해야합니까?
- Mesibo Android SDK 구현 중 오류
- oracle - 구체화 된보기 새로 고침 중에 아카이브 로그 작성을 피하는 방법
여기서 근본적인 문제는 사용자 인터페이스가 사용자 요구를 기계 친화적 인 형식 (이 경우 정렬 전략 중 하나)으로 변환해야한다는 것입니다. 따라서 일부 코드는 어딘가에 사용자의 입력을보고 아마도
if
로 결정해야합니다. 수행 할 논리 경로와 인스턴스화 할 전략 유형. 사용자 인터페이스 프로그래밍의 이러한 측면은 피할 수 없습니다.이러한 코드를 넣는 가장 안전하고 합리적인 장소는 가능한 한 사용자 인터페이스 컨트롤에 가깝습니다. 몇 가지 이유가 있습니다 :
<올>번역 코드를 사용자 인터페이스 모듈 자체에 배치하면 다른 코드가 종속되는 코드를 피할 수 있습니다.
사용자 인터페이스 디자인은 비즈니스 규칙보다 더 빠르게 변하는 경향이 있습니다. 사용자는 동일한 문제를 해결할 수있는 끝없는 새로운 방법을 찾습니다. 상황이 동시에 변경 될 때 소스 코드로 통합하면 코드 및 빌드 관리, QA 및 배포 문제가 쉬워집니다.
코드의 추악함은 사용자 인터페이스 디자인의 맥락에서만 의미가 있으므로,이를 조합하면 향후 개발자가 진행 상황을 더 쉽게 이해할 수 있습니다.
디자인 패턴의 경우 개발자가 약간 스파게티처럼 보이는 코드를 작성할 수있는 몇 가지 영역 중 하나입니다. 요구 사항의 현실은 디자인이 기계적인 요소가 아니라 건축적인 우아함이 아닌 인적 요소에 맞게 최적화되어야한다는 것입니다. 즉,
switch/case
사용 "알겠습니다"와이즈 위즈를 넣어 다른 데이터 검색 호출에 대해서는 일반적으로 복제하지 않을 호출에 대한 논리가 있기 때문에 문제가 있습니다. 따라서 전략 패턴은 나쁘지 않습니다. 일련의 사용자 입력이 주어지면 DTO로 전달 된 전략을 반환 할 수있는 팩토리 패턴을 제안합니다.
높은 수준에서 다음과 같이 보일 수 있습니다 :
이 접근법은 DTO가 C # 코드 외부에서 올 때 특히 효과적입니다. 자바 스크립트로 정리하여 REST 호출을 통해 전송 한 경우와이즈 비즈 방법은 당신의
이 패턴을 사용하면var dto = new GetSortedPostsRequestDto { StartDate = inputForm.StartDatePicker.SelectedDate, SortMode = inputForm.GetSelectedSortMode() }; var strategy = GetSortStrategy(dto); var results = unitOfWork.GetSortedPosts(strategy);
입니다 존재할 것이다. 팩토리 클래스가 반드시 문제가되지는 않지만 일반적으로 제네릭이 아닌 팩토리 메소드로 작성할 수 있습니다.case/switch
를 전달할 수 있습니다. 그것이 사용자의 선택에 적용되는 경우에만.