>

모든 정렬 전략 (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

    여기서 근본적인 문제는 사용자 인터페이스가 사용자 요구를 기계 친화적 인 형식 (이 경우 정렬 전략 중 하나)으로 변환해야한다는 것입니다. 따라서 일부 코드는 어딘가에 사용자의 입력을보고 아마도 if 로 결정해야합니다.  수행 할 논리 경로와 인스턴스화 할 전략 유형. 사용자 인터페이스 프로그래밍의 이러한 측면은 피할 수 없습니다.

    이러한 코드를 넣는 가장 안전하고 합리적인 장소는 가능한 한 사용자 인터페이스 컨트롤에 가깝습니다. 몇 가지 이유가 있습니다 :

    <올>

    번역 코드를 사용자 인터페이스 모듈 자체에 배치하면 다른 코드가 종속되는 코드를 피할 수 있습니다.

    사용자 인터페이스 디자인은 비즈니스 규칙보다 더 빠르게 변하는 경향이 있습니다. 사용자는 동일한 문제를 해결할 수있는 끝없는 새로운 방법을 찾습니다. 상황이 동시에 변경 될 때 소스 코드로 통합하면 코드 및 빌드 관리, QA 및 배포 문제가 쉬워집니다.

    코드의 추악함은 사용자 인터페이스 디자인의 맥락에서만 의미가 있으므로,이를 조합하면 향후 개발자가 진행 상황을 더 쉽게 이해할 수 있습니다.

    디자인 패턴의 경우 개발자가 약간 스파게티처럼 보이는 코드를 작성할 수있는 몇 가지 영역 중 하나입니다. 요구 사항의 현실은 디자인이 기계적인 요소가 아니라 건축적인 우아함이 아닌 인적 요소에 맞게 최적화되어야한다는 것입니다. 즉, switch/case 사용  "알겠습니다"

    와이즈 위즈를 넣어  다른 데이터 검색 호출에 대해서는 일반적으로 복제하지 않을 호출에 대한 논리가 있기 때문에 문제가 있습니다. 따라서 전략 패턴은 나쁘지 않습니다. 일련의 사용자 입력이 주어지면 DTO로 전달 된 전략을 반환 할 수있는 팩토리 패턴을 제안합니다.

    높은 수준에서 다음과 같이 보일 수 있습니다 :

    switch/case
    
    

    이 접근법은 DTO가 C # 코드 외부에서 올 때 특히 효과적입니다. 자바 스크립트로 정리하여 REST 호출을 통해 전송 한 경우

    와이즈 비즈  방법은 당신의 var dto = new GetSortedPostsRequestDto { StartDate = inputForm.StartDatePicker.SelectedDate, SortMode = inputForm.GetSelectedSortMode() }; var strategy = GetSortStrategy(dto); var results = unitOfWork.GetSortedPosts(strategy); 입니다  존재할 것이다. 팩토리 클래스가 반드시 문제가되지는 않지만 일반적으로 제네릭이 아닌 팩토리 메소드로 작성할 수 있습니다.

    GetSortStrategy()
    
    

    이 패턴을 사용하면 case/switch 를 전달할 수 있습니다.  그것이 사용자의 선택에 적용되는 경우에만.

  • 답변 # 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

관련 자료

  • 이전 oop - PHP의 부모 객체
  • 다음 quicksort - 빠른 정렬은 병합 정렬보다 느립니다