"계산 된"값을 속성 또는 메서드로 노출해야합니까?


13

웹 콘텐츠 관리 시스템의 콘텐츠 유형을 나타내는 C # 클래스가 있습니다.

웹 컨텐츠 편집기가 오브젝트 표시 방법에 대한 HTML 템플리트를 입력 할 수있는 필드가 있습니다. 기본적으로 객체 속성 값을 HTML 문자열로 대체하기 위해 핸들 바 구문을 사용합니다.

<h1>{{Title}}</h1><p>{{Message}}</p>

클래스 디자인 관점에서 형식화 된 HTML 문자열 (대체 포함)을 속성 또는 메서드 로 노출해야 합니까?

속성으로 예 :

public class Example
{
  private string _template;
  public string Title { get; set; }
  public string Message { get; set; }
  public string Html 
  {
    get
    {
      return this.ToHtml();
    }
    protected set { }
  }

  public Example(Content content)
  {
    this.Title = content.GetValue("title") as string;
    this.Message = content.GetValue("message") as string;
    _template = content.GetValue("template") as string;
  }

  private string ToHtml()
  {
    // Perform substitution and return formatted string.
  }  
}

방법으로 예 :

public class Example
{
  private string _template;
  public string Title { get; set; }
  public string Message { get; set; }

  public Example(Content content)
  {
    this.Title = content.GetValue("title") as string;
    this.Message = content.GetValue("message") as string;
    _template = content.GetValue("template") as string;
  }

  public string ToHtml()
  {
    // Perform substitution and return formatted string.
  }  
}

디자인 관점에서 차이가 나거나 한 접근법이 다른 접근법보다 더 좋은 이유가 있는지 잘 모르겠습니다.


속성의 장점은 XML 또는 JSOn으로 직렬화되지만 그 생각에 달려 있습니다.
Knerd

1
속성은 상태 정보를 나타내야합니다. 계산 여부는 중요하지 않습니다. 표현식에서 사용하기가 더 쉽습니다. HTML이 객체의 상태를 나타내는 지 여부 만 알 수 있습니다.
Reactgular

답변:


18

업데이트 :이 질문은 2014 년 5 월 내 블로그의 주제였습니다 . 좋은 질문 감사합니다!


Robert Harvey의 답변에 추가하려면 다음과 같이하십시오 .

  • 논리적으로 클래스 의 속성 , 색상 또는 연도 또는 모델을 말하는 방식은 자동차의 속성입니다.

  • 필드에서 가져 오는 것보다 계산 속도가 10 배 이상 느립니다.

  • 디버깅하는 동안 계산하지 않는 것이 있습니다. VS 디버거는 자동으로 속성을 계산합니다.

  • 실패 할 수 없습니다. Getter는 객체의 상태에 관계없이 항상 값을 반환해야합니다.

귀하의 제안 된 Html부동산 이 그 중 어느 것에도 해당 되지 않는다고 생각합니다 . 그것이 모두 맞지 않는 한 재산으로 만들지 마십시오 .


"실패 할 수 없습니다. Getter는 개체의 상태에 관계없이 항상 값을 반환해야합니다." 객체가 폐기 된 후 속성이 예외를 발생시키지 않아야합니까?
Stephen

6

ToHtml두 경우 모두 작성 했으므로 올바른 방법입니다. 공개적으로 공개하십시오.

Knerd는 다음과 같이 지적합니다. 속성을 직렬화 할 수 있습니다. HTML에서 직렬화를 해제하지 않으므로 해당 관점에서 속성을 만드는 것이별로 의미가 없습니다.

ORM 및 저장소 오브젝트의 작동 방식과 일치합니다. 레코드 또는 튜플의 필드는 특성으로 표시되지만 메소드를 사용하여 레코드 (또는 일부 형식 )를 검색합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.