모델에 “FullName”또는 “FormattedPhoneNumber”와 같은 게터를 넣는 것이 “패턴 냄새”입니까?

ASP.NET MVC 앱을 만들고 있는데, 유용하고 편리한 게터처럼 보이는 것을 모델 / 엔터티 클래스에 넣는 습관을 들이고 있습니다.

예를 들면 다음과 같습니다.

public class Member
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string PhoneNumber { get; set; }

    public string FullName
    {
        get { return FirstName + " " + LastName; }
    }

    public string FormattedPhoneNumber
    {
        get { return "(" + PhoneNumber.Substring(0, 3) + ") " + PhoneNumber.Substring(3, 3) + "-" + PhoneNumber.Substring(6); }
    }
}

나는 사람들이 생각 궁금하네요 FullNameFormattedPhoneNumber게터.

앱 전체에서 표준화 된 데이터 형식을 만드는 것이 매우 쉬워지고 반복되는 코드를 많이 저장하는 것처럼 보이지만 데이터 형식은 모델에서 뷰 모델로 매핑 할 때 처리해야하는 요소 일 수 있습니다.

사실, 나는 원래 매핑을 수행하는 서비스 계층에 이러한 데이터 형식을 적용하고 있었지만, 포맷터를 지속적으로 작성하여 여러 곳에서 적용해야하는 부담이되었습니다. 예를 들어, 나는 대부분의보기에서 “성명”을 사용 model.FullName = MappingUtilities.GetFullName(entity.FirstName, entity.LastName);하고, 장소 전체에 같은 것을 입력하는 것이 타이핑하는 것보다 덜 model.FullName = entity.FullName우아해 보였습니다.

따라서 데이터 형식과 관련하여 선을 어디에서 그리는가? 모델에서 데이터 형식을 지정하는 것이 “좋아”입니까, 아니면 “패턴 냄새”입니까?

참고 : 내 모델에는 HTML이 없습니다. 나는 그것을 위해 HTML 도우미를 사용합니다. 나는 데이터 (특히 자주 사용되는 데이터)의 형식을 지정하거나 결합하는 것에 대해 엄격하게 이야기하고 있습니다.



답변

귀하의 예에서, 나는 FullName당신이 주신 모든 이유로 getter를 좋아하지만 FormattedPhoneNumber getter를 좋아하지 않습니다. 그 이유는 다음과 같습니다. 아마 국제 전화 번호 등이 있으면 쉽지 않을 것입니다. 그리고 전화 번호를 형식화하는 논리를의 방법으로 배치 하면 한 번 Member리팩터링 (또는 복사하여 붙여 넣기 ) 해야 할 가능성이 있습니다. 에 대한 형식의 전화 번호가 필요 , 등 너무합니다.InstitutionVendor

편집 : IMO 게터 가있는 PhoneNumber수업을하는 것이 좋습니다 Formatted.


답변

코드를 작성할 때 고려해야 할 사항 : 맞습니까? 읽을 수 있습니까? 효율적입니까? 유지 관리가 가능합니까? @btilly가 언급했듯이 문화 별 형식으로 인해 유지 관리 할 수는 없지만 더 일반적인 질문 인 것 같습니다.

이와 같은 접근자를 사용하면 코드를 더 쉽게 읽을 수 있으며 사용 방법에 따라 코드의 다른 부분이 훨씬 깨끗해질 수 있습니다. 제 생각에는 전혀 냄새가 나지 않습니다. 인쇄하려는 문자열의 형식 지정 접근자가 있으면 냄새가 나기 시작합니다 ( public string FirstLastName; public string FullName; public string FullNameWithMiddleInitial; public string PhoneNumberWithAreaCode; public string PhoneNumberWithoutAreaCode; public string PhoneNumberWithCountryCode;등).

또는 패턴을 사용한다고해서 코드에 “패턴 냄새”가 자동으로 부여되는 것은 아닙니다. 해당 속성을 얻으려면 남용해야합니다.


답변

단일 책임 원칙을 위반합니다. 전화 번호 클래스 등을 만들어 보시지 않겠습니까?


답변

귀하의 예를 들어, 특정 형식을 사용하기에는 너무 큰 거래라고 생각하지 않습니다. 하나 또는 두 개이며 응용 프로그램의 모든 부분이 동일한 형식을 사용합니다.

그 결정이 시작되기 시작하는 곳은 동일한 형식의 데이터 가 다른 형식을 요구하는 여러 곳으로 갈 때 입니다.

그런 일이 생기면 Member수업을 다시 끌어들일 유혹이 있습니다 .

public class Member
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string PhoneNumber { get; set; }
}

그런 다음 각 대상마다 다른 어댑터를 수행하십시오. 예를 들어, 정보가 CSV 형식으로 필요하다고 가정하십시오.

public static class CSVMemberAdapter
{
    public static string ToCSV(this Member mbr)
    {
         return mbr.Id + "," + mbr.LastName + "," + mbr.FirstName, "," mbr.PhoneNumber;
    }
}

항상 문자열에 쉼표 등이 없도록 데이터를 삭제했다고 가정합니다.

어댑터는 확장 방법 일 필요는 없지만,이 make-believe 경우 적합합니다.


답변